ossrv_pub/boost_apis/boost/python/numeric.hpp
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 // Copyright David Abrahams 2002.
       
     2 // Distributed under the Boost Software License, Version 1.0. (See
       
     3 // accompanying file LICENSE_1_0.txt or copy at
       
     4 // http://www.boost.org/LICENSE_1_0.txt)
       
     5 #ifndef NUMARRAY_DWA2002922_HPP
       
     6 # define NUMARRAY_DWA2002922_HPP
       
     7 
       
     8 # include <boost/python/detail/prefix.hpp>
       
     9 
       
    10 # include <boost/python/tuple.hpp>
       
    11 # include <boost/python/str.hpp>
       
    12 # include <boost/preprocessor/iteration/local.hpp>
       
    13 # include <boost/preprocessor/cat.hpp>
       
    14 # include <boost/preprocessor/repetition/enum.hpp>
       
    15 # include <boost/preprocessor/repetition/enum_params.hpp>
       
    16 # include <boost/preprocessor/repetition/enum_binary_params.hpp>
       
    17 
       
    18 namespace boost { namespace python { namespace numeric {
       
    19 
       
    20 class array;
       
    21 
       
    22 namespace aux
       
    23 {
       
    24   struct BOOST_PYTHON_DECL array_base : object
       
    25   {
       
    26 # define BOOST_PP_LOCAL_MACRO(n)                                \
       
    27       array_base(BOOST_PP_ENUM_PARAMS_Z(1, n, object const& x));
       
    28 # define BOOST_PP_LOCAL_LIMITS (1, 7)
       
    29 # include BOOST_PP_LOCAL_ITERATE()
       
    30 
       
    31       object argmax(long axis=-1);
       
    32       object argmin(long axis=-1);
       
    33       object argsort(long axis=-1);
       
    34       object astype(object const& type = object());
       
    35       void byteswap();
       
    36       object copy() const;
       
    37       object diagonal(long offset = 0, long axis1 = 0, long axis2 = 1) const;
       
    38       void info() const;
       
    39       bool is_c_array() const;
       
    40       bool isbyteswapped() const;
       
    41       array new_(object type) const;
       
    42       void sort();
       
    43       object trace(long offset = 0, long axis1 = 0, long axis2 = 1) const;
       
    44       object type() const;
       
    45       char typecode() const;
       
    46 
       
    47       object factory(
       
    48           object const& sequence = object()
       
    49         , object const& typecode = object()
       
    50         , bool copy = true
       
    51         , bool savespace = false
       
    52         , object type = object()
       
    53         , object shape = object());
       
    54 
       
    55       object getflat() const;
       
    56       long getrank() const;
       
    57       object getshape() const;
       
    58       bool isaligned() const;
       
    59       bool iscontiguous() const;
       
    60       long itemsize() const;
       
    61       long nelements() const;
       
    62       object nonzero() const;
       
    63    
       
    64       void put(object const& indices, object const& values);
       
    65    
       
    66       void ravel();
       
    67    
       
    68       object repeat(object const& repeats, long axis=0);
       
    69    
       
    70       void resize(object const& shape);
       
    71       
       
    72       void setflat(object const& flat);
       
    73       void setshape(object const& shape);
       
    74    
       
    75       void swapaxes(long axis1, long axis2);
       
    76    
       
    77       object take(object const& sequence, long axis = 0) const;
       
    78    
       
    79       void tofile(object const& file) const;
       
    80    
       
    81       str tostring() const;
       
    82    
       
    83       void transpose(object const& axes = object());
       
    84    
       
    85       object view() const;
       
    86 
       
    87    public: // implementation detail - do not touch.
       
    88       BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(array_base, object);
       
    89   };
       
    90 
       
    91   struct BOOST_PYTHON_DECL array_object_manager_traits
       
    92   {
       
    93       static bool check(PyObject* obj);
       
    94       static detail::new_non_null_reference adopt(PyObject* obj);
       
    95   };
       
    96 } // namespace aux
       
    97 
       
    98 class array : public aux::array_base
       
    99 {
       
   100     typedef aux::array_base base;
       
   101  public:
       
   102 
       
   103     object astype() { return base::astype(); }
       
   104     
       
   105     template <class Type>
       
   106     object astype(Type const& type_)
       
   107     {
       
   108         return base::astype(object(type_));
       
   109     }
       
   110 
       
   111     template <class Type>
       
   112     array new_(Type const& type_) const
       
   113     {
       
   114         return base::new_(object(type_));
       
   115     }
       
   116 
       
   117     template <class Sequence>
       
   118     void resize(Sequence const& x)
       
   119     {
       
   120         base::resize(object(x));
       
   121     }
       
   122     
       
   123 # define BOOST_PP_LOCAL_MACRO(n)                                \
       
   124       void resize(BOOST_PP_ENUM_PARAMS_Z(1, n, long x))              \
       
   125       {                                                         \
       
   126           resize(make_tuple(BOOST_PP_ENUM_PARAMS_Z(1, n, x)));       \
       
   127       }
       
   128 # define BOOST_PP_LOCAL_LIMITS (1, BOOST_PYTHON_MAX_ARITY)
       
   129 # include BOOST_PP_LOCAL_ITERATE()
       
   130 
       
   131     template <class Sequence>
       
   132     void setshape(Sequence const& x)
       
   133     {
       
   134         base::setshape(object(x));
       
   135     }
       
   136     
       
   137 # define BOOST_PP_LOCAL_MACRO(n)                                \
       
   138     void setshape(BOOST_PP_ENUM_PARAMS_Z(1, n, long x))              \
       
   139     {                                                           \
       
   140         setshape(make_tuple(BOOST_PP_ENUM_PARAMS_Z(1, n, x)));       \
       
   141     }
       
   142 # define BOOST_PP_LOCAL_LIMITS (1, BOOST_PYTHON_MAX_ARITY)
       
   143 # include BOOST_PP_LOCAL_ITERATE()
       
   144 
       
   145     template <class Indices, class Values>
       
   146     void put(Indices const& indices, Values const& values)
       
   147     {
       
   148         base::put(object(indices), object(values));
       
   149     }
       
   150     
       
   151     template <class Sequence>
       
   152     object take(Sequence const& sequence, long axis = 0)
       
   153     {
       
   154         return base::take(object(sequence), axis);
       
   155     }
       
   156 
       
   157     template <class File>
       
   158     void tofile(File const& f) const
       
   159     {
       
   160         base::tofile(object(f));
       
   161     }
       
   162 
       
   163     object factory()
       
   164     {
       
   165         return base::factory();
       
   166     }
       
   167     
       
   168     template <class Sequence>
       
   169     object factory(Sequence const& sequence)
       
   170     {
       
   171         return base::factory(object(sequence));
       
   172     }
       
   173     
       
   174     template <class Sequence, class Typecode>
       
   175     object factory(
       
   176         Sequence const& sequence
       
   177       , Typecode const& typecode_
       
   178       , bool copy = true
       
   179       , bool savespace = false
       
   180     )
       
   181     {
       
   182         return base::factory(object(sequence), object(typecode_), copy, savespace);
       
   183     }
       
   184 
       
   185     template <class Sequence, class Typecode, class Type>
       
   186     object factory(
       
   187         Sequence const& sequence
       
   188       , Typecode const& typecode_
       
   189       , bool copy
       
   190       , bool savespace
       
   191       , Type const& type
       
   192     )
       
   193     {
       
   194         return base::factory(object(sequence), object(typecode_), copy, savespace, object(type));
       
   195     }
       
   196     
       
   197     template <class Sequence, class Typecode, class Type, class Shape>
       
   198     object factory(
       
   199         Sequence const& sequence
       
   200       , Typecode const& typecode_
       
   201       , bool copy
       
   202       , bool savespace
       
   203       , Type const& type
       
   204       , Shape const& shape
       
   205     )
       
   206     {
       
   207         return base::factory(object(sequence), object(typecode_), copy, savespace, object(type), object(shape));
       
   208     }
       
   209     
       
   210 # define BOOST_PYTHON_ENUM_AS_OBJECT(z, n, x) object(BOOST_PP_CAT(x,n))
       
   211 # define BOOST_PP_LOCAL_MACRO(n)                                        \
       
   212     template <BOOST_PP_ENUM_PARAMS_Z(1, n, class T)>                    \
       
   213     explicit array(BOOST_PP_ENUM_BINARY_PARAMS_Z(1, n, T, const& x))    \
       
   214     : base(BOOST_PP_ENUM_1(n, BOOST_PYTHON_ENUM_AS_OBJECT, x))          \
       
   215     {}
       
   216 # define BOOST_PP_LOCAL_LIMITS (1, 7)
       
   217 # include BOOST_PP_LOCAL_ITERATE()
       
   218 # undef BOOST_PYTHON_AS_OBJECT
       
   219 
       
   220     static BOOST_PYTHON_DECL void set_module_and_type(char const* package_name = 0, char const* type_attribute_name = 0);
       
   221     static BOOST_PYTHON_DECL std::string get_module_name();
       
   222 
       
   223  public: // implementation detail -- for internal use only
       
   224     BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(array, base);
       
   225 };
       
   226 
       
   227 } // namespace boost::python::numeric
       
   228 
       
   229 namespace converter
       
   230 {
       
   231   template <>
       
   232   struct object_manager_traits< numeric::array >
       
   233       : numeric::aux::array_object_manager_traits
       
   234   {
       
   235       BOOST_STATIC_CONSTANT(bool, is_specialized = true);
       
   236   };
       
   237 }
       
   238 
       
   239 }} // namespace boost::python
       
   240 
       
   241 #endif // NUMARRAY_DWA2002922_HPP