#ifndef PYTHONIC_NUMPY_INSERT_HPP #define PYTHONIC_NUMPY_INSERT_HPP #include "pythonic/include/numpy/insert.hpp" #include "pythonic/utils/functor.hpp" #include "pythonic/types/ndarray.hpp" #include "pythonic/types/traits.hpp" #include "pythonic/builtins/None.hpp" #include PYTHONIC_NS_BEGIN namespace numpy { template typename std::enable_if::value && types::is_iterable::value, types::ndarray>>::type insert(types::ndarray in, I const &indices, F const &data, types::none_type axis) { types::ndarray> out( types::pshape(long( in.flat_size() + std::min(indices.flat_size(), data.flat_size()))), builtins::None); auto out_iter = out.fbegin(); auto in_iter = in.fbegin(); auto data_iter = data.begin(); for (long index : indices) { out_iter = std::copy(in_iter, in.fbegin() + index, out_iter); *out_iter++ = *data_iter++; in_iter = in.fbegin() + index; } std::copy(in_iter, in.fend(), out_iter); return out; } template typename std::enable_if::value && !types::is_iterable::value, types::ndarray>>::type insert(types::ndarray in, I const &indices, F const &data, types::none_type axis) { return insert(in, indices, types::list({data}), axis); } template typename std::enable_if::value && types::is_iterable::value, types::ndarray>>::type insert(types::ndarray in, I const &indices, F const &data, types::none_type axis) { return insert(in, types::list({indices}), {data}, axis); } template typename std::enable_if::value && !types::is_iterable::value, types::ndarray>>::type insert(types::ndarray in, I const &indices, F const &data, types::none_type axis) { return insert(in, types::list({indices}), types::list({data}), axis); } template E insert(E, Args const &...) { throw std::runtime_error("insert only partially supported"); } } PYTHONIC_NS_END #endif