You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
244 lines
4.9 KiB
244 lines
4.9 KiB
%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 now have problems with STL. |
|
%{ |
|
|
|
#if defined(__SUNPRO_CC) && defined(_RWSTD_VER) |
|
# define SWIG_STD_NOASSIGN_STL |
|
# define SWIG_STD_NOINSERT_TEMPLATE_STL |
|
# define SWIG_STD_NOITERATOR_TRAITS_STL |
|
#endif |
|
|
|
#if defined(__GNUC__) |
|
# if __GNUC__ == 2 && __GNUC_MINOR <= 96 |
|
# define SWIG_STD_NOMODERN_STL |
|
# endif |
|
#endif |
|
|
|
|
|
%} |
|
|
|
// |
|
// Common code for supporting the STD C++ namespace |
|
// |
|
|
|
%{ |
|
#include <string> |
|
#include <stdexcept> |
|
%} |
|
|
|
|
|
%fragment("StdIteratorTraits","header") %{ |
|
#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; |
|
}; |
|
|
|
#if defined(__SUNPRO_CC) && defined(_RWSTD_VER) |
|
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; |
|
}; |
|
#endif |
|
|
|
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 |
|
|
|
|