swig/Examples/test-suite/li_std_set.i
Vadim Zeitlin 28c6140c56 Allow std::set<> C# typemaps to work for non-nullable types too
Notably make them work for primitive types, such as "int".

Doing this requires using "object" instead of the actual C# type of the
variable to store the current value in the iterator, as we don't
currently have a "csnullabletype" typemap that would expand to "T" for
nullable types and "T?" for the other ones. This is a bit ugly, but it
shouldn't matter much for the generated code and is already done in
std::vector<> typemaps.

Also add a simple unit test verifying the basic functionality for such
vectors.

Closes #1568.
2019-07-11 13:09:46 +02:00

57 lines
1.5 KiB
OpenEdge ABL

/*
* a test of set containers.
* Languages should define swig::LANGUAGE_OBJ to be
* an entity of their native pointer type which can be
* included in a STL container.
*
* For example:
* swig::LANGUAGE_OBJ is GC_VALUE in Ruby
* swig::LANGUAGE_OBJ is SwigPtr_PyObject in python
*/
%module li_std_set
%include <std_string.i>
%include <std_set.i>
%include <std_vector.i>
// Use language macros since Java and C# don't have multiset support (yet)
// and uses different naming conventions.
#if defined(SWIGRUBY) || defined(SWIGPYTHON)
%include <std_multiset.i>
%template(set_int) std::multiset<int>;
%template(v_int) std::vector<int>;
%template(set_string) std::set<std::string>;
#elif defined(SWIGJAVA) || defined(SWIGCSHARP)
// This operator is only defined because it's needed to store objects of
// type Foo in std::set in C++, we don't need to wrap it.
%ignore operator<;
%inline %{
struct Foo
{
explicit Foo(int n) : n(n) {}
int n;
friend bool operator<(Foo foo1, Foo foo2)
{
return foo1.n < foo2.n;
}
};
%}
// This one doesn't work in Java correctly yet.
#ifdef SWIGCSHARP
%template(IntSet) std::set<int>;
#endif
%template(StringSet) std::set<std::string>;
%template(FooSet) std::set<Foo>;
#endif
#if defined(SWIGRUBY)
%template(LanguageSet) std::set<swig::LANGUAGE_OBJ>;
#endif
#if defined(SWIGPYTHON)
%template(pyset) std::set<swig::SwigPtr_PyObject>;
#endif