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:
parent
c8ff23de0c
commit
d613ef42f2
10 changed files with 259 additions and 134 deletions
|
|
@ -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 \
|
||||
|
|
|
|||
|
|
@ -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() {}
|
||||
};
|
||||
%}
|
||||
|
||||
|
|
|
|||
29
Examples/test-suite/cpp0x_initializer_list_extend.i
Normal file
29
Examples/test-suite/cpp0x_initializer_list_extend.i
Normal 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&) {}
|
||||
};
|
||||
%}
|
||||
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
import cpp0x_initializer_list_extend
|
||||
|
||||
c = cpp0x_initializer_list_extend.Container( [10, 20, 30, 40] )
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue