%module li_std_container_typemaps %include stl.i %include std_list.i %include std_deque.i %include std_set.i %include std_multiset.i %{ #include #include #include #include #include #include #include #include using namespace std; %} %inline %{ class ClassA { public: ClassA() : a(0) {} ClassA(int _a) : a(_a) {} ClassA(const ClassA& c) : a(c.a) {} int a; }; typedef ClassA* ClassAPtr; enum _Color { RED=1, GREEN=10, YELLOW=11, BLUE=100, MAGENTA=101, CYAN=111 }; typedef enum _Color Color; namespace std { template T binaryOperation(T x, T y) { return static_cast(x + y); } template<> bool binaryOperation(bool x, bool y) { return x | y; } template<> ClassAPtr binaryOperation(ClassAPtr x, ClassAPtr y) { if (x) y->a += x->a; return y; } template struct sequence_container { typedef typename SeqCont::value_type value_type; static SeqCont ret_container(const value_type value1, const value_type value2) { SeqCont s; s.insert(s.end(), value1); s.insert(s.end(), value2); return s; } static value_type val_container(const SeqCont container) { return std::accumulate(container.begin(), container.end(), value_type(), binaryOperation); } static value_type ref_container(const SeqCont& container) { return std::accumulate(container.begin(), container.end(), value_type(), binaryOperation); } }; template Container ret_container(const T value1, const T value2) { return sequence_container::ret_container(value1, value2); } template T val_container(const Container container) { return sequence_container::val_container(container); } template T ref_container(const Container& container) { return sequence_container::ref_container(container); } } %} %define %instantiate_containers_templates(TYPE...) namespace std { %template(TYPE ## _vector) std::vector; %template(TYPE ## _list) std::list; %template(TYPE ## _deque) std::deque; %template(TYPE ## _set) std::set; %template(TYPE ## _multiset) std::multiset; } %enddef %define %instantiate_containers_functions(TYPE...) namespace std { %template(ret_ ## TYPE ## _vector) ret_container >; %template(val_ ## TYPE ## _vector) val_container >; %template(ref_ ## TYPE ## _vector) ref_container >; %template(ret_ ## TYPE ## _list) ret_container >; %template(val_ ## TYPE ## _list) val_container >; %template(ref_ ## TYPE ## _list) ref_container >; %template(ret_ ## TYPE ## _deque) ret_container >; %template(val_ ## TYPE ## _deque) val_container >; %template(ref_ ## TYPE ## _deque) ref_container >; %template(ret_ ## TYPE ## _set) ret_container >; %template(val_ ## TYPE ## _set) val_container >; %template(ref_ ## TYPE ## _set) ref_container >; %template(ret_ ## TYPE ## _multiset) ret_container >; %template(val_ ## TYPE ## _multiset) val_container >; %template(ref_ ## TYPE ## _multiset) ref_container >; } %enddef %define %instantiate_containers_templates_and_functions(TYPE...) %instantiate_containers_templates(TYPE); %instantiate_containers_functions(TYPE); %enddef %instantiate_containers_templates_and_functions(int); %instantiate_containers_templates_and_functions(double); %instantiate_containers_templates_and_functions(float); %instantiate_containers_templates_and_functions(bool); %instantiate_containers_templates_and_functions(string); %instantiate_containers_templates_and_functions(ClassAPtr);