| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #ifndef __CXX_Objects__h |
| | #define __CXX_Objects__h |
| |
|
| | #include "CXX/WrapPython.h" |
| | #include "CXX/Version.hxx" |
| | #include "CXX/Config.hxx" |
| | #include "CXX/Exception.hxx" |
| |
|
| | #include <iostream> |
| | #include STR_STREAM |
| | #include <string> |
| | #include <iterator> |
| | #include <utility> |
| | #include <typeinfo> |
| | #include <algorithm> |
| |
|
| |
|
| | namespace Py |
| | { |
| | typedef Py_ssize_t sequence_index_type; |
| |
|
| | |
| | class Object; |
| | class Type; |
| | template<TEMPLATE_TYPENAME T> class SeqBase; |
| | class String; |
| | class List; |
| | template<TEMPLATE_TYPENAME T> class MapBase; |
| | class Tuple; |
| | class Dict; |
| |
|
| | |
| | inline PyObject* new_reference_to(PyObject* p) |
| | { |
| | Py::_XINCREF(p); |
| | return p; |
| | } |
| |
|
| | |
| | |
| | inline PyObject* Null() |
| | { |
| | return (static_cast<PyObject*>(0)); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| |
|
| | class PYCXX_EXPORT Object |
| | { |
| | private: |
| | |
| | |
| | |
| | |
| | |
| | PyObject* p; |
| |
|
| | protected: |
| |
|
| | void set (PyObject* pyob, bool owned = false) |
| | { |
| | release(); |
| | p = pyob; |
| | if (!owned) |
| | { |
| | Py::_XINCREF (p); |
| | } |
| | validate(); |
| | } |
| |
|
| | void release () |
| | { |
| | Py::_XDECREF (p); |
| | p = 0; |
| | } |
| |
|
| | void validate(); |
| |
|
| | public: |
| | |
| | explicit Object (PyObject* pyob=Py::_None(), bool owned = false) |
| | : p(pyob) |
| | { |
| | if(!owned) |
| | { |
| | Py::_XINCREF (p); |
| | } |
| | validate(); |
| | } |
| |
|
| | |
| | Object (const Object& ob) |
| | : p(ob.p) |
| | { |
| | Py::_XINCREF (p); |
| | validate(); |
| | } |
| |
|
| | |
| | Object& operator= (const Object& rhs) |
| | { |
| | set(rhs.p); |
| | return *this; |
| | } |
| |
|
| | Object& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set (rhsp); |
| | return *this; |
| | } |
| |
|
| | |
| | virtual ~Object () |
| | { |
| | release (); |
| | } |
| |
|
| | |
| | PyObject* operator* () const |
| | { |
| | return p; |
| | } |
| |
|
| | |
| | void increment_reference_count() |
| | { |
| | Py::_XINCREF(p); |
| | } |
| |
|
| | void decrement_reference_count() |
| | { |
| | |
| | if(reference_count() == 1) |
| | throw RuntimeError("Object::decrement_reference_count error."); |
| | Py::_XDECREF(p); |
| | } |
| |
|
| | |
| | PyObject* ptr () const |
| | { |
| | return p; |
| | } |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return (pyob != 0); |
| | } |
| |
|
| | Py_ssize_t reference_count () const |
| | { |
| | return p ? p->ob_refcnt : 0; |
| | } |
| |
|
| | Type type () const; |
| |
|
| | String str () const; |
| |
|
| | std::string as_string() const; |
| |
|
| | String repr () const; |
| |
|
| | List dir () const; |
| |
|
| | bool hasAttr (const std::string& s) const |
| | { |
| | return PyObject_HasAttrString (p, const_cast<char*>(s.c_str())) ? true: false; |
| | } |
| |
|
| | Object getAttr (const std::string& s) const |
| | { |
| | return Object (PyObject_GetAttrString (p, const_cast<char*>(s.c_str())), true); |
| | } |
| |
|
| | Object callMemberFunction( const std::string &function_name ) const; |
| | Object callMemberFunction( const std::string &function_name, const Tuple &args ) const; |
| | Object callMemberFunction( const std::string &function_name, const Tuple &args, const Dict &kw ) const; |
| |
|
| | Object getItem (const Object& key) const |
| | { |
| | return Object (PyObject_GetItem(p, *key), true); |
| | } |
| |
|
| | long hashValue () const |
| | { |
| | return PyObject_Hash (p); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | bool is(PyObject *pother) const |
| | { |
| | return p == pother; |
| | } |
| |
|
| | bool is(const Object& other) const |
| | { |
| | return p == other.p; |
| | } |
| |
|
| | bool isNull() const |
| | { |
| | return p == NULL; |
| | } |
| |
|
| | bool isNone() const |
| | { |
| | return p == _None(); |
| | } |
| |
|
| | bool isCallable () const |
| | { |
| | return PyCallable_Check (p) != 0; |
| | } |
| |
|
| | bool isInstance () const |
| | { |
| | return PyInstance_Check (p) != 0; |
| | } |
| |
|
| | bool isDict () const |
| | { |
| | return Py::_Dict_Check (p); |
| | } |
| |
|
| | bool isList () const |
| | { |
| | return Py::_List_Check (p); |
| | } |
| |
|
| | bool isMapping () const |
| | { |
| | return PyMapping_Check (p) != 0; |
| | } |
| |
|
| | bool isNumeric () const |
| | { |
| | return PyNumber_Check (p) != 0; |
| | } |
| |
|
| | bool isSequence () const |
| | { |
| | return PySequence_Check (p) != 0; |
| | } |
| |
|
| | bool isTrue () const |
| | { |
| | return PyObject_IsTrue (p) != 0; |
| | } |
| |
|
| | bool isType (const Type& t) const; |
| |
|
| | bool isTuple() const |
| | { |
| | return Py::_Tuple_Check(p); |
| | } |
| |
|
| | bool isString() const |
| | { |
| | return Py::_String_Check(p) || Py::_Unicode_Check(p); |
| | } |
| |
|
| | bool isUnicode() const |
| | { |
| | return Py::_Unicode_Check( p ); |
| | } |
| |
|
| | bool isBoolean() const |
| | { |
| | return Py::_Boolean_Check( p ); |
| | } |
| |
|
| | |
| | void setAttr (const std::string& s, const Object& value) |
| | { |
| | if(PyObject_SetAttrString (p, const_cast<char*>(s.c_str()), *value) == -1) |
| | throw AttributeError ("setAttr failed."); |
| | } |
| |
|
| | void delAttr (const std::string& s) |
| | { |
| | if(PyObject_DelAttrString (p, const_cast<char*>(s.c_str())) == -1) |
| | throw AttributeError ("delAttr failed."); |
| | } |
| |
|
| | |
| | |
| |
|
| | void delItem (const Object& key) |
| | { |
| | if(PyObject_DelItem(p, *key) == -1) |
| | |
| | throw KeyError("delItem failed."); |
| | } |
| |
|
| | |
| |
|
| | bool operator==(const Object& o2) const |
| | { |
| | int k = PyObject_RichCompareBool (p, *o2, Py_EQ); |
| | if (PyErr_Occurred()) throw Exception(); |
| | return k != 0; |
| | } |
| |
|
| | bool operator!=(const Object& o2) const |
| | { |
| | int k = PyObject_RichCompareBool (p, *o2, Py_NE); |
| | if (PyErr_Occurred()) throw Exception(); |
| | return k != 0; |
| |
|
| | } |
| |
|
| | bool operator>=(const Object& o2) const |
| | { |
| | int k = PyObject_RichCompareBool (p, *o2, Py_GE); |
| | if (PyErr_Occurred()) throw Exception(); |
| | return k != 0; |
| | } |
| |
|
| | bool operator<=(const Object& o2) const |
| | { |
| | int k = PyObject_RichCompareBool (p, *o2, Py_LE); |
| | if (PyErr_Occurred()) throw Exception(); |
| | return k != 0; |
| | } |
| |
|
| | bool operator<(const Object& o2) const |
| | { |
| | int k = PyObject_RichCompareBool (p, *o2, Py_LT); |
| | if (PyErr_Occurred()) throw Exception(); |
| | return k != 0; |
| | } |
| |
|
| | bool operator>(const Object& o2) const |
| | { |
| | int k = PyObject_RichCompareBool (p, *o2, Py_GT); |
| | if (PyErr_Occurred()) throw Exception(); |
| | return k != 0; |
| | } |
| | }; |
| | |
| | inline PyObject* new_reference_to(const Object& g) |
| | { |
| | PyObject* p = g.ptr(); |
| | Py::_XINCREF(p); |
| | return p; |
| | } |
| |
|
| | |
| | |
| | inline Object Nothing() |
| | { |
| | return Object(Py::_None()); |
| | } |
| |
|
| | |
| | inline Object None() |
| | { |
| | return Object(Py::_None()); |
| | } |
| |
|
| | |
| | inline Object False() |
| | { |
| | return Object(Py::_False()); |
| | } |
| |
|
| | inline Object True() |
| | { |
| | return Object(Py::_True()); |
| | } |
| |
|
| | |
| | #ifndef CXX_NO_IOSTREAMS |
| | PYCXX_EXPORT std::ostream& operator<< (std::ostream& os, const Object& ob); |
| | #endif |
| |
|
| | |
| | class PYCXX_EXPORT Type: public Object |
| | { |
| | public: |
| | explicit Type (PyObject* pyob, bool owned = false): Object(pyob, owned) |
| | { |
| | validate(); |
| | } |
| |
|
| | Type (const Object& ob): Object(*ob) |
| | { |
| | validate(); |
| | } |
| |
|
| | Type(const Type& t): Object(t) |
| | { |
| | validate(); |
| | } |
| |
|
| | Type& operator= (const Object& rhs) |
| | { |
| | return (*this = *rhs); |
| | } |
| |
|
| | Type& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set (rhsp); |
| | return *this; |
| | } |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && Py::_Type_Check (pyob); |
| | } |
| | }; |
| |
|
| |
|
| | |
| | |
| | |
| | inline Object asObject (PyObject *p) |
| | { |
| | return Object(p, true); |
| | } |
| |
|
| | |
| | |
| | class PYCXX_EXPORT Boolean: public Object |
| | { |
| | public: |
| | |
| | Boolean (PyObject *pyob, bool owned = false) |
| | : Object (pyob, owned) |
| | { |
| | validate(); |
| | } |
| |
|
| | Boolean (const Boolean& ob): Object(*ob) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | Boolean (bool v=false) |
| | { |
| | set(PyBool_FromLong(v ? 1 : 0), true); |
| | validate(); |
| | } |
| |
|
| | explicit Boolean (const Object& ob) |
| | : Object( *ob ) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| |
|
| | Boolean& operator= (const Object& rhs) |
| | { |
| | return (*this = *rhs); |
| | } |
| |
|
| | Boolean& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set (rhsp); |
| | return *this; |
| | } |
| |
|
| | |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && PyObject_IsTrue(pyob) != -1; |
| | } |
| |
|
| | |
| | operator bool() const |
| | { |
| | return PyObject_IsTrue (ptr()) != 0; |
| | } |
| |
|
| | Boolean& operator= (bool v) |
| | { |
| | set (PyBool_FromLong (v ? 1 : 0), true); |
| | return *this; |
| | } |
| | }; |
| |
|
| | |
| | |
| | class PYCXX_EXPORT Int: public Object |
| | { |
| | public: |
| | |
| | Int (PyObject *pyob, bool owned = false): Object (pyob, owned) |
| | { |
| | validate(); |
| | } |
| |
|
| | Int (const Int& ob): Object(*ob) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | Int (long v = 0L): Object(PyInt_FromLong(v), true) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | Int (int v) |
| | { |
| | long w = v; |
| | set(PyInt_FromLong(w), true); |
| | validate(); |
| | } |
| |
|
| | |
| | Int (bool v) |
| | { |
| | long w = v ? 1 : 0; |
| | set(PyInt_FromLong(w), true); |
| | validate(); |
| | } |
| |
|
| | explicit Int (const Object& ob) |
| | { |
| | set(PyNumber_Int(*ob), true); |
| | validate(); |
| | } |
| |
|
| | |
| |
|
| | Int& operator= (const Object& rhs) |
| | { |
| | return (*this = *rhs); |
| | } |
| |
|
| | Int& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set (PyNumber_Int(rhsp), true); |
| | return *this; |
| | } |
| |
|
| | |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && Py::_Int_Check (pyob); |
| | } |
| |
|
| | |
| | operator long() const |
| | { |
| | return PyInt_AsLong (ptr()); |
| | } |
| |
|
| | #ifdef HAVE_LONG_LONG |
| | |
| | PY_LONG_LONG asLongLong() const |
| | { |
| | return PyLong_AsLongLong (ptr()); |
| | } |
| | |
| | unsigned PY_LONG_LONG asUnsignedLongLong() const |
| | { |
| | return PyLong_AsUnsignedLongLong (ptr()); |
| | } |
| | #endif |
| |
|
| | |
| | Int& operator= (int v) |
| | { |
| | set (PyInt_FromLong (long(v)), true); |
| | return *this; |
| | } |
| |
|
| | |
| | Int& operator= (long v) |
| | { |
| | set (PyInt_FromLong (v), true); |
| | return *this; |
| | } |
| |
|
| | #ifdef HAVE_LONG_LONG |
| | |
| | Int& operator= (PY_LONG_LONG v) |
| | { |
| | set (PyLong_FromLongLong (v), true); |
| | return *this; |
| | } |
| | |
| | Int& operator= (unsigned PY_LONG_LONG v) |
| | { |
| | set (PyLong_FromUnsignedLongLong (v), true); |
| | return *this; |
| | } |
| | #endif |
| | }; |
| |
|
| | |
| | |
| | class PYCXX_EXPORT Long: public Object |
| | { |
| | public: |
| | |
| | explicit Long (PyObject *pyob, bool owned = false): Object (pyob, owned) |
| | { |
| | validate(); |
| | } |
| |
|
| | Long (const Long& ob): Object(ob.ptr()) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | explicit Long (long v = 0L) |
| | : Object(PyLong_FromLong(v), true) |
| | { |
| | validate(); |
| | } |
| | |
| | explicit Long (unsigned long v) |
| | : Object(PyLong_FromUnsignedLong(v), true) |
| | { |
| | validate(); |
| | } |
| | |
| | explicit Long (int v) |
| | : Object(PyLong_FromLong(static_cast<long>(v)), true) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | Long (const Object& ob) |
| | : Object(PyNumber_Long(*ob), true) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| |
|
| | Long& operator= (const Object& rhs) |
| | { |
| | return (*this = *rhs); |
| | } |
| |
|
| | Long& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set (PyNumber_Long(rhsp), true); |
| | return *this; |
| | } |
| | |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && Py::_Long_Check (pyob); |
| | } |
| |
|
| | |
| | long as_long() const |
| | { |
| | return PyLong_AsLong( ptr() ); |
| | } |
| |
|
| | |
| | operator long() const |
| | { |
| | return as_long(); |
| | } |
| |
|
| | |
| | operator unsigned long() const |
| | { |
| | return PyLong_AsUnsignedLong (ptr()); |
| | } |
| | operator double() const |
| | { |
| | return PyLong_AsDouble (ptr()); |
| | } |
| | |
| | Long& operator= (int v) |
| | { |
| | set(PyLong_FromLong (long(v)), true); |
| | return *this; |
| | } |
| | |
| | Long& operator= (long v) |
| | { |
| | set(PyLong_FromLong (v), true); |
| | return *this; |
| | } |
| | |
| | Long& operator= (unsigned long v) |
| | { |
| | set(PyLong_FromUnsignedLong (v), true); |
| | return *this; |
| | } |
| | }; |
| |
|
| | #ifdef HAVE_LONG_LONG |
| | |
| | |
| | class PYCXX_EXPORT LongLong: public Object |
| | { |
| | public: |
| | |
| | explicit LongLong (PyObject *pyob, bool owned = false): Object (pyob, owned) |
| | { |
| | validate(); |
| | } |
| |
|
| | LongLong (const LongLong& ob): Object(ob.ptr()) |
| | { |
| | validate(); |
| | } |
| | |
| | explicit LongLong (PY_LONG_LONG v = 0L) |
| | : Object(PyLong_FromLongLong(v), true) |
| | { |
| | validate(); |
| | } |
| | |
| | explicit LongLong (unsigned PY_LONG_LONG v) |
| | : Object(PyLong_FromUnsignedLongLong(v), true) |
| | { |
| | validate(); |
| | } |
| | |
| | explicit LongLong (long v) |
| | : Object(PyLong_FromLongLong(v), true) |
| | { |
| | validate(); |
| | } |
| | |
| | explicit LongLong (unsigned long v) |
| | : Object(PyLong_FromUnsignedLongLong(v), true) |
| | { |
| | validate(); |
| | } |
| | |
| | explicit LongLong (int v) |
| | : Object(PyLong_FromLongLong(static_cast<PY_LONG_LONG>(v)), true) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | LongLong (const Object& ob) |
| | : Object(PyNumber_Long(*ob), true) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| |
|
| | LongLong& operator= (const Object& rhs) |
| | { |
| | return (*this = *rhs); |
| | } |
| |
|
| | LongLong& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set (PyNumber_Long(rhsp), true); |
| | return *this; |
| | } |
| | |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && Py::_Long_Check (pyob); |
| | } |
| | |
| | operator PY_LONG_LONG() const |
| | { |
| | return PyLong_AsLongLong (ptr()); |
| | } |
| | |
| | operator unsigned PY_LONG_LONG() const |
| | { |
| | return PyLong_AsUnsignedLongLong (ptr()); |
| | } |
| | |
| | operator long() const |
| | { |
| | return PyLong_AsLong (ptr()); |
| | } |
| | |
| | operator unsigned long() const |
| | { |
| | return PyLong_AsUnsignedLong (ptr()); |
| | } |
| | operator double() const |
| | { |
| | return PyLong_AsDouble (ptr()); |
| | } |
| | |
| | LongLong& operator= (int v) |
| | { |
| | set(PyLong_FromLongLong (long(v)), true); |
| | return *this; |
| | } |
| | |
| | LongLong& operator= (PY_LONG_LONG v) |
| | { |
| | set(PyLong_FromLongLong (v), true); |
| | return *this; |
| | } |
| | |
| | LongLong& operator= (unsigned PY_LONG_LONG v) |
| | { |
| | set(PyLong_FromUnsignedLongLong (v), true); |
| | return *this; |
| | } |
| | |
| | LongLong& operator= (long v) |
| | { |
| | set(PyLong_FromLongLong (v), true); |
| | return *this; |
| | } |
| | |
| | LongLong& operator= (unsigned long v) |
| | { |
| | set(PyLong_FromUnsignedLongLong (v), true); |
| | return *this; |
| | } |
| | }; |
| | #endif |
| |
|
| | |
| | |
| | |
| | class PYCXX_EXPORT Float: public Object |
| | { |
| | public: |
| | |
| | explicit Float (PyObject *pyob, bool owned = false): Object(pyob, owned) |
| | { |
| | validate(); |
| | } |
| |
|
| | Float (const Float& f): Object(f) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | explicit Float (double v=0.0) |
| | : Object(PyFloat_FromDouble (v), true) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | Float (const Object& ob) |
| | : Object(PyNumber_Float(*ob), true) |
| | { |
| | validate(); |
| | } |
| |
|
| | Float& operator= (const Object& rhs) |
| | { |
| | return (*this = *rhs); |
| | } |
| |
|
| | Float& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set (PyNumber_Float(rhsp), true); |
| | return *this; |
| | } |
| | |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && Py::_Float_Check (pyob); |
| | } |
| | |
| | operator double () const |
| | { |
| | return PyFloat_AsDouble (ptr()); |
| | } |
| | |
| | Float& operator= (double v) |
| | { |
| | set(PyFloat_FromDouble (v), true); |
| | return *this; |
| | } |
| | |
| | Float& operator= (int v) |
| | { |
| | set(PyFloat_FromDouble (double(v)), true); |
| | return *this; |
| | } |
| | |
| | Float& operator= (long v) |
| | { |
| | set(PyFloat_FromDouble (double(v)), true); |
| | return *this; |
| | } |
| | |
| | Float& operator= (const Int& iob) |
| | { |
| | set(PyFloat_FromDouble (double(long(iob))), true); |
| | return *this; |
| | } |
| | }; |
| |
|
| | |
| | |
| | class PYCXX_EXPORT Complex: public Object |
| | { |
| | public: |
| | |
| | explicit Complex (PyObject *pyob, bool owned = false): Object(pyob, owned) |
| | { |
| | validate(); |
| | } |
| |
|
| | Complex (const Complex& f): Object(f) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | explicit Complex (double v=0.0, double w=0.0) |
| | :Object(PyComplex_FromDoubles (v, w), true) |
| | { |
| | validate(); |
| | } |
| |
|
| | Complex& operator= (const Object& rhs) |
| | { |
| | return (*this = *rhs); |
| | } |
| |
|
| | Complex& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set (rhsp); |
| | return *this; |
| | } |
| | |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && Py::_Complex_Check (pyob); |
| | } |
| | |
| | operator Py_complex () const |
| | { |
| | return PyComplex_AsCComplex (ptr()); |
| | } |
| | |
| | Complex& operator= (const Py_complex& v) |
| | { |
| | set(PyComplex_FromCComplex (v), true); |
| | return *this; |
| | } |
| | |
| | Complex& operator= (double v) |
| | { |
| | set(PyComplex_FromDoubles (v, 0.0), true); |
| | return *this; |
| | } |
| | |
| | Complex& operator= (int v) |
| | { |
| | set(PyComplex_FromDoubles (double(v), 0.0), true); |
| | return *this; |
| | } |
| | |
| | Complex& operator= (long v) |
| | { |
| | set(PyComplex_FromDoubles (double(v), 0.0), true); |
| | return *this; |
| | } |
| | |
| | Complex& operator= (const Int& iob) |
| | { |
| | set(PyComplex_FromDoubles (double(long(iob)), 0.0), true); |
| | return *this; |
| | } |
| |
|
| | double real() const |
| | { |
| | return PyComplex_RealAsDouble(ptr()); |
| | } |
| |
|
| | double imag() const |
| | { |
| | return PyComplex_ImagAsDouble(ptr()); |
| | } |
| | }; |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| |
|
| | template<TEMPLATE_TYPENAME T> |
| | class seqref |
| | { |
| | protected: |
| | SeqBase<T>& s; |
| | sequence_index_type offset; |
| | T the_item; |
| | public: |
| |
|
| | seqref (SeqBase<T>& seq, sequence_index_type j) |
| | : s(seq), offset(j), the_item (s.getItem(j)) |
| | {} |
| |
|
| | seqref (const seqref<T>& range) |
| | : s(range.s), offset(range.offset), the_item(range.the_item) |
| | {} |
| |
|
| | |
| | seqref (Object& obj) |
| | : s(dynamic_cast< SeqBase<T>&>(obj)) |
| | , offset( 0 ) |
| | , the_item(s.getItem(offset)) |
| | {} |
| | ~seqref() |
| | {} |
| |
|
| | operator T() const |
| | { |
| | return the_item; |
| | } |
| |
|
| | seqref<T>& operator=(const seqref<T>& rhs) |
| | { |
| | the_item = rhs.the_item; |
| | s.setItem(offset, the_item); |
| | return *this; |
| | } |
| |
|
| | seqref<T>& operator=(const T& ob) |
| | { |
| | the_item = ob; |
| | s.setItem(offset, ob); |
| | return *this; |
| | } |
| |
|
| | |
| | PyObject* ptr () const |
| | { |
| | return the_item.ptr(); |
| | } |
| |
|
| | int reference_count () const |
| | { |
| | return the_item.reference_count(); |
| | } |
| |
|
| | Type type () const |
| | { |
| | return the_item.type(); |
| | } |
| |
|
| | String str () const; |
| |
|
| | String repr () const; |
| |
|
| | bool hasAttr (const std::string& attr_name) const |
| | { |
| | return the_item.hasAttr(attr_name); |
| | } |
| |
|
| | Object getAttr (const std::string& attr_name) const |
| | { |
| | return the_item.getAttr(attr_name); |
| | } |
| |
|
| | Object getItem (const Object& key) const |
| | { |
| | return the_item.getItem(key); |
| | } |
| |
|
| | long hashValue () const |
| | { |
| | return the_item.hashValue(); |
| | } |
| |
|
| | bool isCallable () const |
| | { |
| | return the_item.isCallable(); |
| | } |
| |
|
| | bool isInstance () const |
| | { |
| | return the_item.isInstance(); |
| | } |
| |
|
| | bool isDict () const |
| | { |
| | return the_item.isDict(); |
| | } |
| |
|
| | bool isList () const |
| | { |
| | return the_item.isList(); |
| | } |
| |
|
| | bool isMapping () const |
| | { |
| | return the_item.isMapping(); |
| | } |
| |
|
| | bool isNumeric () const |
| | { |
| | return the_item.isNumeric(); |
| | } |
| |
|
| | bool isSequence () const |
| | { |
| | return the_item.isSequence(); |
| | } |
| |
|
| | bool isTrue () const |
| | { |
| | return the_item.isTrue(); |
| | } |
| |
|
| | bool isType (const Type& t) const |
| | { |
| | return the_item.isType (t); |
| | } |
| |
|
| | bool isTuple() const |
| | { |
| | return the_item.isTuple(); |
| | } |
| |
|
| | bool isString() const |
| | { |
| | return the_item.isString(); |
| | } |
| | |
| | void setAttr (const std::string& attr_name, const Object& value) |
| | { |
| | the_item.setAttr(attr_name, value); |
| | } |
| |
|
| | void delAttr (const std::string& attr_name) |
| | { |
| | the_item.delAttr(attr_name); |
| | } |
| |
|
| | void delItem (const Object& key) |
| | { |
| | the_item.delItem(key); |
| | } |
| |
|
| | bool operator==(const Object& o2) const |
| | { |
| | return the_item == o2; |
| | } |
| |
|
| | bool operator!=(const Object& o2) const |
| | { |
| | return the_item != o2; |
| | } |
| |
|
| | bool operator>=(const Object& o2) const |
| | { |
| | return the_item >= o2; |
| | } |
| |
|
| | bool operator<=(const Object& o2) const |
| | { |
| | return the_item <= o2; |
| | } |
| |
|
| | bool operator<(const Object& o2) const |
| | { |
| | return the_item < o2; |
| | } |
| |
|
| | bool operator>(const Object& o2) const |
| | { |
| | return the_item > o2; |
| | } |
| | }; |
| |
|
| |
|
| | |
| | |
| |
|
| | template<TEMPLATE_TYPENAME T> |
| | class SeqBase: public Object |
| | { |
| | public: |
| | |
| | typedef Py_ssize_t size_type; |
| | typedef seqref<T> reference; |
| | typedef T const_reference; |
| | typedef seqref<T>* pointer; |
| | typedef int difference_type; |
| | typedef T value_type; |
| |
|
| | virtual size_type max_size() const |
| | { |
| | return std::string::npos; |
| | } |
| |
|
| | virtual size_type capacity() const |
| | { |
| | return size(); |
| | } |
| |
|
| | virtual void swap(SeqBase<T>& c) |
| | { |
| | SeqBase<T> temp = c; |
| | c = ptr(); |
| | set(temp.ptr()); |
| | } |
| |
|
| | virtual size_type size () const |
| | { |
| | return PySequence_Length (ptr()); |
| | } |
| |
|
| | explicit SeqBase<T> () |
| | :Object(PyTuple_New(0), true) |
| | { |
| | validate(); |
| | } |
| |
|
| | explicit SeqBase<T> (PyObject* pyob, bool owned=false) |
| | : Object(pyob, owned) |
| | { |
| | validate(); |
| | } |
| |
|
| | SeqBase<T> (const Object& ob): Object(ob) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| |
|
| | SeqBase<T>& operator= (const Object& rhs) |
| | { |
| | return (*this = *rhs); |
| | } |
| |
|
| | SeqBase<T>& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set (rhsp); |
| | return *this; |
| | } |
| |
|
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && PySequence_Check (pyob); |
| | } |
| |
|
| | size_type length () const |
| | { |
| | return PySequence_Length (ptr()); |
| | } |
| |
|
| | |
| | const T operator[](sequence_index_type index) const |
| | { |
| | return getItem(index); |
| | } |
| |
|
| | seqref<T> operator[](sequence_index_type index) |
| | { |
| | return seqref<T>(*this, index); |
| | } |
| |
|
| | virtual T getItem (sequence_index_type i) const |
| | { |
| | return T(asObject(PySequence_GetItem (ptr(), i))); |
| | } |
| |
|
| | virtual void setItem (sequence_index_type i, const T& ob) |
| | { |
| | if (PySequence_SetItem (ptr(), i, *ob) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| |
|
| | SeqBase<T> repeat (int count) const |
| | { |
| | return SeqBase<T> (PySequence_Repeat (ptr(), count), true); |
| | } |
| |
|
| | SeqBase<T> concat (const SeqBase<T>& other) const |
| | { |
| | return SeqBase<T> (PySequence_Concat(ptr(), *other), true); |
| | } |
| |
|
| | |
| | const T front () const |
| | { |
| | return getItem(0); |
| | } |
| |
|
| | seqref<T> front() |
| | { |
| | return seqref<T>(*this, 0); |
| | } |
| |
|
| | const T back() const |
| | { |
| | return getItem(size()-1); |
| | } |
| |
|
| | seqref<T> back() |
| | { |
| | return seqref<T>(*this, size()-1); |
| | } |
| |
|
| | void verify_length(size_type required_size) const |
| | { |
| | if (size() != required_size) |
| | throw IndexError ("Unexpected SeqBase<T> length."); |
| | } |
| |
|
| | void verify_length(size_type min_size, size_type max_size) const |
| | { |
| | size_type n = size(); |
| | if (n < min_size || n > max_size) |
| | throw IndexError ("Unexpected SeqBase<T> length."); |
| | } |
| |
|
| | class iterator |
| | : public random_access_iterator_parent(seqref<T>) |
| | { |
| | protected: |
| | friend class SeqBase<T>; |
| | SeqBase<T>* seq; |
| | size_type count; |
| |
|
| | public: |
| | ~iterator () |
| | {} |
| |
|
| | iterator () |
| | : seq( 0 ) |
| | , count( 0 ) |
| | {} |
| |
|
| | iterator (SeqBase<T>* s, size_type where) |
| | : seq( s ) |
| | , count( where ) |
| | {} |
| |
|
| | iterator (const iterator& other) |
| | : seq( other.seq ) |
| | , count( other.count ) |
| | {} |
| |
|
| | bool eql (const iterator& other) const |
| | { |
| | return (seq->ptr() == other.seq->ptr()) && (count == other.count); |
| | } |
| |
|
| | bool neq (const iterator& other) const |
| | { |
| | return (seq->ptr() != other.seq->ptr()) || (count != other.count); |
| | } |
| |
|
| | bool lss (const iterator& other) const |
| | { |
| | return (count < other.count); |
| | } |
| |
|
| | bool gtr (const iterator& other) const |
| | { |
| | return (count > other.count); |
| | } |
| |
|
| | bool leq (const iterator& other) const |
| | { |
| | return (count <= other.count); |
| | } |
| |
|
| | bool geq (const iterator& other) const |
| | { |
| | return (count >= other.count); |
| | } |
| |
|
| | seqref<T> operator*() |
| | { |
| | return seqref<T>(*seq, count); |
| | } |
| |
|
| | seqref<T> operator[] (sequence_index_type i) |
| | { |
| | return seqref<T>(*seq, count + i); |
| | } |
| |
|
| | iterator& operator=(const iterator& other) |
| | { |
| | if (this == &other) return *this; |
| | seq = other.seq; |
| | count = other.count; |
| | return *this; |
| | } |
| |
|
| | iterator operator+(int n) const |
| | { |
| | return iterator(seq, count + n); |
| | } |
| |
|
| | iterator operator-(int n) const |
| | { |
| | return iterator(seq, count - n); |
| | } |
| |
|
| | iterator& operator+=(int n) |
| | { |
| | count = count + n; |
| | return *this; |
| | } |
| |
|
| | iterator& operator-=(int n) |
| | { |
| | count = count - n; |
| | return *this; |
| | } |
| |
|
| | int operator-(const iterator& other) const |
| | { |
| | if (*seq != *other.seq) |
| | throw RuntimeError ("SeqBase<T>::iterator comparison error"); |
| | return count - other.count; |
| | } |
| |
|
| | |
| | iterator& operator++ () |
| | { count++; return *this;} |
| | |
| | iterator operator++ (int) |
| | { return iterator(seq, count++);} |
| | |
| | iterator& operator-- () |
| | { count--; return *this;} |
| | |
| | iterator operator-- (int) |
| | { return iterator(seq, count--);} |
| |
|
| | std::string diagnose() const |
| | { |
| | std::OSTRSTREAM oss; |
| | oss << "iterator diagnosis " << seq << ", " << count << std::ends; |
| | return std::string(oss.str()); |
| | } |
| | }; |
| |
|
| | iterator begin () |
| | { |
| | return iterator(this, 0); |
| | } |
| |
|
| | iterator end () |
| | { |
| | return iterator(this, length()); |
| | } |
| |
|
| | class const_iterator |
| | : public random_access_iterator_parent(const Object) |
| | { |
| | protected: |
| | friend class SeqBase<T>; |
| | const SeqBase<T>* seq; |
| | sequence_index_type count; |
| |
|
| | private: |
| | const_iterator (const SeqBase<T>* s, size_type where) |
| | : seq( s ) |
| | , count( where ) |
| | {} |
| |
|
| | public: |
| | ~const_iterator () |
| | {} |
| |
|
| | const_iterator () |
| | : seq( 0 ) |
| | , count( 0 ) |
| | {} |
| |
|
| | const_iterator(const const_iterator& other) |
| | : seq( other.seq ) |
| | , count( other.count ) |
| | {} |
| |
|
| | const T operator*() const |
| | { |
| | return seq->getItem(count); |
| | } |
| |
|
| | const T operator[] (sequence_index_type i) const |
| | { |
| | return seq->getItem(count + i); |
| | } |
| |
|
| | const_iterator& operator=(const const_iterator& other) |
| | { |
| | if (this == &other) return *this; |
| | seq = other.seq; |
| | count = other.count; |
| | return *this; |
| | } |
| |
|
| | const_iterator operator+(int n) const |
| | { |
| | return const_iterator(seq, count + n); |
| | } |
| |
|
| | bool eql (const const_iterator& other) const |
| | { |
| | return (seq->ptr() == other.seq->ptr()) && (count == other.count); |
| | } |
| |
|
| | bool neq (const const_iterator& other) const |
| | { |
| | return (seq->ptr() != other.seq->ptr()) || (count != other.count); |
| | } |
| |
|
| | bool lss (const const_iterator& other) const |
| | { |
| | return (count < other.count); |
| | } |
| |
|
| | bool gtr (const const_iterator& other) const |
| | { |
| | return (count > other.count); |
| | } |
| |
|
| | bool leq (const const_iterator& other) const |
| | { |
| | return (count <= other.count); |
| | } |
| |
|
| | bool geq (const const_iterator& other) const |
| | { |
| | return (count >= other.count); |
| | } |
| |
|
| | const_iterator operator-(int n) |
| | { |
| | return const_iterator(seq, count - n); |
| | } |
| |
|
| | const_iterator& operator+=(int n) |
| | { |
| | count = count + n; |
| | return *this; |
| | } |
| |
|
| | const_iterator& operator-=(int n) |
| | { |
| | count = count - n; |
| | return *this; |
| | } |
| |
|
| | int operator-(const const_iterator& other) const |
| | { |
| | if (*seq != *other.seq) |
| | throw RuntimeError ("SeqBase<T>::const_iterator::- error"); |
| | return count - other.count; |
| | } |
| | |
| | const_iterator& operator++ () |
| | { count++; return *this;} |
| | |
| | const_iterator operator++ (int) |
| | { return const_iterator(seq, count++);} |
| | |
| | const_iterator& operator-- () |
| | { count--; return *this;} |
| | |
| | const_iterator operator-- (int) |
| | { return const_iterator(seq, count--);} |
| | }; |
| |
|
| | const_iterator begin () const |
| | { |
| | return const_iterator(this, 0); |
| | } |
| |
|
| | const_iterator end () const |
| | { |
| | return const_iterator(this, length()); |
| | } |
| | }; |
| |
|
| | |
| | typedef SeqBase<Object> Sequence; |
| |
|
| | template <TEMPLATE_TYPENAME T> bool operator==(const EXPLICIT_TYPENAME SeqBase<T>::iterator& left, const EXPLICIT_TYPENAME SeqBase<T>::iterator& right); |
| | template <TEMPLATE_TYPENAME T> bool operator!=(const EXPLICIT_TYPENAME SeqBase<T>::iterator& left, const EXPLICIT_TYPENAME SeqBase<T>::iterator& right); |
| | template <TEMPLATE_TYPENAME T> bool operator< (const EXPLICIT_TYPENAME SeqBase<T>::iterator& left, const EXPLICIT_TYPENAME SeqBase<T>::iterator& right); |
| | template <TEMPLATE_TYPENAME T> bool operator> (const EXPLICIT_TYPENAME SeqBase<T>::iterator& left, const EXPLICIT_TYPENAME SeqBase<T>::iterator& right); |
| | template <TEMPLATE_TYPENAME T> bool operator<=(const EXPLICIT_TYPENAME SeqBase<T>::iterator& left, const EXPLICIT_TYPENAME SeqBase<T>::iterator& right); |
| | template <TEMPLATE_TYPENAME T> bool operator>=(const EXPLICIT_TYPENAME SeqBase<T>::iterator& left, const EXPLICIT_TYPENAME SeqBase<T>::iterator& right); |
| |
|
| | template <TEMPLATE_TYPENAME T> bool operator==(const EXPLICIT_TYPENAME SeqBase<T>::const_iterator& left, const EXPLICIT_TYPENAME SeqBase<T>::const_iterator& right); |
| | template <TEMPLATE_TYPENAME T> bool operator!=(const EXPLICIT_TYPENAME SeqBase<T>::const_iterator& left, const EXPLICIT_TYPENAME SeqBase<T>::const_iterator& right); |
| | template <TEMPLATE_TYPENAME T> bool operator< (const EXPLICIT_TYPENAME SeqBase<T>::const_iterator& left, const EXPLICIT_TYPENAME SeqBase<T>::const_iterator& right); |
| | template <TEMPLATE_TYPENAME T> bool operator> (const EXPLICIT_TYPENAME SeqBase<T>::const_iterator& left, const EXPLICIT_TYPENAME SeqBase<T>::const_iterator& right); |
| | template <TEMPLATE_TYPENAME T> bool operator<=(const EXPLICIT_TYPENAME SeqBase<T>::const_iterator& left, const EXPLICIT_TYPENAME SeqBase<T>::const_iterator& right); |
| | template <TEMPLATE_TYPENAME T> bool operator>=(const EXPLICIT_TYPENAME SeqBase<T>::const_iterator& left, const EXPLICIT_TYPENAME SeqBase<T>::const_iterator& right); |
| |
|
| | PYCXX_EXPORT extern bool operator==(const Sequence::iterator& left, const Sequence::iterator& right); |
| | PYCXX_EXPORT extern bool operator!=(const Sequence::iterator& left, const Sequence::iterator& right); |
| | PYCXX_EXPORT extern bool operator< (const Sequence::iterator& left, const Sequence::iterator& right); |
| | PYCXX_EXPORT extern bool operator> (const Sequence::iterator& left, const Sequence::iterator& right); |
| | PYCXX_EXPORT extern bool operator<=(const Sequence::iterator& left, const Sequence::iterator& right); |
| | PYCXX_EXPORT extern bool operator>=(const Sequence::iterator& left, const Sequence::iterator& right); |
| |
|
| | PYCXX_EXPORT extern bool operator==(const Sequence::const_iterator& left, const Sequence::const_iterator& right); |
| | PYCXX_EXPORT extern bool operator!=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); |
| | PYCXX_EXPORT extern bool operator< (const Sequence::const_iterator& left, const Sequence::const_iterator& right); |
| | PYCXX_EXPORT extern bool operator> (const Sequence::const_iterator& left, const Sequence::const_iterator& right); |
| | PYCXX_EXPORT extern bool operator<=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); |
| | PYCXX_EXPORT extern bool operator>=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | typedef std::basic_string<Py_UNICODE> unicodestring; |
| | extern Py_UNICODE unicode_null_string[1]; |
| |
|
| | class PYCXX_EXPORT Char: public Object |
| | { |
| | public: |
| | explicit Char (PyObject *pyob, bool owned = false): Object(pyob, owned) |
| | { |
| | validate(); |
| | } |
| |
|
| | Char (const Object& ob): Object(ob) |
| | { |
| | validate(); |
| | } |
| |
|
| | Char (const std::string& v = "") |
| | :Object(PyString_FromStringAndSize (const_cast<char*>(v.c_str()),1), true) |
| | { |
| | validate(); |
| | } |
| |
|
| | Char (char v) |
| | : Object(PyString_FromStringAndSize (&v, 1), true) |
| | { |
| | validate(); |
| | } |
| |
|
| | Char (Py_UNICODE v) |
| | : Object(PyUnicode_FromUnicode (&v, 1), true) |
| | { |
| | validate(); |
| | } |
| | |
| | Char& operator= (const Object& rhs) |
| | { |
| | return (*this = *rhs); |
| | } |
| |
|
| | Char& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set (rhsp); |
| | return *this; |
| | } |
| |
|
| | |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && (Py::_String_Check(pyob) || Py::_Unicode_Check(pyob)) && PySequence_Length (pyob) == 1; |
| | } |
| |
|
| | |
| | Char& operator= (const std::string& v) |
| | { |
| | set(PyString_FromStringAndSize (const_cast<char*>(v.c_str()),1), true); |
| | return *this; |
| | } |
| |
|
| | Char& operator= (char v) |
| | { |
| | set(PyString_FromStringAndSize (&v, 1), true); |
| | return *this; |
| | } |
| |
|
| | Char& operator= (const unicodestring& v) |
| | { |
| | set(PyUnicode_FromUnicode (const_cast<Py_UNICODE*>(v.data()),1), true); |
| | return *this; |
| | } |
| |
|
| | Char& operator= (Py_UNICODE v) |
| | { |
| | set(PyUnicode_FromUnicode (&v, 1), true); |
| | return *this; |
| | } |
| |
|
| | |
| | operator String() const; |
| |
|
| | operator std::string () const |
| | { |
| | return std::string(PyString_AsString (ptr())); |
| | } |
| | }; |
| |
|
| | #ifdef PYCXX_PYTHON_2TO3 |
| | |
| | class Bytes; |
| |
|
| | class PYCXX_EXPORT String: public SeqBase<Char> |
| | { |
| | public: |
| | virtual size_type capacity() const |
| | { |
| | return max_size(); |
| | } |
| |
|
| | explicit String( PyObject *pyob, bool owned = false) |
| | : SeqBase<Char>( pyob, owned ) |
| | { |
| | validate(); |
| | } |
| |
|
| | String( const Object& ob): SeqBase<Char>(ob) |
| | { |
| | validate(); |
| | } |
| |
|
| | String() |
| | : SeqBase<Char>( PyString_FromStringAndSize( "", 0 ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | String( const std::string& v ) |
| | : SeqBase<Char>( PyString_FromStringAndSize( const_cast<char*>(v.data()), |
| | static_cast<int>( v.length() ) ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | String( const Py_UNICODE *s, int length ) |
| | : SeqBase<Char>( PyUnicode_FromUnicode( s, length ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | String( const char *s, const char *encoding, const char *error="strict" ) |
| | : SeqBase<Char>( PyUnicode_Decode( s, strlen( s ), encoding, error ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | String( const char *s, int len, const char *encoding, const char *error="strict" ) |
| | : SeqBase<Char>( PyUnicode_Decode( s, len, encoding, error ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | String( const std::string &s, const char *encoding, const char *error="strict" ) |
| | : SeqBase<Char>( PyUnicode_Decode( s.c_str(), s.length(), encoding, error ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | String( const char *v, int vsize ) |
| | : SeqBase<Char>(PyString_FromStringAndSize( const_cast<char*>(v), vsize ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | String( const char *v ) |
| | : SeqBase<Char>( PyString_FromString( v ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | String &operator=( const Object &rhs ) |
| | { |
| | return *this = *rhs; |
| | } |
| |
|
| | String& operator= (PyObject *rhsp) |
| | { |
| | if( ptr() == rhsp ) |
| | return *this; |
| | set (rhsp); |
| | return *this; |
| | } |
| | |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && (Py::_String_Check(pyob) || Py::_Unicode_Check(pyob)); |
| | } |
| |
|
| | |
| | String& operator=( const std::string &v ) |
| | { |
| | set( PyString_FromStringAndSize( const_cast<char*>( v.data() ), |
| | static_cast<int>( v.length() ) ), true ); |
| | return *this; |
| | } |
| | String& operator=( const unicodestring &v ) |
| | { |
| | set( PyUnicode_FromUnicode( const_cast<Py_UNICODE*>( v.data() ), |
| | static_cast<int>( v.length() ) ), true ); |
| | return *this; |
| | } |
| |
|
| | |
| | Bytes encode( const char *encoding, const char *error="strict" ) const; |
| |
|
| | |
| | virtual size_type size() const |
| | { |
| | if( isUnicode() ) |
| | { |
| | return static_cast<size_type>( PyUnicode_GET_SIZE (ptr()) ); |
| | } |
| | else |
| | { |
| | return static_cast<size_type>( PyString_Size (ptr()) ); |
| | } |
| | } |
| |
|
| | operator std::string() const |
| | { |
| | return as_std_string( "utf-8" ); |
| | } |
| |
|
| | std::string as_std_string( const char *encoding, const char *error="strict" ) const; |
| |
|
| | unicodestring as_unicodestring() const |
| | { |
| | if( isUnicode() ) |
| | { |
| | return unicodestring( PyUnicode_AS_UNICODE( ptr() ), |
| | static_cast<size_type>( PyUnicode_GET_SIZE( ptr() ) ) ); |
| | } |
| | else |
| | { |
| | throw TypeError("can only return unicodestring from Unicode object"); |
| | } |
| | } |
| |
|
| | const Py_UNICODE *unicode_data() const |
| | { |
| | if( isUnicode() ) |
| | { |
| | return PyUnicode_AS_UNICODE( ptr() ); |
| | } |
| | else |
| | { |
| | throw TypeError("can only return unicode_data from Unicode object"); |
| | } |
| | } |
| | }; |
| | class PYCXX_EXPORT Bytes: public SeqBase<Char> |
| | { |
| | public: |
| | virtual size_type capacity() const |
| | { |
| | return max_size(); |
| | } |
| |
|
| | explicit Bytes (PyObject *pyob, bool owned = false): SeqBase<Char>(pyob, owned) |
| | { |
| | validate(); |
| | } |
| |
|
| | Bytes (const Object& ob): SeqBase<Char>(ob) |
| | { |
| | validate(); |
| | } |
| |
|
| | Bytes() |
| | : SeqBase<Char>( PyString_FromStringAndSize( "", 0 ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | Bytes( const std::string& v ) |
| | : SeqBase<Char>( PyString_FromStringAndSize( const_cast<char*>(v.data()), static_cast<int>( v.length() ) ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | Bytes( const char *v, int vsize ) |
| | : SeqBase<Char>(PyString_FromStringAndSize( const_cast<char*>(v), vsize ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | Bytes( const char *v ) |
| | : SeqBase<Char>( PyString_FromString( v ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | Bytes &operator= ( const Object& rhs ) |
| | { |
| | return *this = *rhs; |
| | } |
| |
|
| | Bytes &operator= (PyObject *rhsp) |
| | { |
| | if( ptr() == rhsp ) |
| | return *this; |
| | set (rhsp); |
| | return *this; |
| | } |
| | |
| | virtual bool accepts( PyObject *pyob ) const |
| | { |
| | return pyob && (Py::_String_Check( pyob ) || Py::_Unicode_Check( pyob )); |
| | } |
| |
|
| | |
| | Bytes &operator= (const std::string& v) |
| | { |
| | set( PyString_FromStringAndSize( const_cast<char*>( v.data() ), |
| | static_cast<int>( v.length() ) ), true ); |
| | return *this; |
| | } |
| | Bytes &operator= (const unicodestring& v) |
| | { |
| | set( PyUnicode_FromUnicode( const_cast<Py_UNICODE*>( v.data() ), |
| | static_cast<int>( v.length() ) ), true ); |
| | return *this; |
| | } |
| |
|
| | String decode( const char *encoding, const char *error="strict" ) |
| | { |
| | return Object( PyString_AsDecodedObject( ptr(), encoding, error ), true ); |
| | } |
| |
|
| | |
| | virtual size_type size () const |
| | { |
| | if( isUnicode() ) |
| | { |
| | return static_cast<size_type>( PyUnicode_GET_SIZE (ptr()) ); |
| | } |
| | else |
| | { |
| | return static_cast<size_type>( PyString_Size (ptr()) ); |
| | } |
| | } |
| |
|
| | operator std::string () const |
| | { |
| | return as_std_string(); |
| | } |
| |
|
| | std::string as_std_string() const |
| | { |
| | if( isUnicode() ) |
| | { |
| | throw TypeError("cannot return std::string from Unicode object"); |
| | } |
| | else |
| | { |
| | return std::string( PyString_AsString( ptr() ), static_cast<size_t>( PyString_Size( ptr() ) ) ); |
| | } |
| | } |
| |
|
| | unicodestring as_unicodestring() const |
| | { |
| | if( isUnicode() ) |
| | { |
| | return unicodestring( PyUnicode_AS_UNICODE( ptr() ), |
| | static_cast<size_type>( PyUnicode_GET_SIZE( ptr() ) ) ); |
| | } |
| | else |
| | { |
| | throw TypeError("can only return unicodestring from Unicode object"); |
| | } |
| | } |
| | }; |
| |
|
| | #else |
| | |
| | class PYCXX_EXPORT String: public SeqBase<Char> |
| | { |
| | public: |
| | virtual size_type capacity() const |
| | { |
| | return max_size(); |
| | } |
| |
|
| | explicit String (PyObject *pyob, bool owned = false): SeqBase<Char>(pyob, owned) |
| | { |
| | validate(); |
| | } |
| |
|
| | String (const Object& ob): SeqBase<Char>(ob) |
| | { |
| | validate(); |
| | } |
| |
|
| | String() |
| | : SeqBase<Char>( PyString_FromStringAndSize( "", 0 ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | String( const std::string& v ) |
| | : SeqBase<Char>( PyString_FromStringAndSize( const_cast<char*>(v.data()), |
| | static_cast<int>( v.length() ) ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | String( const char *s, const char *encoding, const char *error="strict" ) |
| | : SeqBase<Char>( PyUnicode_Decode( s, strlen( s ), encoding, error ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | String( const char *s, int len, const char *encoding, const char *error="strict" ) |
| | : SeqBase<Char>( PyUnicode_Decode( s, len, encoding, error ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | String( const std::string &s, const char *encoding, const char *error="strict" ) |
| | : SeqBase<Char>( PyUnicode_Decode( s.c_str(), s.length(), encoding, error ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | String( const char *v, int vsize ) |
| | : SeqBase<Char>(PyString_FromStringAndSize( const_cast<char*>(v), vsize ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | String( const char* v ) |
| | : SeqBase<Char>( PyString_FromString( v ), true ) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | String& operator= ( const Object& rhs ) |
| | { |
| | return *this = *rhs; |
| | } |
| |
|
| | String& operator= (PyObject* rhsp) |
| | { |
| | if( ptr() == rhsp ) |
| | return *this; |
| | set (rhsp); |
| | return *this; |
| | } |
| | |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && (Py::_String_Check(pyob) || Py::_Unicode_Check(pyob)); |
| | } |
| |
|
| | |
| | String& operator= (const std::string& v) |
| | { |
| | set( PyString_FromStringAndSize( const_cast<char*>( v.data() ), |
| | static_cast<int>( v.length() ) ), true ); |
| | return *this; |
| | } |
| | String& operator= (const unicodestring& v) |
| | { |
| | set( PyUnicode_FromUnicode( const_cast<Py_UNICODE*>( v.data() ), |
| | static_cast<int>( v.length() ) ), true ); |
| | return *this; |
| | } |
| |
|
| |
|
| | |
| | String encode( const char *encoding, const char *error="strict" ) const |
| | { |
| | if( isUnicode() ) |
| | { |
| | return String( PyUnicode_AsEncodedString( ptr(), encoding, error ), true ); |
| | } |
| | else |
| | { |
| | return String( PyString_AsEncodedObject( ptr(), encoding, error ), true ); |
| | } |
| | } |
| |
|
| | String decode( const char *encoding, const char *error="strict" ) |
| | { |
| | return Object( PyString_AsDecodedObject( ptr(), encoding, error ), true ); |
| | } |
| |
|
| | |
| | virtual size_type size () const |
| | { |
| | if( isUnicode() ) |
| | { |
| | return static_cast<size_type>( PyUnicode_GET_SIZE (ptr()) ); |
| | } |
| | else |
| | { |
| | return static_cast<size_type>( PyString_Size (ptr()) ); |
| | } |
| | } |
| |
|
| | operator std::string () const |
| | { |
| | return as_std_string(); |
| | } |
| |
|
| | std::string as_std_string() const |
| | { |
| | if( isUnicode() ) |
| | { |
| | throw TypeError("cannot return std::string from Unicode object"); |
| | } |
| | else |
| | { |
| | return std::string( PyString_AsString( ptr() ), static_cast<size_type>( PyString_Size( ptr() ) ) ); |
| | } |
| | } |
| |
|
| | std::string as_std_string( const char *encoding, const char *error="strict" ) const; |
| |
|
| | unicodestring as_unicodestring() const |
| | { |
| | if( isUnicode() ) |
| | { |
| | return unicodestring( PyUnicode_AS_UNICODE( ptr() ), |
| | static_cast<size_type>( PyUnicode_GET_SIZE( ptr() ) ) ); |
| | } |
| | else |
| | { |
| | throw TypeError("can only return unicodestring from Unicode object"); |
| | } |
| | } |
| | }; |
| | #endif |
| |
|
| | |
| | |
| | class PYCXX_EXPORT Tuple: public Sequence |
| | { |
| | public: |
| | virtual void setItem (sequence_index_type offset, const Object&ob) |
| | { |
| | |
| | if(PyTuple_SetItem (ptr(), offset, new_reference_to(ob)) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| |
|
| | |
| | explicit Tuple (PyObject *pyob, bool owned = false): Sequence (pyob, owned) |
| | { |
| | validate(); |
| | } |
| |
|
| | Tuple (const Object& ob): Sequence(ob) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | explicit Tuple (size_type size=0) |
| | { |
| | set(PyTuple_New (size), true); |
| | validate (); |
| | for (sequence_index_type i=0; i < size; i++) |
| | { |
| | if(PyTuple_SetItem (ptr(), i, new_reference_to(Py::_None())) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| | } |
| | |
| | explicit Tuple (const Sequence& s) |
| | { |
| | sequence_index_type limit( sequence_index_type( s.length() ) ); |
| |
|
| | set(PyTuple_New (limit), true); |
| | validate(); |
| | |
| | for(sequence_index_type i=0; i < limit; i++) |
| | { |
| | if(PyTuple_SetItem (ptr(), i, new_reference_to(s[i])) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| | } |
| | |
| |
|
| | Tuple& operator= (const Object& rhs) |
| | { |
| | return (*this = *rhs); |
| | } |
| |
|
| | Tuple& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set (rhsp); |
| | return *this; |
| | } |
| | |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && Py::_Tuple_Check (pyob); |
| | } |
| |
|
| | Tuple getSlice (int i, int j) const |
| | { |
| | return Tuple (PySequence_GetSlice (ptr(), i, j), true); |
| | } |
| |
|
| | }; |
| |
|
| | class PYCXX_EXPORT TupleN: public Tuple |
| | { |
| | public: |
| | TupleN() |
| | : Tuple( (size_type)0 ) |
| | { |
| | } |
| |
|
| | TupleN( const Object &obj1 ) |
| | : Tuple( 1 ) |
| | { |
| | setItem( 0, obj1 ); |
| | } |
| |
|
| | TupleN( const Object &obj1, const Object &obj2 ) |
| | : Tuple( 2 ) |
| | { |
| | setItem( 0, obj1 ); |
| | setItem( 1, obj2 ); |
| | } |
| |
|
| | TupleN( const Object &obj1, const Object &obj2, const Object &obj3 ) |
| | : Tuple( 3 ) |
| | { |
| | setItem( 0, obj1 ); |
| | setItem( 1, obj2 ); |
| | setItem( 2, obj3 ); |
| | } |
| |
|
| | TupleN( const Object &obj1, const Object &obj2, const Object &obj3, |
| | const Object &obj4 ) |
| | : Tuple( 4 ) |
| | { |
| | setItem( 0, obj1 ); |
| | setItem( 1, obj2 ); |
| | setItem( 2, obj3 ); |
| | setItem( 3, obj4 ); |
| | } |
| |
|
| | TupleN( const Object &obj1, const Object &obj2, const Object &obj3, |
| | const Object &obj4, const Object &obj5 ) |
| | : Tuple( 5 ) |
| | { |
| | setItem( 0, obj1 ); |
| | setItem( 1, obj2 ); |
| | setItem( 2, obj3 ); |
| | setItem( 3, obj4 ); |
| | setItem( 4, obj5 ); |
| | } |
| |
|
| | TupleN( const Object &obj1, const Object &obj2, const Object &obj3, |
| | const Object &obj4, const Object &obj5, const Object &obj6 ) |
| | : Tuple( 6 ) |
| | { |
| | setItem( 0, obj1 ); |
| | setItem( 1, obj2 ); |
| | setItem( 2, obj3 ); |
| | setItem( 3, obj4 ); |
| | setItem( 4, obj5 ); |
| | setItem( 5, obj6 ); |
| | } |
| |
|
| | TupleN( const Object &obj1, const Object &obj2, const Object &obj3, |
| | const Object &obj4, const Object &obj5, const Object &obj6, |
| | const Object &obj7 ) |
| | : Tuple( 7 ) |
| | { |
| | setItem( 0, obj1 ); |
| | setItem( 1, obj2 ); |
| | setItem( 2, obj3 ); |
| | setItem( 3, obj4 ); |
| | setItem( 4, obj5 ); |
| | setItem( 5, obj6 ); |
| | setItem( 6, obj7 ); |
| | } |
| |
|
| | TupleN( const Object &obj1, const Object &obj2, const Object &obj3, |
| | const Object &obj4, const Object &obj5, const Object &obj6, |
| | const Object &obj7, const Object &obj8 ) |
| | : Tuple( 8 ) |
| | { |
| | setItem( 0, obj1 ); |
| | setItem( 1, obj2 ); |
| | setItem( 2, obj3 ); |
| | setItem( 3, obj4 ); |
| | setItem( 4, obj5 ); |
| | setItem( 5, obj6 ); |
| | setItem( 6, obj7 ); |
| | setItem( 7, obj8 ); |
| | } |
| |
|
| | TupleN( const Object &obj1, const Object &obj2, const Object &obj3, |
| | const Object &obj4, const Object &obj5, const Object &obj6, |
| | const Object &obj7, const Object &obj8, const Object &obj9 ) |
| | : Tuple( 9 ) |
| | { |
| | setItem( 0, obj1 ); |
| | setItem( 1, obj2 ); |
| | setItem( 2, obj3 ); |
| | setItem( 3, obj4 ); |
| | setItem( 4, obj5 ); |
| | setItem( 5, obj6 ); |
| | setItem( 6, obj7 ); |
| | setItem( 7, obj8 ); |
| | setItem( 8, obj9 ); |
| | } |
| |
|
| | virtual ~TupleN() |
| | { } |
| | }; |
| |
|
| |
|
| | |
| | |
| |
|
| | class PYCXX_EXPORT List: public Sequence |
| | { |
| | public: |
| | |
| | explicit List (PyObject *pyob, bool owned = false): Sequence(pyob, owned) |
| | { |
| | validate(); |
| | } |
| | List (const Object& ob): Sequence(ob) |
| | { |
| | validate(); |
| | } |
| | |
| | List (size_type size=0) |
| | { |
| | set(PyList_New (size), true); |
| | validate(); |
| | for (size_type i=0; i < size; i++) |
| | { |
| | if(PyList_SetItem (ptr(), i, new_reference_to(Py::_None())) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| | } |
| |
|
| | |
| | List (const Sequence& s): Sequence() |
| | { |
| | size_type n = s.length(); |
| | set(PyList_New (n), true); |
| | validate(); |
| | for (sequence_index_type i=0; i < n; i++) |
| | { |
| | if(PyList_SetItem (ptr(), i, new_reference_to(s[i])) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| | } |
| |
|
| | virtual size_type capacity() const |
| | { |
| | return max_size(); |
| | } |
| | |
| |
|
| | List& operator= (const Object& rhs) |
| | { |
| | return (*this = *rhs); |
| | } |
| |
|
| | List& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set (rhsp); |
| | return *this; |
| | } |
| | |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && Py::_List_Check (pyob); |
| | } |
| |
|
| | List getSlice (int i, int j) const |
| | { |
| | return List (PyList_GetSlice (ptr(), i, j), true); |
| | } |
| |
|
| | void setSlice (int i, int j, const Object& v) |
| | { |
| | if(PyList_SetSlice (ptr(), i, j, *v) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| |
|
| | void append (const Object& ob) |
| | { |
| | if(PyList_Append (ptr(), *ob) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| |
|
| | void insert (int i, const Object& ob) |
| | { |
| | if(PyList_Insert (ptr(), i, *ob) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| |
|
| | void sort () |
| | { |
| | if(PyList_Sort(ptr()) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| |
|
| | void reverse () |
| | { |
| | if(PyList_Reverse(ptr()) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| | }; |
| |
|
| |
|
| | |
| | |
| | template<TEMPLATE_TYPENAME T> |
| | class mapref |
| | { |
| | protected: |
| | MapBase<T>& s; |
| | Object key; |
| | T the_item; |
| |
|
| | public: |
| | mapref<T> (MapBase<T>& map, const std::string& k) |
| | : s(map), the_item() |
| | { |
| | key = String(k); |
| | if(map.hasKey(key)) the_item = map.getItem(key); |
| | } |
| |
|
| | mapref<T> (MapBase<T>& map, const Object& k) |
| | : s(map), key(k), the_item() |
| | { |
| | if(map.hasKey(key)) the_item = map.getItem(key); |
| | } |
| |
|
| | virtual ~mapref<T>() |
| | {} |
| |
|
| | |
| | |
| | mapref<T>& operator=(const mapref<T>& other) |
| | { |
| | if(this == &other) return *this; |
| | the_item = other.the_item; |
| | s.setItem(key, other.the_item); |
| | return *this; |
| | } |
| |
|
| | mapref<T>& operator= (const T& ob) |
| | { |
| | the_item = ob; |
| | s.setItem (key, ob); |
| | return *this; |
| | } |
| |
|
| | |
| | operator T() const |
| | { |
| | return the_item; |
| | } |
| |
|
| | |
| | PyObject* ptr () const |
| | { |
| | return the_item.ptr(); |
| | } |
| |
|
| | int reference_count () const |
| | { |
| | return the_item.reference_count(); |
| | } |
| |
|
| | Type type () const |
| | { |
| | return the_item.type(); |
| | } |
| |
|
| | String str () const |
| | { |
| | return the_item.str(); |
| | } |
| |
|
| | String repr () const |
| | { |
| | return the_item.repr(); |
| | } |
| |
|
| | bool hasAttr (const std::string& attr_name) const |
| | { |
| | return the_item.hasAttr(attr_name); |
| | } |
| |
|
| | Object getAttr (const std::string& attr_name) const |
| | { |
| | return the_item.getAttr(attr_name); |
| | } |
| |
|
| | Object getItem (const Object& k) const |
| | { |
| | return the_item.getItem(k); |
| | } |
| |
|
| | long hashValue () const |
| | { |
| | return the_item.hashValue(); |
| | } |
| |
|
| | bool isCallable () const |
| | { |
| | return the_item.isCallable(); |
| | } |
| |
|
| | bool isInstance () const |
| | { |
| | return the_item.isInstance(); |
| | } |
| |
|
| | bool isList () const |
| | { |
| | return the_item.isList(); |
| | } |
| |
|
| | bool isMapping () const |
| | { |
| | return the_item.isMapping(); |
| | } |
| |
|
| | bool isNumeric () const |
| | { |
| | return the_item.isNumeric(); |
| | } |
| |
|
| | bool isSequence () const |
| | { |
| | return the_item.isSequence(); |
| | } |
| |
|
| | bool isTrue () const |
| | { |
| | return the_item.isTrue(); |
| | } |
| |
|
| | bool isType (const Type& t) const |
| | { |
| | return the_item.isType (t); |
| | } |
| |
|
| | bool isTuple() const |
| | { |
| | return the_item.isTuple(); |
| | } |
| |
|
| | bool isString() const |
| | { |
| | return the_item.isString(); |
| | } |
| |
|
| | |
| | void setAttr (const std::string& attr_name, const Object& value) |
| | { |
| | the_item.setAttr(attr_name, value); |
| | } |
| |
|
| | void delAttr (const std::string& attr_name) |
| | { |
| | the_item.delAttr(attr_name); |
| | } |
| |
|
| | void delItem (const Object& k) |
| | { |
| | the_item.delItem(k); |
| | } |
| | }; |
| |
|
| | |
| | template< class T > |
| | bool operator==(const mapref<T>& , const mapref<T>& ) |
| | { |
| | return true; |
| | } |
| |
|
| | template< class T > |
| | bool operator!=(const mapref<T>& , const mapref<T>& ) |
| | { |
| | return true; |
| | } |
| |
|
| | template<TEMPLATE_TYPENAME T> |
| | class MapBase: public Object |
| | { |
| | protected: |
| | explicit MapBase<T>() |
| | {} |
| | public: |
| | |
| | |
| | |
| | |
| | |
| | typedef Py_ssize_t size_type; |
| | typedef Object key_type; |
| | typedef mapref<T> data_type; |
| | typedef std::pair< const T, T > value_type; |
| | typedef std::pair< const T, mapref<T> > reference; |
| | typedef const std::pair< const T, const T > const_reference; |
| | typedef std::pair< const T, mapref<T> > pointer; |
| |
|
| | |
| | explicit MapBase<T> (PyObject *pyob, bool owned = false): Object(pyob, owned) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | MapBase<T> (const Object& ob): Object(ob) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | MapBase<T>& operator= (const Object& rhs) |
| | { |
| | return (*this = *rhs); |
| | } |
| |
|
| | MapBase<T>& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set (rhsp); |
| | return *this; |
| | } |
| | |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && PyMapping_Check(pyob); |
| | } |
| |
|
| | |
| | |
| |
|
| | void clear () |
| | { |
| | List k = keys(); |
| | for(List::iterator i = k.begin(); i != k.end(); i++) |
| | { |
| | delItem(*i); |
| | } |
| | } |
| |
|
| | virtual size_type size() const |
| | { |
| | return PyMapping_Length (ptr()); |
| | } |
| |
|
| | |
| | T operator[](const std::string& key) const |
| | { |
| | return getItem(key); |
| | } |
| |
|
| | T operator[](const Object& key) const |
| | { |
| | return getItem(key); |
| | } |
| |
|
| | mapref<T> operator[](const std::string& key) |
| | { |
| | return mapref<T>(*this, key); |
| | } |
| |
|
| | mapref<T> operator[](const Object& key) |
| | { |
| | return mapref<T>(*this, key); |
| | } |
| |
|
| | size_type length () const |
| | { |
| | return PyMapping_Length (ptr()); |
| | } |
| |
|
| | bool hasKey (const std::string& s) const |
| | { |
| | return PyMapping_HasKeyString (ptr(),const_cast<char*>(s.c_str())) != 0; |
| | } |
| |
|
| | bool hasKey (const Object& s) const |
| | { |
| | return PyMapping_HasKey (ptr(), s.ptr()) != 0; |
| | } |
| |
|
| | T getItem (const std::string& s) const |
| | { |
| | return T( |
| | asObject(PyMapping_GetItemString (ptr(),const_cast<char*>(s.c_str()))) |
| | ); |
| | } |
| |
|
| | T getItem (const Object& s) const |
| | { |
| | return T( |
| | asObject(PyObject_GetItem (ptr(), s.ptr())) |
| | ); |
| | } |
| |
|
| | virtual void setItem (const char *s, const Object& ob) |
| | { |
| | if (PyMapping_SetItemString (ptr(), const_cast<char*>(s), *ob) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| |
|
| | virtual void setItem (const std::string& s, const Object& ob) |
| | { |
| | if (PyMapping_SetItemString (ptr(), const_cast<char*>(s.c_str()), *ob) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| |
|
| | virtual void setItem (const Object& s, const Object& ob) |
| | { |
| | if (PyObject_SetItem (ptr(), s.ptr(), ob.ptr()) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| |
|
| | void delItem (const std::string& s) |
| | { |
| | if (PyMapping_DelItemString (ptr(), const_cast<char*>(s.c_str())) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| |
|
| | void delItem (const Object& s) |
| | { |
| | if (PyMapping_DelItem (ptr(), *s) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | } |
| | |
| | List keys () const |
| | { |
| | static char keys[] = {'k', 'e', 'y', 's', 0}; |
| | return List(PyObject_CallMethod( ptr(), keys, NULL ), true ); |
| | } |
| |
|
| | List values () const |
| | { |
| | return List(PyMapping_Values(ptr()), true); |
| | } |
| |
|
| | List items () const |
| | { |
| | return List(PyMapping_Items(ptr()), true); |
| | } |
| |
|
| | class iterator |
| | { |
| | |
| | protected: |
| | typedef std::forward_iterator_tag iterator_category; |
| | typedef std::pair< const T, T > value_type; |
| | typedef int difference_type; |
| | typedef std::pair< const T, mapref<T> > pointer; |
| | typedef std::pair< const T, mapref<T> > reference; |
| |
|
| | friend class MapBase<T>; |
| | |
| | MapBase<T>* map; |
| | List keys; |
| | size_type pos; |
| |
|
| | private: |
| | iterator( MapBase<T>* m, List k, int p ) |
| | : map( m ) |
| | , keys( k ) |
| | , pos( p ) |
| | {} |
| |
|
| | public: |
| | ~iterator () |
| | {} |
| |
|
| | iterator () |
| | : map( 0 ) |
| | , keys() |
| | , pos() |
| | {} |
| |
|
| | iterator (MapBase<T>* m, bool end = false ) |
| | : map( m ) |
| | , keys( m->keys() ) |
| | , pos( end ? keys.length() : 0 ) |
| | {} |
| |
|
| | iterator (const iterator& other) |
| | : map( other.map ) |
| | , keys( other.keys ) |
| | , pos( other.pos ) |
| | {} |
| |
|
| | reference operator*() |
| | { |
| | Object key = keys[ pos ]; |
| | return std::make_pair(key, mapref<T>(*map,key)); |
| | } |
| |
|
| | iterator& operator=(const iterator& other) |
| | { |
| | if (this == &other) |
| | return *this; |
| | map = other.map; |
| | keys = other.keys; |
| | pos = other.pos; |
| | return *this; |
| | } |
| |
|
| | bool eql(const iterator& right) const |
| | { |
| | return map->ptr() == right.map->ptr() && pos == right.pos; |
| | } |
| | bool neq( const iterator& right ) const |
| | { |
| | return map->ptr() != right.map->ptr() || pos != right.pos; |
| | } |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | iterator& operator++ () |
| | { pos++; return *this;} |
| | |
| | iterator operator++ (int) |
| | { return iterator(map, keys, pos++);} |
| | |
| | iterator& operator-- () |
| | { pos--; return *this;} |
| | |
| | iterator operator-- (int) |
| | { return iterator(map, keys, pos--);} |
| |
|
| | std::string diagnose() const |
| | { |
| | std::OSTRSTREAM oss; |
| | oss << "iterator diagnosis " << map << ", " << pos << std::ends; |
| | return std::string(oss.str()); |
| | } |
| | }; |
| |
|
| | iterator begin () |
| | { |
| | return iterator(this); |
| | } |
| |
|
| | iterator end () |
| | { |
| | return iterator(this, true); |
| | } |
| |
|
| | class const_iterator |
| | { |
| | protected: |
| | typedef std::forward_iterator_tag iterator_category; |
| | typedef const std::pair< const T, T > value_type; |
| | typedef int difference_type; |
| | typedef const std::pair< const T, T > pointer; |
| | typedef const std::pair< const T, T > reference; |
| |
|
| | friend class MapBase<T>; |
| | const MapBase<T>* map; |
| | List keys; |
| | size_type pos; |
| |
|
| | private: |
| | const_iterator( const MapBase<T>* m, List k, int p ) |
| | : map( m ) |
| | , keys( k ) |
| | , pos( p ) |
| | {} |
| |
|
| | public: |
| | ~const_iterator () |
| | {} |
| |
|
| | const_iterator () |
| | : map( 0 ) |
| | , keys() |
| | , pos() |
| | {} |
| |
|
| | const_iterator (const MapBase<T>* m, bool end = false ) |
| | : map( m ) |
| | , keys( m->keys() ) |
| | , pos( end ? keys.length() : 0 ) |
| | {} |
| |
|
| | const_iterator(const const_iterator& other) |
| | : map( other.map ) |
| | , keys( other.keys ) |
| | , pos( other.pos ) |
| | {} |
| |
|
| | bool eql(const const_iterator& right) const |
| | { |
| | return map->ptr() == right.map->ptr() && pos == right.pos; |
| | } |
| |
|
| | bool neq( const const_iterator& right ) const |
| | { |
| | return map->ptr() != right.map->ptr() || pos != right.pos; |
| | } |
| |
|
| | const_reference operator*() |
| | { |
| | Object key = keys[ pos ]; |
| | return std::make_pair( key, mapref<T>( *map, key ) ); |
| | } |
| |
|
| | const_iterator& operator=(const const_iterator& other) |
| | { |
| | if (this == &other) return *this; |
| | map = other.map; |
| | keys = other.keys; |
| | pos = other.pos; |
| | return *this; |
| | } |
| |
|
| | |
| | const_iterator& operator++ () |
| | { pos++; return *this;} |
| | |
| | const_iterator operator++ (int) |
| | { return const_iterator(map, keys, pos++);} |
| | |
| | const_iterator& operator-- () |
| | { pos--; return *this;} |
| | |
| | const_iterator operator-- (int) |
| | { return const_iterator(map, keys, pos--);} |
| | }; |
| |
|
| | const_iterator begin () const |
| | { |
| | return const_iterator(this); |
| | } |
| |
|
| | const_iterator end () const |
| | { |
| | return const_iterator(this, true); |
| | } |
| |
|
| | }; |
| |
|
| | typedef MapBase<Object> Mapping; |
| |
|
| | template <TEMPLATE_TYPENAME T> bool operator==(const EXPLICIT_TYPENAME MapBase<T>::iterator& left, const EXPLICIT_TYPENAME MapBase<T>::iterator& right); |
| | template <TEMPLATE_TYPENAME T> bool operator!=(const EXPLICIT_TYPENAME MapBase<T>::iterator& left, const EXPLICIT_TYPENAME MapBase<T>::iterator& right); |
| | template <TEMPLATE_TYPENAME T> bool operator==(const EXPLICIT_TYPENAME MapBase<T>::const_iterator& left, const EXPLICIT_TYPENAME MapBase<T>::const_iterator& right); |
| | template <TEMPLATE_TYPENAME T> bool operator!=(const EXPLICIT_TYPENAME MapBase<T>::const_iterator& left, const EXPLICIT_TYPENAME MapBase<T>::const_iterator& right); |
| |
|
| | PYCXX_EXPORT extern bool operator==(const Mapping::iterator& left, const Mapping::iterator& right); |
| | PYCXX_EXPORT extern bool operator!=(const Mapping::iterator& left, const Mapping::iterator& right); |
| | PYCXX_EXPORT extern bool operator==(const Mapping::const_iterator& left, const Mapping::const_iterator& right); |
| | PYCXX_EXPORT extern bool operator!=(const Mapping::const_iterator& left, const Mapping::const_iterator& right); |
| |
|
| |
|
| | |
| | |
| | class PYCXX_EXPORT Dict: public Mapping |
| | { |
| | public: |
| | |
| | explicit Dict (PyObject *pyob, bool owned=false): Mapping (pyob, owned) |
| | { |
| | validate(); |
| | } |
| | Dict (const Object& ob): Mapping(ob) |
| | { |
| | validate(); |
| | } |
| | |
| | Dict () |
| | { |
| | set(PyDict_New (), true); |
| | validate(); |
| | } |
| | |
| |
|
| | Dict& operator= (const Object& rhs) |
| | { |
| | return (*this = *rhs); |
| | } |
| |
|
| | Dict& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set(rhsp); |
| | return *this; |
| | } |
| | |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && Py::_Dict_Check (pyob); |
| | } |
| | }; |
| |
|
| | class PYCXX_EXPORT Callable: public Object |
| | { |
| | public: |
| | |
| | explicit Callable (): Object() {} |
| | explicit Callable (PyObject *pyob, bool owned = false): Object (pyob, owned) |
| | { |
| | validate(); |
| | } |
| |
|
| | Callable (const Object& ob): Object(ob) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| |
|
| | Callable& operator= (const Object& rhs) |
| | { |
| | return (*this = *rhs); |
| | } |
| |
|
| | Callable& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set (rhsp); |
| | return *this; |
| | } |
| |
|
| | |
| | virtual bool accepts (PyObject *pyob) const |
| | { |
| | return pyob && PyCallable_Check (pyob); |
| | } |
| |
|
| | |
| | Object apply(const Tuple& args) const |
| | { |
| | PyObject *result = PyObject_CallObject( ptr(), args.ptr() ); |
| | if( result == NULL ) |
| | { |
| | throw Exception(); |
| | } |
| | return asObject( result ); |
| | } |
| |
|
| | |
| | Object apply(const Tuple& args, const Dict& kw) const |
| | { |
| | PyObject *result = PyEval_CallObjectWithKeywords( ptr(), args.ptr(), kw.ptr() ); |
| | if( result == NULL ) |
| | { |
| | throw Exception(); |
| | } |
| | return asObject( result ); |
| | } |
| |
|
| | Object apply(PyObject* pargs = 0) const |
| | { |
| | if( pargs == 0 ) |
| | { |
| | return apply( Tuple() ); |
| | } |
| | else |
| | { |
| | return apply( Tuple( pargs ) ); |
| | } |
| | } |
| | }; |
| |
|
| | class PYCXX_EXPORT Module: public Object |
| | { |
| | public: |
| | explicit Module (PyObject* pyob, bool owned = false): Object (pyob, owned) |
| | { |
| | validate(); |
| | } |
| |
|
| | |
| | explicit Module (const std::string&s): Object() |
| | { |
| | PyObject *m = PyImport_AddModule( const_cast<char *>(s.c_str()) ); |
| | set( m, false ); |
| | validate (); |
| | } |
| |
|
| | |
| | Module (const Module& ob): Object(*ob) |
| | { |
| | validate(); |
| | } |
| |
|
| | Module& operator= (const Object& rhs) |
| | { |
| | return (*this = *rhs); |
| | } |
| |
|
| | Module& operator= (PyObject* rhsp) |
| | { |
| | if(ptr() == rhsp) return *this; |
| | set(rhsp); |
| | return *this; |
| | } |
| |
|
| | Dict getDict() |
| | { |
| | return Dict(PyModule_GetDict(ptr())); |
| | |
| | } |
| | }; |
| |
|
| | |
| | inline Object Object::callMemberFunction( const std::string &function_name ) const |
| | { |
| | Callable target( getAttr( function_name ) ); |
| | Tuple args( (sequence_index_type)0 ); |
| | return target.apply( args ); |
| | } |
| |
|
| | inline Object Object::callMemberFunction( const std::string &function_name, const Tuple &args ) const |
| | { |
| | Callable target( getAttr( function_name ) ); |
| | return target.apply( args ); |
| | } |
| |
|
| | inline Object Object::callMemberFunction( const std::string &function_name, const Tuple &args, const Dict &kw ) const |
| | { |
| | Callable target( getAttr( function_name ) ); |
| | return target.apply( args, kw ); |
| | } |
| |
|
| | |
| | inline Object operator+ (const Object& a) |
| | { |
| | return asObject(PyNumber_Positive(*a)); |
| | } |
| | inline Object operator- (const Object& a) |
| | { |
| | return asObject(PyNumber_Negative(*a)); |
| | } |
| |
|
| | inline Object abs(const Object& a) |
| | { |
| | return asObject(PyNumber_Absolute(*a)); |
| | } |
| |
|
| | inline std::pair<Object,Object> coerce(const Object& a, const Object& b) |
| | { |
| | PyObject *p1, *p2; |
| | p1 = *a; |
| | p2 = *b; |
| | if(PyNumber_Coerce(&p1,&p2) == -1) |
| | { |
| | throw Exception(); |
| | } |
| | return std::pair<Object,Object>(asObject(p1), asObject(p2)); |
| | } |
| |
|
| | inline Object operator+ (const Object& a, const Object& b) |
| | { |
| | return asObject(PyNumber_Add(*a, *b)); |
| | } |
| | inline Object operator+ (const Object& a, int j) |
| | { |
| | return asObject(PyNumber_Add(*a, *Int(j))); |
| | } |
| | inline Object operator+ (const Object& a, double v) |
| | { |
| | return asObject(PyNumber_Add(*a, *Float(v))); |
| | } |
| | inline Object operator+ (int j, const Object& b) |
| | { |
| | return asObject(PyNumber_Add(*Int(j), *b)); |
| | } |
| | inline Object operator+ (double v, const Object& b) |
| | { |
| | return asObject(PyNumber_Add(*Float(v), *b)); |
| | } |
| |
|
| | inline Object operator- (const Object& a, const Object& b) |
| | { |
| | return asObject(PyNumber_Subtract(*a, *b)); |
| | } |
| | inline Object operator- (const Object& a, int j) |
| | { |
| | return asObject(PyNumber_Subtract(*a, *Int(j))); |
| | } |
| | inline Object operator- (const Object& a, double v) |
| | { |
| | return asObject(PyNumber_Subtract(*a, *Float(v))); |
| | } |
| | inline Object operator- (int j, const Object& b) |
| | { |
| | return asObject(PyNumber_Subtract(*Int(j), *b)); |
| | } |
| | inline Object operator- (double v, const Object& b) |
| | { |
| | return asObject(PyNumber_Subtract(*Float(v), *b)); |
| | } |
| |
|
| | inline Object operator* (const Object& a, const Object& b) |
| | { |
| | return asObject(PyNumber_Multiply(*a, *b)); |
| | } |
| | inline Object operator* (const Object& a, int j) |
| | { |
| | return asObject(PyNumber_Multiply(*a, *Int(j))); |
| | } |
| | inline Object operator* (const Object& a, double v) |
| | { |
| | return asObject(PyNumber_Multiply(*a, *Float(v))); |
| | } |
| | inline Object operator* (int j, const Object& b) |
| | { |
| | return asObject(PyNumber_Multiply(*Int(j), *b)); |
| | } |
| | inline Object operator* (double v, const Object& b) |
| | { |
| | return asObject(PyNumber_Multiply(*Float(v), *b)); |
| | } |
| |
|
| | inline Object operator/ (const Object& a, const Object& b) |
| | { |
| | return asObject(PyNumber_Divide(*a, *b)); |
| | } |
| | inline Object operator/ (const Object& a, int j) |
| | { |
| | return asObject(PyNumber_Divide(*a, *Int(j))); |
| | } |
| | inline Object operator/ (const Object& a, double v) |
| | { |
| | return asObject(PyNumber_Divide(*a, *Float(v))); |
| | } |
| | inline Object operator/ (int j, const Object& b) |
| | { |
| | return asObject(PyNumber_Divide(*Int(j), *b)); |
| | } |
| | inline Object operator/ (double v, const Object& b) |
| | { |
| | return asObject(PyNumber_Divide(*Float(v), *b)); |
| | } |
| |
|
| | inline Object operator% (const Object& a, const Object& b) |
| | { |
| | return asObject(PyNumber_Remainder(*a, *b)); |
| | } |
| | inline Object operator% (const Object& a, int j) |
| | { |
| | return asObject(PyNumber_Remainder(*a, *Int(j))); |
| | } |
| | inline Object operator% (const Object& a, double v) |
| | { |
| | return asObject(PyNumber_Remainder(*a, *Float(v))); |
| | } |
| | inline Object operator% (int j, const Object& b) |
| | { |
| | return asObject(PyNumber_Remainder(*Int(j), *b)); |
| | } |
| | inline Object operator% (double v, const Object& b) |
| | { |
| | return asObject(PyNumber_Remainder(*Float(v), *b)); |
| | } |
| |
|
| | inline Object type(const Exception&) |
| | { |
| | PyObject *ptype, *pvalue, *ptrace; |
| | PyErr_Fetch(&ptype, &pvalue, &ptrace); |
| | Object result; |
| | if(ptype) result = ptype; |
| | PyErr_Restore(ptype, pvalue, ptrace); |
| | return result; |
| | } |
| |
|
| | inline Object value(const Exception&) |
| | { |
| | PyObject *ptype, *pvalue, *ptrace; |
| | PyErr_Fetch(&ptype, &pvalue, &ptrace); |
| | Object result; |
| | if(pvalue) result = pvalue; |
| | PyErr_Restore(ptype, pvalue, ptrace); |
| | return result; |
| | } |
| |
|
| | inline Object trace(const Exception&) |
| | { |
| | PyObject *ptype, *pvalue, *ptrace; |
| | PyErr_Fetch(&ptype, &pvalue, &ptrace); |
| | Object result; |
| | if(ptrace) result = ptrace; |
| | PyErr_Restore(ptype, pvalue, ptrace); |
| | return result; |
| | } |
| |
|
| | template<TEMPLATE_TYPENAME T> |
| | String seqref<T>::str () const |
| | { |
| | return the_item.str(); |
| | } |
| |
|
| | template<TEMPLATE_TYPENAME T> |
| | String seqref<T>::repr () const |
| | { |
| | return the_item.repr(); |
| | } |
| |
|
| | } |
| | #endif |
| |
|