#ifndef PYTHONIC_INCLUDE_NUMPY_TRANSPOSE_HPP #define PYTHONIC_INCLUDE_NUMPY_TRANSPOSE_HPP #include "pythonic/include/utils/functor.hpp" #include "pythonic/include/utils/numpy_conversion.hpp" #include "pythonic/include/utils/nested_container.hpp" #include "pythonic/include/types/ndarray.hpp" #include "pythonic/include/types/numpy_expr.hpp" PYTHONIC_NS_BEGIN namespace numpy { template E transpose(types::numpy_texpr const &arr) { return arr.arg; } template typename std::enable_if>::type transpose(E const &arr) { return {arr}; } template typename std::enable_if::type transpose(E const &arr) { return arr; } template typename std::enable_if< (std::tuple_size::value > 2), types::ndarray::value>>>::type transpose(types::ndarray const &a); template types::ndarray::value>> transpose(types::ndarray const &a, types::array const &t); template types::ndarray> transpose(types::ndarray const &a, long index, Args const &... indices) { return transpose( a, types::array{{index, (long)indices...}}); } template auto _transpose(types::numpy_expr const &expr, utils::index_sequence) -> decltype(Op{}(transpose(std::get(expr.args)...))) { return Op{}(transpose(std::get(expr.args)...)); } template auto transpose(types::numpy_expr const &expr) -> decltype(_transpose(expr, utils::make_index_sequence())) { return _transpose(expr, utils::make_index_sequence()); } template auto transpose(E const &expr) -> typename std::enable_if< (E::value > 2), decltype(transpose(types::ndarray{ expr}))>::type { return transpose( types::ndarray{expr}); } DEFINE_FUNCTOR(pythonic::numpy, transpose); } PYTHONIC_NS_END #endif