1 //-----------------------------------------------------------------------------
3 // Copyright (c) 1998 - 2007, The Regents of the University of California
4 // Produced at the Lawrence Livermore National Laboratory
5 // All rights reserved.
7 // This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The
8 // full copyright notice is contained in the file COPYRIGHT located at the root
9 // of the PyCXX distribution.
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are met:
14 // - Redistributions of source code must retain the above copyright notice,
15 // this list of conditions and the disclaimer below.
16 // - Redistributions in binary form must reproduce the above copyright notice,
17 // this list of conditions and the disclaimer (as noted below) in the
18 // documentation and/or materials provided with the distribution.
19 // - Neither the name of the UC/LLNL nor the names of its contributors may be
20 // used to endorse or promote products derived from this software without
21 // specific prior written permission.
23 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 // ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF
27 // CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR
28 // ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
36 //-----------------------------------------------------------------------------
38 #include "CXX/Objects.hxx"
42 Py_UNICODE unicode_null_string
[1] = { 0 };
44 Type
Object::type() const
46 return Type( PyObject_Type( p
), true );
49 String
Object::str() const
51 return String( PyObject_Str( p
), true );
54 String
Object::repr() const
56 return String( PyObject_Repr( p
), true );
59 std::string
Object::as_string() const
61 return static_cast<std::string
>( str() );
64 List
Object::dir() const
66 return List( PyObject_Dir( p
), true );
69 bool Object::isType( const Type
&t
) const
71 return type().ptr() == t
.ptr();
74 Char::operator String() const
76 return String( ptr() );
79 String
Bytes::decode( const char *encoding
, const char *error
)
81 return String( PyUnicode_FromEncodedObject( ptr(), encoding
, error
), true );
85 bool operator==( const Object
&o1
, const Object
&o2
)
87 int k
= PyObject_RichCompareBool( *o1
, *o2
, Py_EQ
);
88 if( PyErr_Occurred() )
93 bool operator!=( const Object
&o1
, const Object
&o2
)
95 int k
= PyObject_RichCompareBool( *o1
, *o2
, Py_NE
);
96 if( PyErr_Occurred() )
102 bool operator>=( const Object
&o1
, const Object
&o2
)
104 int k
= PyObject_RichCompareBool( *o1
, *o2
, Py_GE
);
105 if( PyErr_Occurred() )
110 bool operator<=( const Object
&o1
, const Object
&o2
)
112 int k
= PyObject_RichCompareBool( *o1
, *o2
, Py_LE
);
113 if( PyErr_Occurred() )
118 bool operator<( const Object
&o1
, const Object
&o2
)
120 int k
= PyObject_RichCompareBool( *o1
, *o2
, Py_LT
);
121 if( PyErr_Occurred() )
126 bool operator>( const Object
&o1
, const Object
&o2
)
128 int k
= PyObject_RichCompareBool( *o1
, *o2
, Py_GT
);
129 if( PyErr_Occurred() )
135 bool operator==( const Sequence::iterator
&left
, const Sequence::iterator
&right
)
137 return left
.eql( right
);
140 bool operator!=( const Sequence::iterator
&left
, const Sequence::iterator
&right
)
142 return left
.neq( right
);
145 bool operator<( const Sequence::iterator
&left
, const Sequence::iterator
&right
)
147 return left
.lss( right
);
150 bool operator>( const Sequence::iterator
&left
, const Sequence::iterator
&right
)
152 return left
.gtr( right
);
155 bool operator<=( const Sequence::iterator
&left
, const Sequence::iterator
&right
)
157 return left
.leq( right
);
160 bool operator>=( const Sequence::iterator
&left
, const Sequence::iterator
&right
)
162 return left
.geq( right
);
165 // const_iterator compares
166 bool operator==( const Sequence::const_iterator
&left
, const Sequence::const_iterator
&right
)
168 return left
.eql( right
);
171 bool operator!=( const Sequence::const_iterator
&left
, const Sequence::const_iterator
&right
)
173 return left
.neq( right
);
176 bool operator<( const Sequence::const_iterator
&left
, const Sequence::const_iterator
&right
)
178 return left
.lss( right
);
181 bool operator>( const Sequence::const_iterator
&left
, const Sequence::const_iterator
&right
)
183 return left
.gtr( right
);
186 bool operator<=( const Sequence::const_iterator
&left
, const Sequence::const_iterator
&right
)
188 return left
.leq( right
);
191 bool operator>=( const Sequence::const_iterator
&left
, const Sequence::const_iterator
&right
)
193 return left
.geq( right
);
197 bool operator==( const Mapping::iterator
&left
, const Mapping::iterator
&right
)
199 return left
.eql( right
);
202 bool operator!=( const Mapping::iterator
&left
, const Mapping::iterator
&right
)
204 return left
.neq( right
);
207 // now for const_iterator
208 bool operator==( const Mapping::const_iterator
&left
, const Mapping::const_iterator
&right
)
210 return left
.eql( right
);
213 bool operator!=( const Mapping::const_iterator
&left
, const Mapping::const_iterator
&right
)
215 return left
.neq( right
);
218 // TMM: 31May'01 - Added the #ifndef so I can exclude iostreams.
219 #ifndef CXX_NO_IOSTREAMS
222 std::ostream
&operator<<( std::ostream
&os
, const Object
&ob
)
224 return( os
<< static_cast<std::string
>( ob
.str() ) );