From df6312a581b20e5b80a5eea2ece9e6bf503bd583 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Mon, 15 Jun 2009 04:57:23 +0200 Subject: [PATCH] got it through the compiler... --- .../proc/control/command-basic-test.cpp | 162 ++++++++++++------ 1 file changed, 112 insertions(+), 50 deletions(-) diff --git a/tests/components/proc/control/command-basic-test.cpp b/tests/components/proc/control/command-basic-test.cpp index becee0e38..15c551834 100644 --- a/tests/components/proc/control/command-basic-test.cpp +++ b/tests/components/proc/control/command-basic-test.cpp @@ -226,19 +226,27 @@ namespace typelist{ typedef NullType ArgList_; typedef Tuple ThisTuple; typedef Tuple Tail; + enum { SIZE = 0 }; + + NullType getHead() { return NullType(); } + Tail& getTail() { return *this; } + + Tuple (HeadType const&, Tail const&) { } + Tuple () { } }; template struct Tuple > : Tuple { - typedef TY HeadType; - typedef typename Tuple::Type TailType; - typedef typename Prepend::Tuple Type; + typedef TY HeadType; + typedef typename Tuple::Type TailType; + typedef typename Prepend::Tuple Type; - typedef typename Node ArgList_; + typedef Node ArgList_; typedef Tuple ThisTuple; typedef Tuple Tail; + enum { SIZE = count::value }; Tuple ( TY a1 =TY() , Tail tail =Tail() @@ -251,14 +259,28 @@ namespace typelist{ Tail& getTail() { return static_cast (*this); } private: - T1 val_; + TY val_; }; + ////TODO move in sub-scope + template + struct Shifted + { + typedef typename TUP::Tail Tail; + typedef typename Shifted::TupleType TupleType; + }; + template + struct Shifted + { + typedef Tuple TupleType; + }; + + template< typename T1 - , typename T2 =NullType - , typename T3 =NullType - , typename T4 =NullType - , typename T5 =NullType + , typename T2 + , typename T3 + , typename T4 + , typename T5 > struct Tuple > : Tuple::List> @@ -270,6 +292,7 @@ namespace typelist{ typedef typename Type::List ArgList_; typedef Tuple ThisTuple; typedef Tuple Tail; + enum { SIZE = count::value }; Tuple ( T1 a1 =T1() , T2 a2 =T2() @@ -277,29 +300,33 @@ namespace typelist{ , T4 a4 =T4() , T5 a5 =T5() ) - : Tuple(a1,makeTuple(a2,a3,a4,a5)) + : Tuple(a1, Tuple(a2,a3,a4,a5)) { } - using ArgList_::getHead; - using ArgList_::getTail; - - template struct Shifted { typedef typename Tail::Shifted::Type Tuple; }; - template<> struct Shifted<0>{ typedef ThisTuple Tuple; }; + using Tuple::getHead; + using Tuple::getTail; template - typename Shifted::Tuple& + typename Shifted::TupleType& getShifted () { - typedef typename Shifted::Tuple TailI; - return static_cast (*this); + typedef typename Shifted::TupleType Tail_I; + return static_cast (*this); } template - typename Shifted::Tuple::HeadType& + typename Shifted::TupleType::HeadType& getAt () { return getShifted().getHead(); } + + NullType& + getNull() + { + static NullType nix; + return nix; + } }; @@ -323,27 +350,28 @@ namespace typelist{ */ template < typename TYPES - , template class _X_ - , class BASE =Tuple + , template class _X_ + , class BASE =Tuple + , uint i = 0 > class BuildTupleAccessor { - typedef typename Tuple Tuple; - typedef typename Tuple::TailType Tail; - typedef typename Tuple::HeadType Head; - typedef Head Tuple::*getElm(); - typedef BuildTupleAccessor NextBuilder; + typedef Tuple ArgTuple; + typedef typename ArgTuple::HeadType Head; + typedef typename ArgTuple::TailType Tail; +// typedef Head ArgTuple::*getElm(); + typedef BuildTupleAccessor NextBuilder; typedef typename NextBuilder::Accessor NextAccessor; - Tuple& argData_; + ArgTuple& argData_; public: /** type of the product created by this template. * Will be a subclass of BASE */ - typedef _X_ Accessor; + typedef _X_ Accessor; - BuildTupleAccessor (Tuple& tup) + BuildTupleAccessor (ArgTuple& tup) : argData_(tup) { } @@ -353,12 +381,13 @@ namespace typelist{ template < class BASE - , template class _X_ + , template class _X_ + , uint i > - class BuildTupleAccessor >, _X_> + class BuildTupleAccessor, _X_, BASE, i> { - typedef typename Tuple > Tuple; - typedef NullType Tuple::*getElm(); + typedef Tuple > ArgTuple; +// typedef NullType BASE::*getElm(); public: typedef _X_ Accessor; @@ -378,14 +407,14 @@ namespace typelist{ static RET invoke (FUN f, TUP & arg) { - return f (arg.getAt<1>()); + return f (arg.template getAt<1>()); } template static RET bind (FUN f, TUP & arg) { - return std::tr1::bind (f, arg.getAt<1>()); + return std::tr1::bind (f, arg.template getAt<1>()); } }; @@ -396,8 +425,8 @@ namespace typelist{ static RET invoke (FUN f, TUP & arg) { - return f ( arg.getAt<1>() - , arg.getAt<2>() + return f ( arg.template getAt<1>() + , arg.template getAt<2>() ); } @@ -405,8 +434,8 @@ namespace typelist{ static RET bind (FUN f, TUP & arg) { - return std::tr1::bind (f, arg.getAt<1>() - , arg.getAt<2>() + return std::tr1::bind (f, arg.template getAt<1>() + , arg.template getAt<2>() ); } }; @@ -418,9 +447,8 @@ namespace typelist{ typedef typename FunctionSignature< function >::Args Args; typedef typename FunctionSignature< function >::Ret Ret; - enum { ARG_CNT = count::value }; + enum { ARG_CNT = count::value }; - using tuple::Apply; /** storing a ref to the parameter tuple */ Tuple& params_; @@ -430,11 +458,11 @@ namespace typelist{ : params_(args) { } - function bind (SIG& f) { return Apply::bind (f, params_); } - function bind (function const& f) { return Apply::bind (f, params_); } + function bind (SIG& f) { return tuple::Apply::bind (f, params_); } + function bind (function const& f) { return tuple::Apply::bind (f, params_); } - Ret operator() (SIG& f) { return Apply::invoke (f, params_); } - Ret operator() (function const& f) { return Apply::invoke (f, params_); } + Ret operator() (SIG& f) { return tuple::Apply::invoke (f, params_); } + Ret operator() (function const& f) { return tuple::Apply::invoke (f, params_); } }; @@ -584,15 +612,25 @@ namespace test { }; - template + template struct ParamAccessor + : BASE { - + template + ParamAccessor(TUP& tuple) + : BASE(tuple) + { + cout << showSizeof(tuple.template getAt()) << endl; + } }; template struct ParamAccessor + : BASE { - + template + ParamAccessor(TUP& tuple) + : BASE(tuple) + { } }; template @@ -602,13 +640,14 @@ namespace test { typedef typename FunctionSignature< function >::Args Args; // typedef typename FunctionSignature< function >::Ret Ret; - typedef Tuple ArgTuple; + typedef Tuple ArgTuple; typedef BuildTupleAccessor BuildAccessor; typedef typename BuildAccessor::Accessor ParamStorageTuple; ParamStorageTuple params_; + public: Closure (ArgTuple& args) : params_(BuildAccessor(args)) { } @@ -663,6 +702,24 @@ namespace test { return *this; } + template + < typename T1 + , typename T2 + > + UndoDefinition& ///////TODO return here the completed Command + bind ( T1& p1 + , T2& p2 + ) + { + typedef Types ArgTypes; + Tuple params(p1,p2); + Closure clo (params); + + cout << showSizeof(clo) << endl; + UNIMPLEMENTED ("complete Command definition by closing all functions"); + return *this; + } + }; /** type re-binding helper: create a suitable UndoDefinition type, @@ -773,16 +830,21 @@ namespace test { run (Arg) { /////////////////////////////////TODO + defineCommands(); + checkExecution(); } void defineCommands () { + P