Rework std::initializer_list handling to warn about usage in any method, not just constructors. A typemap is used to issue the warning and can be overridden with user defined behaviour.

This commit is contained in:
William S Fulton 2013-02-04 07:12:05 +00:00
commit d613ef42f2
10 changed files with 259 additions and 134 deletions

View file

@ -486,6 +486,7 @@ CPP0X_TEST_CASES = \
cpp0x_explicit_conversion_operators \
cpp0x_function_objects \
cpp0x_initializer_list \
cpp0x_initializer_list_extend \
cpp0x_lambda_functions \
cpp0x_null_pointer_constant \
cpp0x_raw_string_literals \

View file

@ -1,22 +1,34 @@
/* This testcase checks whether SWIG correctly uses the new initializer_list
/* This testcase shows a few simple ways to deal with the new initializer_list
introduced in C++0x. */
%module cpp0x_initializer_list
%warnfilter(SWIGWARN_LANG_INITIALIZER_LIST) A;
%warnfilter(SWIGWARN_TYPEMAP_INITIALIZER_LIST) B::B;
%ignore A::A(std::initializer_list<int>);
%ignore B::method;
%typemap(in) std::initializer_list<const char *> {
$1 = {"Ab", "Fab"};
}
%inline %{
#include <initializer_list>
class A {
public:
A( std::initializer_list<int> ) {}
A(std::initializer_list<int>) {}
A() {}
A(double d) {}
};
class B {
public:
B( std::initializer_list<int>, std::initializer_list<double> ) {}
B(std::initializer_list<int>, std::initializer_list<double>) {}
B() {}
void method(std::initializer_list<int> init) {}
};
class C {
public:
C(std::initializer_list<const char *>) {}
C() {}
};
%}

View file

@ -0,0 +1,29 @@
/* This testcase shows how to replace std_initializer_list with std_vector. */
%module cpp0x_initializer_list_extend
%ignore Container::Container(std::initializer_list<int>);
%include <std_vector.i>
%template(VectorInt) std::vector<int>;
%extend Container {
Container(const std::vector<int> &elements) {
Container *c = new Container();
for (int element : elements)
c->push_back(element);
return c;
}
}
%inline %{
#include <initializer_list>
class Container {
public:
Container(std::initializer_list<int>) {}
Container() {}
void push_back(const int&) {}
};
%}

View file

@ -0,0 +1,4 @@
import cpp0x_initializer_list_extend
c = cpp0x_initializer_list_extend.Container( [10, 20, 30, 40] )