| %{ |
| #include <algorithm> |
| %} |
| |
| // |
| // std::carray - is really an extension to the 'std' namespace. |
| // |
| // A simple fix C array wrapper, more or less as presented in |
| // |
| // "The C++ Standarf Library", by Nicolai M. Josuttis |
| // |
| // which is also derived from the example in |
| // |
| // "The C++ Programming Language", by Bjarne Stroustup. |
| // |
| |
| %inline %{ |
| namespace std { |
| template <class _Type, size_t _Size> |
| class carray |
| { |
| public: |
| typedef _Type value_type; |
| typedef size_t size_type; |
| |
| typedef _Type * iterator; |
| typedef const _Type * const_iterator; |
| |
| carray() { } |
| |
| carray(const carray& c) { |
| std::copy(c.v, c.v + size(), v); |
| } |
| |
| template <class _Iterator> |
| carray(_Iterator first, _Iterator last) { |
| assign(first, last); |
| } |
| |
| iterator begin() { return v; } |
| iterator end() { return v + _Size; } |
| |
| const_iterator begin() const { return v; } |
| const_iterator end() const { return v + _Size; } |
| |
| _Type& operator[](size_t i) { return v[i]; } |
| const _Type& operator[](size_t i) const { return v[i]; } |
| |
| static size_t size() { return _Size; } |
| |
| template <class _Iterator> |
| void assign(_Iterator first, _Iterator last) { |
| if (std::distance(first,last) == size()) { |
| std::copy(first, last, v); |
| } else { |
| throw std::length_error("bad range length"); |
| } |
| } |
| |
| private: |
| _Type v[_Size]; |
| }; |
| } |
| %} |