summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2021-03-22 01:02:42 +0000
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2021-03-22 01:02:42 +0000
commitcbfc0d15b1f5fcef1ee9a65dbee97f7859bd837f (patch)
treed20eca7e4aa00722d817b455608b4d4965409303
parentc2b2e9232c33421e2ec9bffca0be62f3f556ad91 (diff)
downloadswig-cbfc0d15b1f5fcef1ee9a65dbee97f7859bd837f.tar.gz
Fix handling of Template template parameters
Closes #1977 Fixes #1603 Squashed commit of the following: commit 61f794184e127e4a4b46fb306b2dfea71f7cd7bb Author: goto40 <pierre.bayerl@googlemail.com> Date: Sat Mar 20 15:20:25 2021 +0100 added python version for second part of testcase commit bb80e236b8a7033d1ee45e392352ec0539730db3 Author: goto40 <pierre.bayerl@googlemail.com> Date: Sat Mar 20 15:10:14 2021 +0100 reworked comment in fixed code commit 5a94bcc481ea1c068b62a3dbc6cbc2032c9896db Author: goto40 <pierre.bayerl@googlemail.com> Date: Sat Mar 20 15:07:34 2021 +0100 removed new unittests; I switched to the official test cases commit 36603f3c8dd27ee7b27d4a40804a844e1964b5aa Author: goto40 <pierre.bayerl@googlemail.com> Date: Sat Mar 20 15:05:33 2021 +0100 removed new unittests; I switched to the official test cases commit 1f20ea00d22e6c59edb9ae69d6bb31aacab09c4b Author: goto40 <pierre.bayerl@googlemail.com> Date: Sat Mar 20 14:39:19 2021 +0100 adapted testcase commit ab492794c0f26a27761b205fe1d67e2e9aa1f5b6 Author: goto40 <pierre.bayerl@googlemail.com> Date: Sat Mar 20 14:29:10 2021 +0100 fixed test commit 9b5dd0c8f9b110a3492753b466e707d7f786c909 Author: goto40 <pierre.bayerl@googlemail.com> Date: Sat Mar 20 13:04:06 2021 +0100 C99 compatible comments commit 1a89425ac8c85d68c6af1974e07573b9468d421e Author: goto40 <pierre.bayerl@googlemail.com> Date: Sat Mar 20 11:41:48 2021 +0100 added extra checks to prevent accidental partial matches commit 20e76f511ac139c8ea2a9a7fd89c29391579665f Author: goto40 <pierre.bayerl@googlemail.com> Date: Thu Mar 18 21:42:56 2021 +0100 minor commit 0e383bbb764f9a019f62b9f620f80908dead50d2 Author: goto40 <pierre.bayerl@googlemail.com> Date: Thu Mar 18 21:41:45 2021 +0100 cleanup commit b644767121440c77f4caeb45f672e3c698ee9d78 Author: goto40 <pierre.bayerl@googlemail.com> Date: Thu Mar 18 21:39:43 2021 +0100 cleanup commit 2574468c0f9352040759e680214b40ee59b03650 Author: goto40 <pierre.bayerl@googlemail.com> Date: Thu Mar 18 21:38:35 2021 +0100 cleanup commit 9dc7f1ed30171649e8a70b12ff4f76d93e545074 Author: goto40 <pierre.bayerl@googlemail.com> Date: Thu Mar 18 21:35:28 2021 +0100 removed ide files commit a442a9df460c52d4dbf7adf8e4f0c5bc5ad3b0cf Author: goto40 <pierre.bayerl@googlemail.com> Date: Thu Mar 18 21:32:36 2021 +0100 removed printf commit da4c6e91e3b70e72e89cf09dfabfef7416274637 Author: goto40 <pierre.bayerl@googlemail.com> Date: Thu Mar 18 21:29:02 2021 +0100 possible fix found commit 6fad8d40e36195be422d5822e6f49d610e3ab693 Author: goto40 <pierre.bayerl@googlemail.com> Date: Thu Mar 18 21:01:11 2021 +0100 found difference between good/bad case... next: analyze why replacement did not work here... commit 72a7693340358d2067e63c5489191917ccb818dd Author: goto40 <pierre.bayerl@googlemail.com> Date: Wed Mar 17 22:43:08 2021 +0100 ideintified location where the template-template type is inserted in the final type (with the missing specialization). commit 1b53312c07ab0696d9cade144bdbad1c84ebf6a3 Author: goto40 <pierre.bayerl@googlemail.com> Date: Wed Mar 17 22:28:19 2021 +0100 more notes (to be reverted) commit a9a0b589389784e0e95dc6f9edd27c78a16b481d Author: goto40 <pierre.bayerl@googlemail.com> Date: Wed Mar 17 22:19:16 2021 +0100 some experiments (to be reverted) commit 0e7a24bbd5944d6e4f5c96ffd03003465f6d80f5 Author: goto40 <pierre.bayerl@googlemail.com> Date: Wed Mar 17 21:46:20 2021 +0100 added some notes commit 2f77911a12a38735cadeb93223981f3a6d9e7450 Author: goto40 <pierre.bayerl@googlemail.com> Date: Tue Mar 16 22:01:01 2021 +0100 comment changed commit 2cb7213b06f9b912c0ba56350ec6c318edba1ffb Author: goto40 <pierre.bayerl@googlemail.com> Date: Tue Mar 16 21:55:47 2021 +0100 renamed example template parameters to easily distinguish them. commit ff457d73977e05adf84b095bcfa1dccd21203c48 Author: goto40 <pierre.bayerl@googlemail.com> Date: Tue Mar 16 21:21:10 2021 +0100 added reset parser functionality (required for unittests, to reset parser) commit 617bbde3b4b3d9dd16d3a2d85041fc78a87ae81f Author: goto40 <pierre.bayerl@googlemail.com> Date: Tue Mar 16 20:47:41 2021 +0100 adjusted test for simple templates commit beb7e7f77cedd4ecfa4165534781d417710aff7e Author: goto40 <pierre.bayerl@googlemail.com> Date: Mon Mar 15 07:41:17 2021 +0100 added note how it should be... commit 7b3328431ce41f7ec05657c69d3cb1a886cb8437 Author: goto40 <pierre.bayerl@googlemail.com> Date: Sun Mar 14 17:07:24 2021 +0100 found a place which is maybe problematic for the template_template problem (#1603) commit 46c2443d15a6288318723b7e730687791475cf7b Author: goto40 <pierre.bayerl@googlemail.com> Date: Sun Mar 14 16:11:56 2021 +0100 unitests: reset parser for each testcase commit b3a0f1516ffdbf9f0fbb2d8362e2375fd1893c3f Author: goto40 <pierre.bayerl@googlemail.com> Date: Sun Mar 14 15:30:47 2021 +0100 first experiment with templates commit 32a11c6c77b840f11b9e926edd465e6a7108267f Author: goto40 <pierre.bayerl@googlemail.com> Date: Sun Mar 14 14:31:17 2021 +0100 wip commit 37b805ba6eaadb4a34a929204d539f555f8313be Author: goto40 <pierre.bayerl@googlemail.com> Date: Sun Mar 14 14:21:05 2021 +0100 integrated unittests in ctest commit 79f7bee168ecfbd2f2f5feeb9ca43fb7113bc2a4 Author: goto40 <pierre.bayerl@googlemail.com> Date: Sun Mar 14 14:18:26 2021 +0100 wip: new test created; problem: not in c++ mode commit 345d503d557d67fa431f528e637bac5816f50ab1 Author: goto40 <pierre.bayerl@googlemail.com> Date: Sun Mar 14 14:08:09 2021 +0100 cleanup test code commit 0a26adec10435af36bfad4e1f6a073460c63fbc6 Author: goto40 <pierre.bayerl@googlemail.com> Date: Sun Mar 14 14:05:24 2021 +0100 some more tests (first steps with c++ code) commit 6f628e0fa9e2659f5a7ca08b9954e81d4cd4f012 Author: goto40 <pierre.bayerl@googlemail.com> Date: Sun Mar 14 12:56:41 2021 +0100 experiments commit c4a13bf3e12cd83886cbc54e32194bf916a643d3 Author: goto40 <pierre.bayerl@googlemail.com> Date: Sat Mar 13 18:18:01 2021 +0100 first experiment commit 7d265861052f205d48b1ccec8ab0fe053de19858 Author: goto40 <pierre.bayerl@googlemail.com> Date: Sat Mar 13 17:23:13 2021 +0100 setup catch2 framework (w/o tests)
-rw-r--r--Examples/test-suite/java/template_template_parameters_runme.java13
-rw-r--r--Examples/test-suite/python/template_template_parameters_runme.py14
-rw-r--r--Examples/test-suite/template_template_parameters.i31
-rw-r--r--Source/Swig/stype.c31
4 files changed, 82 insertions, 7 deletions
diff --git a/Examples/test-suite/java/template_template_parameters_runme.java b/Examples/test-suite/java/template_template_parameters_runme.java
index 42135b982..6ccc858ac 100644
--- a/Examples/test-suite/java/template_template_parameters_runme.java
+++ b/Examples/test-suite/java/template_template_parameters_runme.java
@@ -14,15 +14,28 @@ public class template_template_parameters_runme {
}
public static void main(String argv[]) {
+ // Test first part
ListFastBool listBool = new ListFastBool();
listBool.setItem(true);
+ boolean x_boolean = listBool.getAllotype();
if (listBool.getItem() != true)
throw new RuntimeException("Failed");
ListDefaultDouble listDouble = new ListDefaultDouble();
listDouble.setItem(10.2);
+ double x_double = listDouble.getAllotype();
if (listDouble.getItem() != 10.2)
throw new RuntimeException("Failed");
+
+ // Test second part
+ FloatTestStruct floatTestStruct = new FloatTestStruct();
+ FloatContainer2 floatContainer2 = floatTestStruct.getX();
+ floatContainer2.setX(8.1f);
+ IntTestStruct intTestStruct = new IntTestStruct();
+ IntContainer1 intContainer1 = intTestStruct.getX();
+ intContainer1.setX(91);
+ if (intContainer1.getX()!=91)
+ throw new RuntimeException("Failed");
}
}
diff --git a/Examples/test-suite/python/template_template_parameters_runme.py b/Examples/test-suite/python/template_template_parameters_runme.py
new file mode 100644
index 000000000..4c018176e
--- /dev/null
+++ b/Examples/test-suite/python/template_template_parameters_runme.py
@@ -0,0 +1,14 @@
+from template_template_parameters import *
+
+# Test second part
+floatTestStruct = FloatTestStruct()
+floatContainer2 = floatTestStruct.x
+floatContainer2.x = 8.1
+intTestStruct = IntTestStruct()
+intContainer1 = intTestStruct.x
+intContainer1.x = 91
+if intContainer1.x!=91:
+ raise RuntimeError("Failed")
+if intTestStruct.x.x!=91:
+ raise RuntimeError("Failed")
+
diff --git a/Examples/test-suite/template_template_parameters.i b/Examples/test-suite/template_template_parameters.i
index 89197229e..3d8825697 100644
--- a/Examples/test-suite/template_template_parameters.i
+++ b/Examples/test-suite/template_template_parameters.i
@@ -2,6 +2,9 @@
%inline %{
+
+/* part 1 */
+
namespace pfc {
template<typename t_item, template <typename> class t_alloc> class array_t {};
template<typename t_item> class alloc_fast {
@@ -16,7 +19,7 @@
class list_tt : public list_impl_t<t_item,pfc::array_t<t_item,t_alloc> > {
public:
t_item item;
-// typename t_alloc<t_item>::alloc_type allotype; // SWIG can't handle this yet
+ typename t_alloc<t_item>::alloc_type allotype; // SWIG can handle this now
void xx() {
typename t_alloc<t_item>::alloc_type atype; // this type is the same as t_item type
atype = true;
@@ -29,11 +32,37 @@ void TestInstantiations() {
(void) myArrayInt;
(void) myListImplInt;
}
+
+/* part 2 */
+
+template<class T>
+struct Container1 {
+ T x;
+};
+template<class U>
+struct Container2 {
+ U x;
+};
+template<class BaseT, template<class> class TemplateTemplateT>
+struct TestStruct {
+ TemplateTemplateT<BaseT> x;
+};
+
%}
+/* part 1 */
%template(ListImplFastBool) list_impl_t<bool, pfc::array_t<bool, pfc::alloc_fast> >;
%template(ListFastBool) list_tt<bool, pfc::alloc_fast>;
%template(ListImplFastDouble) list_impl_t<double, pfc::array_t<double, pfc::alloc_fast> >;
%template(ListDefaultDouble) list_tt<double>;
+%template(BoolAllocFast) pfc::alloc_fast<bool>;
+%template(DoubleAllocFast) pfc::alloc_fast<double>;
+
+/* part 2 */
+%template(IntTestStruct) TestStruct<int, Container1>;
+%template(FloatTestStruct) TestStruct<float, Container2>;
+%template(IntContainer1) Container1<int>;
+%template(FloatContainer2) Container2<float>;
+
diff --git a/Source/Swig/stype.c b/Source/Swig/stype.c
index fbf02bb1f..1c7f6cc00 100644
--- a/Source/Swig/stype.c
+++ b/Source/Swig/stype.c
@@ -1290,12 +1290,31 @@ void SwigType_typename_replace(SwigType *t, String *pat, String *rep) {
/* Replaces a type of the form 'pat' with 'rep<args>' */
Replace(e, pat, rep, DOH_REPLACE_ANY);
} else if (SwigType_istemplate(e)) {
- /* Replaces a type of the form 'pat<args>' with 'rep' */
- if (Equal(e, pat)) {
- String *repbase = SwigType_templateprefix(rep);
- Replace(e, pat, repbase, DOH_REPLACE_ID | DOH_REPLACE_FIRST);
- Delete(repbase);
- }
+ /* Replaces a type of the form 'pat<args>' with 'rep' */
+ {
+ /* To match "e=TemplateTemplateT<(float)>"
+ * with "pat=TemplateTemplateT"
+ * we need to compare only the first part of the string e.
+ */
+ int len = DohLen(pat);
+
+ /* DohLen(e) > len, not >= (because we expecte at least a
+ * character '<' following the template typename)
+ */
+ if (DohLen(e)>len) {
+ String *firstPartOfType = NewStringWithSize(e, len);
+ const char* e_as_char = DohData(e);
+
+ if (Equal(firstPartOfType, pat) && e_as_char[len]=='<') {
+ String *repbase = SwigType_templateprefix(rep);
+ Replace(e, pat, repbase, DOH_REPLACE_ID | DOH_REPLACE_FIRST);
+ Delete(repbase);
+ }
+ Delete(firstPartOfType);
+
+ }
+ }
+
{
String *tsuffix;
List *tparms = SwigType_parmlist(e);