diff --git a/src/lib/meta/typelistutil.hpp b/src/lib/meta/typelistutil.hpp index 1aa7b5451..5fcded832 100644 --- a/src/lib/meta/typelistutil.hpp +++ b/src/lib/meta/typelistutil.hpp @@ -154,24 +154,36 @@ namespace typelist { /** * splice a typelist like an overlay - * into an base typelist, starting at given index + * into an base typelist, starting at given index. + * @return either the combined (spliced) List, or + * the Front/Back part before or after the Overlay + * @note using a NullType as OVERLAY allows to extract + * an arbitrary Front/Back part of the list */ template - struct Overlay; + struct Splice; template - struct Overlay,Node,i>{ typedef Node,i-1>::List> List; }; + class OVERLAY, uint i> + struct Splice, OVERLAY, i> { typedef Node::List> List; + typedef Node::Front> Front; + typedef typename Splice::Back Back; }; template - struct Overlay,Node,0>{ typedef Node::List> List; }; + struct Splice,Node,0> { typedef Node::List> List; + typedef NullType Front; + typedef typename Splice::Back Back; }; - template - struct Overlay, NullType, i>{ typedef Node List; }; + template + struct Splice, NullType, 0> { typedef Node List; + typedef NullType Front; + typedef Node Back; }; template - struct Overlay { typedef NullType List; }; + struct Splice { typedef NullType List; + typedef NullType Front; + typedef NullType Back; }; diff --git a/tests/lib/meta/typelist-manip-test.cpp b/tests/lib/meta/typelist-manip-test.cpp index 2961ae664..9c86a2e34 100644 --- a/tests/lib/meta/typelist-manip-test.cpp +++ b/tests/lib/meta/typelist-manip-test.cpp @@ -98,7 +98,7 @@ namespace test { check_diagnostics (); check_apply (); check_append (); - check_overlay(); + check_splice (); check_filter (); check_prefix (); check_distribute(); @@ -155,51 +155,73 @@ namespace test { void - check_overlay () + check_splice () { typedef Types,Num<8> >::List OLi; // will "paste" the list OLi "on top" of another Typelist... - typedef Overlay Overl01; + typedef Splice Overl01; DISPLAY (Overl01); - typedef Overlay Overl02; + typedef Splice Overl02; DISPLAY (Overl02); - typedef Overlay Overl03; + typedef Splice Overl03; DISPLAY (Overl03); - typedef Overlay Overl04; + typedef Splice Overl04; DISPLAY (Overl04); - typedef Overlay Overl05; + typedef Splice Overl05; DISPLAY (Overl05); - typedef Overlay Overl06; + typedef Splice Overl06; DISPLAY (Overl06); - typedef Overlay Overl07; + typedef Splice Overl07; DISPLAY (Overl07); - typedef Overlay Overl08; + typedef Splice Overl08; DISPLAY (Overl08); - typedef Overlay Overl09; + typedef Splice Overl09; DISPLAY (Overl09); - typedef Overlay Overl10; + typedef Splice Overl10; DISPLAY (Overl10); - typedef Overlay Overl11; + typedef Splice Overl11; DISPLAY (Overl11); - typedef Overlay Overl12; + typedef Splice Overl12; DISPLAY (Overl12); - typedef Overlay Overl13; + typedef Splice Overl13; DISPLAY (Overl13); + + + typedef Types >::List OLi2; + typedef Splice::Front Front1; + typedef Splice::Front Front2; + typedef Splice::Front Front3; + DISPLAY (Front1); + DISPLAY (Front2); + DISPLAY (Front3); + typedef Splice::Back Back1; + typedef Splice::Back Back2; + typedef Splice::Back Back3; + DISPLAY (Back1); + DISPLAY (Back2); + DISPLAY (Back3); + + // Note: with a Null-Overlay, this can be used to extract arbitrary sublists: + typedef Splice::Front Front4; + typedef Splice::Back Back4; + DISPLAY (Front4); + DISPLAY (Back4); } + template struct AddConst2 { typedef X Type; }; template struct AddConst2 > { typedef Num Type; };