/trunk/Lib/std/std_common.i
Swig | 239 lines | 170 code | 41 blank | 28 comment | 0 complexity | ccf788ba0204a5bd961331409fd348d5 MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
- %include <std/std_except.i>
- //
- // Use the following macro with modern STL implementations
- //
- //#define SWIG_STD_MODERN_STL
- //
- // Use this to deactive the previous definition, when using gcc-2.95
- // or similar old compilers.
- //
- //#define SWIG_STD_NOMODERN_STL
- // Here, we identify compilers we know have problems with STL.
- %{
- #if defined(__GNUC__)
- # if __GNUC__ == 2 && __GNUC_MINOR <= 96
- # define SWIG_STD_NOMODERN_STL
- # endif
- #endif
- %}
- //
- // Common code for supporting the C++ std namespace
- //
- %{
- #include <string>
- #include <stdexcept>
- #include <stddef.h>
- %}
- %fragment("StdIteratorTraits","header",fragment="<stddef.h>") %{
- #if defined(__SUNPRO_CC) && defined(_RWSTD_VER)
- # if !defined(SWIG_NO_STD_NOITERATOR_TRAITS_STL)
- # define SWIG_STD_NOITERATOR_TRAITS_STL
- # endif
- #endif
- #if !defined(SWIG_STD_NOITERATOR_TRAITS_STL)
- #include <iterator>
- #else
- namespace std {
- template <class Iterator>
- struct iterator_traits {
- typedef ptrdiff_t difference_type;
- typedef typename Iterator::value_type value_type;
- };
- template <class Iterator, class Category,class T, class Reference, class Pointer, class Distance>
- struct iterator_traits<__reverse_bi_iterator<Iterator,Category,T,Reference,Pointer,Distance> > {
- typedef Distance difference_type;
- typedef T value_type;
- };
- template <class T>
- struct iterator_traits<T*> {
- typedef T value_type;
- typedef ptrdiff_t difference_type;
- };
- template<typename _InputIterator>
- inline typename iterator_traits<_InputIterator>::difference_type
- distance(_InputIterator __first, _InputIterator __last)
- {
- typename iterator_traits<_InputIterator>::difference_type __n = 0;
- while (__first != __last) {
- ++__first; ++__n;
- }
- return __n;
- }
- }
- #endif
- %}
- %fragment("StdTraitsCommon","header") %{
- namespace swig {
- template <class Type>
- struct noconst_traits {
- typedef Type noconst_type;
- };
- template <class Type>
- struct noconst_traits<const Type> {
- typedef Type noconst_type;
- };
- /*
- type categories
- */
- struct pointer_category { };
- struct value_category { };
- /*
- General traits that provides type_name and type_info
- */
- template <class Type> struct traits { };
- template <class Type>
- inline const char* type_name() {
- return traits<typename noconst_traits<Type >::noconst_type >::type_name();
- }
- template <class Type>
- struct traits_info {
- static swig_type_info *type_query(std::string name) {
- name += " *";
- return SWIG_TypeQuery(name.c_str());
- }
- static swig_type_info *type_info() {
- static swig_type_info *info = type_query(type_name<Type>());
- return info;
- }
- };
- template <class Type>
- inline swig_type_info *type_info() {
- return traits_info<Type>::type_info();
- }
- /*
- Partial specialization for pointers
- */
- template <class Type> struct traits <Type *> {
- typedef pointer_category category;
- static std::string make_ptr_name(const char* name) {
- std::string ptrname = name;
- ptrname += " *";
- return ptrname;
- }
- static const char* type_name() {
- static std::string name = make_ptr_name(swig::type_name<Type>());
- return name.c_str();
- }
- };
- template <class Type, class Category>
- struct traits_as { };
-
- template <class Type, class Category>
- struct traits_check { };
- }
- %}
-
- /*
- Generate the traits for a swigtype
- */
- %define %traits_swigtype(Type...)
- %fragment(SWIG_Traits_frag(Type),"header",fragment="StdTraits") {
- namespace swig {
- template <> struct traits<Type > {
- typedef pointer_category category;
- static const char* type_name() { return #Type; }
- };
- }
- }
- %enddef
- /*
- Generate the typemaps for a class that has 'value' traits
- */
- %define %typemap_traits(Code,Type...)
- %typemaps_asvalfrom(%arg(Code),
- %arg(swig::asval<Type >),
- %arg(swig::from),
- %arg(SWIG_Traits_frag(Type)),
- %arg(SWIG_Traits_frag(Type)),
- Type);
- %enddef
- /*
- Generate the typemaps for a class that behaves more like a 'pointer' or
- plain wrapped Swigtype.
- */
- %define %typemap_traits_ptr(Code,Type...)
- %typemaps_asptrfrom(%arg(Code),
- %arg(swig::asptr),
- %arg(swig::from),
- %arg(SWIG_Traits_frag(Type)),
- %arg(SWIG_Traits_frag(Type)),
- Type);
- %enddef
- /*
- Equality methods
- */
- %define %std_equal_methods(Type...)
- %extend Type {
- bool operator == (const Type& v) {
- return *self == v;
- }
-
- bool operator != (const Type& v) {
- return *self != v;
- }
- }
- %enddef
- /*
- Order methods
- */
- %define %std_order_methods(Type...)
- %extend Type {
- bool operator > (const Type& v) {
- return *self > v;
- }
-
- bool operator < (const Type& v) {
- return *self < v;
- }
- bool operator >= (const Type& v) {
- return *self >= v;
- }
- bool operator <= (const Type& v) {
- return *self <= v;
- }
- }
- %enddef
- /*
- Comparison methods
- */
- %define %std_comp_methods(Type...)
- %std_equal_methods(Type )
- %std_order_methods(Type )
- %enddef