Java std::vector improvements for types that do not have a default constructor.
The std::vector wrappers have been changed to work by default for elements that are
not default insertable, i.e. have no default constructor. This has been achieved by
not wrapping:
vector(size_type n);
Previously the above had to be ignored via %ignore.
If the above constructor is still required it can be added back in again via %extend:
%extend std::vector {
vector(size_type count) { return new std::vector< T >(count); }
}
Alternatively, the following wrapped constructor could be used as it provides near-enough
equivalent functionality:
vector(jint count, const value_type& value);
The equivalent change to std::list has also been made (std::list
wrappers were not in the previous release [3.0.12] though).
This commit is contained in:
parent
9e29ae16d2
commit
be491506a4
7 changed files with 46 additions and 12 deletions
|
|
@ -7,6 +7,30 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
|
||||||
Version 4.0.0 (in progress)
|
Version 4.0.0 (in progress)
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
2019-02-28: wsfulton
|
||||||
|
[Java] std::vector improvements for types that do not have a default constructor.
|
||||||
|
|
||||||
|
The std::vector wrappers have been changed to work by default for elements that are
|
||||||
|
not default insertable, i.e. have no default constructor. This has been achieved by
|
||||||
|
not wrapping:
|
||||||
|
|
||||||
|
vector(size_type n);
|
||||||
|
|
||||||
|
Previously the above had to be ignored via %ignore.
|
||||||
|
|
||||||
|
If the above constructor is still required it can be added back in again via %extend:
|
||||||
|
|
||||||
|
%extend std::vector {
|
||||||
|
vector(size_type count) { return new std::vector< T >(count); }
|
||||||
|
}
|
||||||
|
|
||||||
|
Alternatively, the following wrapped constructor could be used as it provides near-enough
|
||||||
|
equivalent functionality:
|
||||||
|
|
||||||
|
vector(jint count, const value_type& value);
|
||||||
|
|
||||||
|
*** POTENTIAL INCOMPATIBILITY ***
|
||||||
|
|
||||||
2019-02-25: wsfulton
|
2019-02-25: wsfulton
|
||||||
[Python] Fix compile errors wrapping overloaded functions/constructors where a vararg
|
[Python] Fix compile errors wrapping overloaded functions/constructors where a vararg
|
||||||
function is declared after a non-vararg function.
|
function is declared after a non-vararg function.
|
||||||
|
|
|
||||||
|
|
@ -407,6 +407,7 @@ CPP_TEST_CASES += \
|
||||||
static_array_member \
|
static_array_member \
|
||||||
static_const_member \
|
static_const_member \
|
||||||
static_const_member_2 \
|
static_const_member_2 \
|
||||||
|
stl_no_default_constructor \
|
||||||
string_constants \
|
string_constants \
|
||||||
struct_initialization_cpp \
|
struct_initialization_cpp \
|
||||||
struct_value \
|
struct_value \
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ public class li_std_list_runme {
|
||||||
if (v1.size() != 0) throw new RuntimeException("v1 test (16) failed");
|
if (v1.size() != 0) throw new RuntimeException("v1 test (16) failed");
|
||||||
if (v1.remove(Integer.valueOf(456))) throw new RuntimeException("v1 test (17) failed");
|
if (v1.remove(Integer.valueOf(456))) throw new RuntimeException("v1 test (17) failed");
|
||||||
|
|
||||||
if (new IntList(3).size() != 3) throw new RuntimeException("constructor initial size test failed");
|
if (new IntList(3, 0).size() != 3) throw new RuntimeException("constructor initial size test failed");
|
||||||
for (int n : new IntList(10, 999))
|
for (int n : new IntList(10, 999))
|
||||||
if (n != 999) throw new RuntimeException("constructor initialization with value failed");
|
if (n != 999) throw new RuntimeException("constructor initialization with value failed");
|
||||||
for (int n : new IntList(new IntList(10, 999)))
|
for (int n : new IntList(new IntList(10, 999)))
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ public class li_std_vector_runme {
|
||||||
if (v1.size() != 0) throw new RuntimeException("v1 test (16) failed");
|
if (v1.size() != 0) throw new RuntimeException("v1 test (16) failed");
|
||||||
if (v1.remove(Integer.valueOf(456))) throw new RuntimeException("v1 test (17) failed");
|
if (v1.remove(Integer.valueOf(456))) throw new RuntimeException("v1 test (17) failed");
|
||||||
|
|
||||||
if (new IntVector(3).size() != 3) throw new RuntimeException("constructor initial size test failed");
|
if (new IntVector(3, 0).size() != 3) throw new RuntimeException("constructor initial size test failed");
|
||||||
for (int n : new IntVector(10, 999))
|
for (int n : new IntVector(10, 999))
|
||||||
if (n != 999) throw new RuntimeException("constructor initialization with value failed");
|
if (n != 999) throw new RuntimeException("constructor initialization with value failed");
|
||||||
for (int n : new IntVector(new IntVector(10, 999)))
|
for (int n : new IntVector(new IntVector(10, 999)))
|
||||||
|
|
|
||||||
19
Examples/test-suite/stl_no_default_constructor.i
Normal file
19
Examples/test-suite/stl_no_default_constructor.i
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
%module stl_no_default_constructor
|
||||||
|
|
||||||
|
%include <stl.i>
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
struct NoDefaultCtor {
|
||||||
|
int value;
|
||||||
|
NoDefaultCtor(int i) : value(i) {}
|
||||||
|
};
|
||||||
|
%}
|
||||||
|
|
||||||
|
#if defined(SWIGCSHARP) || defined(SWIGJAVA) || defined(SWIGD)
|
||||||
|
%template(VectorNoDefaultCtor) std::vector<NoDefaultCtor>;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SWIGJAVA)
|
||||||
|
%include <std_list.i>
|
||||||
|
%template(ListNoDefaultCtor) std::list<NoDefaultCtor>;
|
||||||
|
#endif
|
||||||
|
|
@ -198,11 +198,6 @@ namespace std {
|
||||||
|
|
||||||
%extend {
|
%extend {
|
||||||
%fragment("SWIG_ListSize");
|
%fragment("SWIG_ListSize");
|
||||||
list(jint count) throw (std::out_of_range) {
|
|
||||||
if (count < 0)
|
|
||||||
throw std::out_of_range("list count must be positive");
|
|
||||||
return new std::list<T>(static_cast<std::list<T>::size_type>(count));
|
|
||||||
}
|
|
||||||
|
|
||||||
list(jint count, const T &value) throw (std::out_of_range) {
|
list(jint count, const T &value) throw (std::out_of_range) {
|
||||||
if (count < 0)
|
if (count < 0)
|
||||||
|
|
|
||||||
|
|
@ -94,11 +94,6 @@ SWIGINTERN jint SWIG_VectorSize(size_t size) {
|
||||||
void clear();
|
void clear();
|
||||||
%extend {
|
%extend {
|
||||||
%fragment("SWIG_VectorSize");
|
%fragment("SWIG_VectorSize");
|
||||||
vector(jint count) throw (std::out_of_range) {
|
|
||||||
if (count < 0)
|
|
||||||
throw std::out_of_range("vector count must be positive");
|
|
||||||
return new std::vector< CTYPE >(static_cast<std::vector< CTYPE >::size_type>(count));
|
|
||||||
}
|
|
||||||
|
|
||||||
vector(jint count, const CTYPE &value) throw (std::out_of_range) {
|
vector(jint count, const CTYPE &value) throw (std::out_of_range) {
|
||||||
if (count < 0)
|
if (count < 0)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue