diff options
-rw-r--r-- | include/gras/io_signature.hpp | 52 | ||||
-rw-r--r-- | include/gras/io_signature.i | 12 |
2 files changed, 48 insertions, 16 deletions
diff --git a/include/gras/io_signature.hpp b/include/gras/io_signature.hpp index 03902ea..cdc4f62 100644 --- a/include/gras/io_signature.hpp +++ b/include/gras/io_signature.hpp @@ -5,6 +5,7 @@ #include <vector> #include <stdexcept> +#include <cstdlib> namespace gras { @@ -15,17 +16,25 @@ namespace gras * Properties are a maximum and minimum number of ports, * and an item size in bytes for each port. */ -struct IOSignature : std::vector<int> +struct IOSignature : std::vector<size_t> { - static const int IO_INFINITE = -1; + static const int IO_INFINITE = ~0; - //! Create an empty signature with infinite IO + //! Create an empty signature IOSignature(void) { this->set_min_streams(IO_INFINITE); this->set_max_streams(IO_INFINITE); } + //! Create a signature with a single item size + IOSignature(const size_t size) + { + this->push_back(size); + this->set_min_streams(IO_INFINITE); + this->set_max_streams(IO_INFINITE); + } + //! Create a signature with the specified min and max streams IOSignature(const int min_streams, const int max_streams) { @@ -38,14 +47,14 @@ struct IOSignature : std::vector<int> } //! Create a signature from a vector of IO widths - IOSignature(const std::vector<int> &sig) + IOSignature(const std::vector<size_t> &sig) { this->assign(sig.begin(), sig.end()); - this->set_min_streams(this->size()); - this->set_max_streams(this->size()); + this->set_min_streams(IO_INFINITE); + this->set_max_streams(IO_INFINITE); } - //! Construct from pointer for backwards compatible shared_ptr usage. + //! Construct from posize_ter for backwards compatible shared_ptr usage. IOSignature(const IOSignature *sig) { *this = *sig; @@ -63,6 +72,24 @@ struct IOSignature : std::vector<int> return this; }; + const size_t &at(const size_t index) const + { + if (this->empty()) + { + throw std::invalid_argument("io signature fail: indexing empty vector"); + } + if (this->size() > index) + { + return std::vector<size_t>::at(index); + } + return this->back(); + } + + const size_t &operator[](const size_t index) const + { + return this->at(index); + } + void set_min_streams(const int val) { _min_streams = val; @@ -83,17 +110,12 @@ struct IOSignature : std::vector<int> return _max_streams; } - int sizeof_stream_item(const int index) const + int sizeof_stream_item(const size_t index) const { - if (this->empty()) return 0; - if (this->size() > unsigned(index)) - { - return this->at(index); - } - return this->back(); + return this->at(index); } - std::vector<int> sizeof_stream_items(void) const + const std::vector<size_t> &sizeof_stream_items(void) const { return *this; } diff --git a/include/gras/io_signature.i b/include/gras/io_signature.i index 1f41cc0..563dc2b 100644 --- a/include/gras/io_signature.i +++ b/include/gras/io_signature.i @@ -11,8 +11,18 @@ %ignore gras::IOSignature::operator->() const; %include <std_vector.i> -%template () std::vector<int>; +%template () std::vector<size_t>; + +%ignore gras::IOSignature::operator[]; //ignore warnings about %extend %include <gras/io_signature.hpp> +%extend gras::IOSignature +{ + const size_t &__getitem__(const size_t index) + { + return ($self)->at(index); + } +} + #endif /*INCLUDED_GRAS_IO_SIGNATURE_I*/ |