| /* |
| std::array |
| */ |
| |
| %fragment("StdArrayTraits","header",fragment="StdSequenceTraits") |
| %{ |
| namespace swig { |
| template <class T, size_t N> |
| struct traits_asptr<std::array<T, N> > { |
| static int asptr(PyObject *obj, std::array<T, N> **vec) { |
| return traits_asptr_stdseq<std::array<T, N> >::asptr(obj, vec); |
| } |
| }; |
| |
| template <class T, size_t N> |
| struct traits_from<std::array<T, N> > { |
| static PyObject *from(const std::array<T, N>& vec) { |
| return traits_from_stdseq<std::array<T, N> >::from(vec); |
| } |
| }; |
| |
| template <class T, size_t N> |
| struct IteratorProtocol<std::array<T, N>, T> { |
| |
| static void assign(PyObject *obj, std::array<T, N> *seq) { |
| SwigVar_PyObject iter = PyObject_GetIter(obj); |
| if (iter) { |
| SwigVar_PyObject item = PyIter_Next(iter); |
| size_t count = 0; |
| typename std::array<T, N>::iterator array_iter = seq->begin(); |
| while (item && (count < N)) { |
| ++count; |
| *array_iter++ = swig::as<T>(item); |
| item = PyIter_Next(iter); |
| } |
| if (count != N || item) |
| throw std::invalid_argument("std::array size does not match source container size"); |
| } |
| } |
| |
| static bool check(PyObject *obj) { |
| bool ret = false; |
| SwigVar_PyObject iter = PyObject_GetIter(obj); |
| if (iter) { |
| SwigVar_PyObject item = PyIter_Next(iter); |
| size_t count = 0; |
| ret = true; |
| while (item && (count < N)) { |
| ++count; |
| ret = swig::check<T>(item); |
| item = ret ? PyIter_Next(iter) : 0; |
| } |
| if (count != N || item) |
| ret = false; |
| } |
| return ret; |
| } |
| }; |
| |
| template <class T, size_t N> |
| inline void |
| erase(std::array<T, N>* SWIGUNUSEDPARM(seq), const typename std::array<T, N>::iterator& SWIGUNUSEDPARM(position)) { |
| throw std::invalid_argument("std::array object does not support item deletion"); |
| } |
| |
| // Only limited slicing is supported as std::array is fixed in size |
| template <class T, size_t N, class Difference> |
| inline std::array<T, N>* |
| getslice(const std::array<T, N>* self, Difference i, Difference j, Py_ssize_t step) { |
| typedef std::array<T, N> Sequence; |
| typename Sequence::size_type size = self->size(); |
| Difference ii = 0; |
| Difference jj = 0; |
| swig::slice_adjust(i, j, step, size, ii, jj); |
| |
| if (step == 1 && ii == 0 && static_cast<typename Sequence::size_type>(jj) == size) { |
| Sequence *sequence = new Sequence(); |
| std::copy(self->begin(), self->end(), sequence->begin()); |
| return sequence; |
| } else if (step == -1 && static_cast<typename Sequence::size_type>(ii) == (size - 1) && jj == -1) { |
| Sequence *sequence = new Sequence(); |
| std::copy(self->rbegin(), self->rend(), sequence->begin()); |
| return sequence; |
| } else { |
| throw std::invalid_argument("std::array object only supports getting a slice that is the size of the array"); |
| } |
| } |
| |
| template <class T, size_t N, class Difference, class InputSeq> |
| inline void |
| setslice(std::array<T, N>* self, Difference i, Difference j, Py_ssize_t step, const InputSeq& is = InputSeq()) { |
| typedef std::array<T, N> Sequence; |
| typename Sequence::size_type size = self->size(); |
| Difference ii = 0; |
| Difference jj = 0; |
| swig::slice_adjust(i, j, step, size, ii, jj, true); |
| |
| if (step == 1 && ii == 0 && static_cast<typename Sequence::size_type>(jj) == size) { |
| std::copy(is.begin(), is.end(), self->begin()); |
| } else if (step == -1 && static_cast<typename Sequence::size_type>(ii) == (size - 1) && jj == -1) { |
| std::copy(is.rbegin(), is.rend(), self->begin()); |
| } else { |
| throw std::invalid_argument("std::array object only supports setting a slice that is the size of the array"); |
| } |
| } |
| |
| template <class T, size_t N, class Difference> |
| inline void |
| delslice(std::array<T, N>* SWIGUNUSEDPARM(self), Difference SWIGUNUSEDPARM(i), Difference SWIGUNUSEDPARM(j), Py_ssize_t SWIGUNUSEDPARM(step)) { |
| throw std::invalid_argument("std::array object does not support item deletion"); |
| } |
| } |
| %} |
| |
| #define %swig_array_methods(Type...) %swig_sequence_methods_non_resizable(Type) |
| #define %swig_array_methods_val(Type...) %swig_sequence_methods_non_resizable_val(Type); |
| |
| %include <std/std_array.i> |
| |