diff options
author | William S Fulton <wsf@fultondesigns.co.uk> | 2021-03-22 01:02:42 +0000 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2021-03-22 01:02:42 +0000 |
commit | cbfc0d15b1f5fcef1ee9a65dbee97f7859bd837f (patch) | |
tree | d20eca7e4aa00722d817b455608b4d4965409303 | |
parent | c2b2e9232c33421e2ec9bffca0be62f3f556ad91 (diff) | |
download | swig-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.java | 13 | ||||
-rw-r--r-- | Examples/test-suite/python/template_template_parameters_runme.py | 14 | ||||
-rw-r--r-- | Examples/test-suite/template_template_parameters.i | 31 | ||||
-rw-r--r-- | Source/Swig/stype.c | 31 |
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); |