Factory.h

00001 
00002 // The Loki Library
00003 // Copyright (c) 2001 by Andrei Alexandrescu
00004 // Copyright (c) 2005 by Peter Kuemmel
00005 // This code DOES NOT accompany the book:
00006 // Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design
00007 //     Patterns Applied". Copyright (c) 2001. Addison-Wesley.
00008 //
00009 // Code covered by the MIT License
00010 // The authors make no representations about the suitability of this software
00011 // for any purpose. It is provided "as is" without express or implied warranty.
00013 #ifndef LOKI_FACTORYPARM_INC_
00014 #define LOKI_FACTORYPARM_INC_
00015 
00016 // $Id: Factory.h 788 2006-11-24 22:30:54Z clitte_bbt $
00017 
00018 
00019 #include "LokiTypeInfo.h"
00020 #include "Functor.h"
00021 #include "AssocVector.h"
00022 #include "SmallObj.h"
00023 #include "Sequence.h"
00024 
00025 #ifdef _MSC_VER
00026 #pragma warning(push)
00027 #pragma warning(disable: 4702)
00028 //unreachable code if OnUnknownType throws an exception
00029 #endif
00030 
00076 namespace Loki
00077 {
00078 
00090     template <typename IdentifierType, class AbstractProduct>
00091     struct DefaultFactoryError
00092     {
00093         struct Exception : public std::exception
00094         {
00095             const char* what() const throw() { return "Unknown Type"; }
00096         };
00097 
00098         static AbstractProduct* OnUnknownType(IdentifierType)
00099         {
00100             throw Exception();
00101         }
00102     };
00103 
00104 
00105 #define LOKI_ENABLE_NEW_FACTORY_CODE
00106 #ifdef LOKI_ENABLE_NEW_FACTORY_CODE
00107 
00108 
00110 // class template FunctorImpl
00112 
00113     struct FactoryImplBase
00114     {
00115         typedef EmptyType Parm1;
00116         typedef EmptyType Parm2;
00117         typedef EmptyType Parm3;
00118         typedef EmptyType Parm4;
00119         typedef EmptyType Parm5;
00120         typedef EmptyType Parm6;
00121         typedef EmptyType Parm7;
00122         typedef EmptyType Parm8;
00123         typedef EmptyType Parm9;
00124         typedef EmptyType Parm10;
00125         typedef EmptyType Parm11;
00126         typedef EmptyType Parm12;
00127         typedef EmptyType Parm13;
00128         typedef EmptyType Parm14;
00129         typedef EmptyType Parm15;
00130     };
00131 
00132     template <typename AP, typename Id, typename TList >
00133     struct FactoryImpl;
00134 
00135     template<typename AP, typename Id>
00136     struct FactoryImpl<AP, Id, NullType>
00137                 : public FactoryImplBase
00138     {
00139         virtual ~FactoryImpl() {}
00140         virtual AP* CreateObject(const Id & id ) = 0;
00141     };
00142 template <typename AP, typename Id, typename P1 >
00143     struct FactoryImpl<AP,Id, Seq<P1> >
00144                 : public FactoryImplBase
00145     {
00146         typedef typename TypeTraits<P1>::ParameterType Parm1;
00147         virtual ~FactoryImpl() {}
00148         virtual AP* CreateObject(const Id& id,Parm1 ) = 0;
00149     };
00150 
00151     template<typename AP, typename Id, typename P1,typename P2 >
00152     struct FactoryImpl<AP, Id, Seq<P1, P2> >
00153                 : public FactoryImplBase
00154     {
00155         typedef typename TypeTraits<P1>::ParameterType Parm1;
00156         typedef typename TypeTraits<P2>::ParameterType Parm2;
00157         virtual ~FactoryImpl() {}
00158         virtual AP* CreateObject(const Id& id,Parm1, Parm2 ) = 0;
00159     };
00160 
00161     template<typename AP, typename Id, typename P1,typename P2,typename P3 >
00162     struct FactoryImpl<AP, Id, Seq<P1, P2, P3> >
00163                 : public FactoryImplBase
00164     {
00165         typedef typename TypeTraits<P1>::ParameterType Parm1;
00166         typedef typename TypeTraits<P2>::ParameterType Parm2;
00167         typedef typename TypeTraits<P3>::ParameterType Parm3;
00168         virtual ~FactoryImpl() {}
00169         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3 ) = 0;
00170     };
00171 
00172     template<typename AP, typename Id, typename P1,typename P2,typename P3,typename P4 >
00173     struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4> >
00174                 : public FactoryImplBase
00175     {
00176         typedef typename TypeTraits<P1>::ParameterType Parm1;
00177         typedef typename TypeTraits<P2>::ParameterType Parm2;
00178         typedef typename TypeTraits<P3>::ParameterType Parm3;
00179         typedef typename TypeTraits<P4>::ParameterType Parm4;
00180         virtual ~FactoryImpl() {}
00181         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4 ) = 0;
00182     };
00183 
00184     template<typename AP, typename Id,
00185     typename P1,typename P2,typename P3,typename P4,typename P5 >
00186     struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5> >
00187                 : public FactoryImplBase
00188     {
00189         typedef typename TypeTraits<P1>::ParameterType Parm1;
00190         typedef typename TypeTraits<P2>::ParameterType Parm2;
00191         typedef typename TypeTraits<P3>::ParameterType Parm3;
00192         typedef typename TypeTraits<P4>::ParameterType Parm4;
00193         typedef typename TypeTraits<P5>::ParameterType Parm5;
00194         virtual ~FactoryImpl() {}
00195         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5 ) = 0;
00196     };
00197 
00198     template<typename AP, typename Id,
00199     typename P1,typename P2,typename P3,typename P4,typename P5,
00200     typename P6>
00201     struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6> >
00202                 : public FactoryImplBase
00203     {
00204         typedef typename TypeTraits<P1>::ParameterType Parm1;
00205         typedef typename TypeTraits<P2>::ParameterType Parm2;
00206         typedef typename TypeTraits<P3>::ParameterType Parm3;
00207         typedef typename TypeTraits<P4>::ParameterType Parm4;
00208         typedef typename TypeTraits<P5>::ParameterType Parm5;
00209         typedef typename TypeTraits<P6>::ParameterType Parm6;
00210         virtual ~FactoryImpl() {}
00211         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00212                                 Parm6 )
00213         = 0;
00214     };
00215 
00216     template<typename AP, typename Id,
00217     typename P1,typename P2,typename P3,typename P4,typename P5,
00218     typename P6,typename P7>
00219     struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7> >
00220                 : public FactoryImplBase
00221     {
00222         typedef typename TypeTraits<P1>::ParameterType Parm1;
00223         typedef typename TypeTraits<P2>::ParameterType Parm2;
00224         typedef typename TypeTraits<P3>::ParameterType Parm3;
00225         typedef typename TypeTraits<P4>::ParameterType Parm4;
00226         typedef typename TypeTraits<P5>::ParameterType Parm5;
00227         typedef typename TypeTraits<P6>::ParameterType Parm6;
00228         typedef typename TypeTraits<P7>::ParameterType Parm7;
00229         virtual ~FactoryImpl() {}
00230         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00231                                 Parm6, Parm7 )
00232         = 0;
00233     };
00234 
00235     template<typename AP, typename Id,
00236     typename P1,typename P2,typename P3,typename P4,typename P5,
00237     typename P6,typename P7,typename P8>
00238     struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8> >
00239                 : public FactoryImplBase
00240     {
00241         typedef typename TypeTraits<P1>::ParameterType Parm1;
00242         typedef typename TypeTraits<P2>::ParameterType Parm2;
00243         typedef typename TypeTraits<P3>::ParameterType Parm3;
00244         typedef typename TypeTraits<P4>::ParameterType Parm4;
00245         typedef typename TypeTraits<P5>::ParameterType Parm5;
00246         typedef typename TypeTraits<P6>::ParameterType Parm6;
00247         typedef typename TypeTraits<P7>::ParameterType Parm7;
00248         typedef typename TypeTraits<P8>::ParameterType Parm8;
00249         virtual ~FactoryImpl() {}
00250         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00251                                 Parm6, Parm7, Parm8)
00252         = 0;
00253     };
00254 
00255     template<typename AP, typename Id,
00256     typename P1,typename P2,typename P3,typename P4,typename P5,
00257     typename P6,typename P7,typename P8,typename P9>
00258     struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9> >
00259                 : public FactoryImplBase
00260     {
00261         typedef typename TypeTraits<P1>::ParameterType Parm1;
00262         typedef typename TypeTraits<P2>::ParameterType Parm2;
00263         typedef typename TypeTraits<P3>::ParameterType Parm3;
00264         typedef typename TypeTraits<P4>::ParameterType Parm4;
00265         typedef typename TypeTraits<P5>::ParameterType Parm5;
00266         typedef typename TypeTraits<P6>::ParameterType Parm6;
00267         typedef typename TypeTraits<P7>::ParameterType Parm7;
00268         typedef typename TypeTraits<P8>::ParameterType Parm8;
00269         typedef typename TypeTraits<P9>::ParameterType Parm9;
00270         virtual ~FactoryImpl() {}
00271         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00272                                 Parm6, Parm7, Parm8, Parm9)
00273         = 0;
00274     };
00275 
00276     template<typename AP, typename Id,
00277     typename P1,typename P2,typename P3,typename P4,typename P5,
00278     typename P6,typename P7,typename P8,typename P9,typename P10>
00279     struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> >
00280                 : public FactoryImplBase
00281     {
00282         typedef typename TypeTraits<P1>::ParameterType Parm1;
00283         typedef typename TypeTraits<P2>::ParameterType Parm2;
00284         typedef typename TypeTraits<P3>::ParameterType Parm3;
00285         typedef typename TypeTraits<P4>::ParameterType Parm4;
00286         typedef typename TypeTraits<P5>::ParameterType Parm5;
00287         typedef typename TypeTraits<P6>::ParameterType Parm6;
00288         typedef typename TypeTraits<P7>::ParameterType Parm7;
00289         typedef typename TypeTraits<P8>::ParameterType Parm8;
00290         typedef typename TypeTraits<P9>::ParameterType Parm9;
00291         typedef typename TypeTraits<P10>::ParameterType Parm10;
00292         virtual ~FactoryImpl() {}
00293         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00294                                 Parm6, Parm7, Parm8, Parm9,Parm10)
00295         = 0;
00296     };
00297 
00298     template<typename AP, typename Id,
00299     typename P1,typename P2,typename P3,typename P4,typename P5,
00300     typename P6,typename P7,typename P8,typename P9,typename P10,
00301     typename P11>
00302     struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11> >
00303                 : public FactoryImplBase
00304     {
00305         typedef typename TypeTraits<P1>::ParameterType Parm1;
00306         typedef typename TypeTraits<P2>::ParameterType Parm2;
00307         typedef typename TypeTraits<P3>::ParameterType Parm3;
00308         typedef typename TypeTraits<P4>::ParameterType Parm4;
00309         typedef typename TypeTraits<P5>::ParameterType Parm5;
00310         typedef typename TypeTraits<P6>::ParameterType Parm6;
00311         typedef typename TypeTraits<P7>::ParameterType Parm7;
00312         typedef typename TypeTraits<P8>::ParameterType Parm8;
00313         typedef typename TypeTraits<P9>::ParameterType Parm9;
00314         typedef typename TypeTraits<P10>::ParameterType Parm10;
00315         typedef typename TypeTraits<P11>::ParameterType Parm11;
00316         virtual ~FactoryImpl() {}
00317         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00318                                 Parm6, Parm7, Parm8, Parm9,Parm10,
00319                                 Parm11)
00320         = 0;
00321     };
00322 
00323     template<typename AP, typename Id,
00324     typename P1,typename P2,typename P3,typename P4,typename P5,
00325     typename P6,typename P7,typename P8,typename P9,typename P10,
00326     typename P11,typename P12>
00327     struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12> >
00328                 : public FactoryImplBase
00329     {
00330         typedef typename TypeTraits<P1>::ParameterType Parm1;
00331         typedef typename TypeTraits<P2>::ParameterType Parm2;
00332         typedef typename TypeTraits<P3>::ParameterType Parm3;
00333         typedef typename TypeTraits<P4>::ParameterType Parm4;
00334         typedef typename TypeTraits<P5>::ParameterType Parm5;
00335         typedef typename TypeTraits<P6>::ParameterType Parm6;
00336         typedef typename TypeTraits<P7>::ParameterType Parm7;
00337         typedef typename TypeTraits<P8>::ParameterType Parm8;
00338         typedef typename TypeTraits<P9>::ParameterType Parm9;
00339         typedef typename TypeTraits<P10>::ParameterType Parm10;
00340         typedef typename TypeTraits<P11>::ParameterType Parm11;
00341         typedef typename TypeTraits<P12>::ParameterType Parm12;
00342         virtual ~FactoryImpl() {}
00343         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00344                                 Parm6, Parm7, Parm8, Parm9,Parm10,
00345                                 Parm11,Parm12)
00346         = 0;
00347     };
00348 
00349     template<typename AP, typename Id,
00350     typename P1,typename P2,typename P3,typename P4,typename P5,
00351     typename P6,typename P7,typename P8,typename P9,typename P10,
00352     typename P11,typename P12,typename P13>
00353     struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13> >
00354                 : public FactoryImplBase
00355     {
00356         typedef typename TypeTraits<P1>::ParameterType Parm1;
00357         typedef typename TypeTraits<P2>::ParameterType Parm2;
00358         typedef typename TypeTraits<P3>::ParameterType Parm3;
00359         typedef typename TypeTraits<P4>::ParameterType Parm4;
00360         typedef typename TypeTraits<P5>::ParameterType Parm5;
00361         typedef typename TypeTraits<P6>::ParameterType Parm6;
00362         typedef typename TypeTraits<P7>::ParameterType Parm7;
00363         typedef typename TypeTraits<P8>::ParameterType Parm8;
00364         typedef typename TypeTraits<P9>::ParameterType Parm9;
00365         typedef typename TypeTraits<P10>::ParameterType Parm10;
00366         typedef typename TypeTraits<P11>::ParameterType Parm11;
00367         typedef typename TypeTraits<P12>::ParameterType Parm12;
00368         typedef typename TypeTraits<P13>::ParameterType Parm13;
00369         virtual ~FactoryImpl() {}
00370         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00371                                 Parm6, Parm7, Parm8, Parm9,Parm10,
00372                                 Parm11,Parm12,Parm13)
00373         = 0;
00374     };
00375 
00376     template<typename AP, typename Id,
00377     typename P1,typename P2,typename P3,typename P4,typename P5,
00378     typename P6,typename P7,typename P8,typename P9,typename P10,
00379     typename P11,typename P12,typename P13,typename P14>
00380     struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14> >
00381                 : public FactoryImplBase
00382     {
00383         typedef typename TypeTraits<P1>::ParameterType Parm1;
00384         typedef typename TypeTraits<P2>::ParameterType Parm2;
00385         typedef typename TypeTraits<P3>::ParameterType Parm3;
00386         typedef typename TypeTraits<P4>::ParameterType Parm4;
00387         typedef typename TypeTraits<P5>::ParameterType Parm5;
00388         typedef typename TypeTraits<P6>::ParameterType Parm6;
00389         typedef typename TypeTraits<P7>::ParameterType Parm7;
00390         typedef typename TypeTraits<P8>::ParameterType Parm8;
00391         typedef typename TypeTraits<P9>::ParameterType Parm9;
00392         typedef typename TypeTraits<P10>::ParameterType Parm10;
00393         typedef typename TypeTraits<P11>::ParameterType Parm11;
00394         typedef typename TypeTraits<P12>::ParameterType Parm12;
00395         typedef typename TypeTraits<P13>::ParameterType Parm13;
00396         typedef typename TypeTraits<P14>::ParameterType Parm14;
00397         virtual ~FactoryImpl() {}
00398         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00399                                 Parm6, Parm7, Parm8, Parm8,Parm10,
00400                                 Parm11,Parm12,Parm13,Parm14)
00401         = 0;
00402     };
00403 
00404     template<typename AP, typename Id,
00405     typename P1,typename P2,typename P3,typename P4,typename P5,
00406     typename P6,typename P7,typename P8,typename P9,typename P10,
00407     typename P11,typename P12,typename P13,typename P14,typename P15 >
00408     struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15> >
00409                 : public FactoryImplBase
00410     {
00411         typedef typename TypeTraits<P1>::ParameterType Parm1;
00412         typedef typename TypeTraits<P2>::ParameterType Parm2;
00413         typedef typename TypeTraits<P3>::ParameterType Parm3;
00414         typedef typename TypeTraits<P4>::ParameterType Parm4;
00415         typedef typename TypeTraits<P5>::ParameterType Parm5;
00416         typedef typename TypeTraits<P6>::ParameterType Parm6;
00417         typedef typename TypeTraits<P7>::ParameterType Parm7;
00418         typedef typename TypeTraits<P8>::ParameterType Parm8;
00419         typedef typename TypeTraits<P9>::ParameterType Parm9;
00420         typedef typename TypeTraits<P10>::ParameterType Parm10;
00421         typedef typename TypeTraits<P11>::ParameterType Parm11;
00422         typedef typename TypeTraits<P12>::ParameterType Parm12;
00423         typedef typename TypeTraits<P13>::ParameterType Parm13;
00424         typedef typename TypeTraits<P14>::ParameterType Parm14;
00425         typedef typename TypeTraits<P15>::ParameterType Parm15;
00426         virtual ~FactoryImpl() {}
00427         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00428                                 Parm6, Parm7, Parm8, Parm9,Parm10,
00429                                 Parm11,Parm12,Parm13,Parm14,Parm15 )
00430         = 0;
00431     };
00432 
00433 #ifndef LOKI_DISABLE_TYPELIST_MACROS
00434 
00435     template <typename AP, typename Id, typename P1 >
00436     struct FactoryImpl<AP,Id, LOKI_TYPELIST_1( P1 )>
00437                 : public FactoryImplBase
00438     {
00439         typedef typename TypeTraits<P1>::ParameterType Parm1;
00440         virtual ~FactoryImpl() {}
00441         virtual AP* CreateObject(const Id& id,Parm1 ) = 0;
00442     };
00443 
00444     template<typename AP, typename Id, typename P1,typename P2 >
00445     struct FactoryImpl<AP, Id, LOKI_TYPELIST_2( P1, P2 )>
00446                 : public FactoryImplBase
00447     {
00448         typedef typename TypeTraits<P1>::ParameterType Parm1;
00449         typedef typename TypeTraits<P2>::ParameterType Parm2;
00450         virtual ~FactoryImpl() {}
00451         virtual AP* CreateObject(const Id& id,Parm1, Parm2 ) = 0;
00452     };
00453 
00454     template<typename AP, typename Id, typename P1,typename P2,typename P3 >
00455     struct FactoryImpl<AP, Id, LOKI_TYPELIST_3( P1, P2, P3 )>
00456                 : public FactoryImplBase
00457     {
00458         typedef typename TypeTraits<P1>::ParameterType Parm1;
00459         typedef typename TypeTraits<P2>::ParameterType Parm2;
00460         typedef typename TypeTraits<P3>::ParameterType Parm3;
00461         virtual ~FactoryImpl() {}
00462         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3 ) = 0;
00463     };
00464 
00465     template<typename AP, typename Id, typename P1,typename P2,typename P3,typename P4 >
00466     struct FactoryImpl<AP, Id, LOKI_TYPELIST_4( P1, P2, P3, P4 )>
00467                 : public FactoryImplBase
00468     {
00469         typedef typename TypeTraits<P1>::ParameterType Parm1;
00470         typedef typename TypeTraits<P2>::ParameterType Parm2;
00471         typedef typename TypeTraits<P3>::ParameterType Parm3;
00472         typedef typename TypeTraits<P4>::ParameterType Parm4;
00473         virtual ~FactoryImpl() {}
00474         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4 ) = 0;
00475     };
00476 
00477     template<typename AP, typename Id,
00478     typename P1,typename P2,typename P3,typename P4,typename P5 >
00479     struct FactoryImpl<AP, Id, LOKI_TYPELIST_5( P1, P2, P3, P4, P5 )>
00480                 : public FactoryImplBase
00481     {
00482         typedef typename TypeTraits<P1>::ParameterType Parm1;
00483         typedef typename TypeTraits<P2>::ParameterType Parm2;
00484         typedef typename TypeTraits<P3>::ParameterType Parm3;
00485         typedef typename TypeTraits<P4>::ParameterType Parm4;
00486         typedef typename TypeTraits<P5>::ParameterType Parm5;
00487         virtual ~FactoryImpl() {}
00488         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5 ) = 0;
00489     };
00490 
00491     template<typename AP, typename Id,
00492     typename P1,typename P2,typename P3,typename P4,typename P5,
00493     typename P6>
00494     struct FactoryImpl<AP, Id, LOKI_TYPELIST_6( P1, P2, P3, P4, P5, P6 )>
00495                 : public FactoryImplBase
00496     {
00497         typedef typename TypeTraits<P1>::ParameterType Parm1;
00498         typedef typename TypeTraits<P2>::ParameterType Parm2;
00499         typedef typename TypeTraits<P3>::ParameterType Parm3;
00500         typedef typename TypeTraits<P4>::ParameterType Parm4;
00501         typedef typename TypeTraits<P5>::ParameterType Parm5;
00502         typedef typename TypeTraits<P6>::ParameterType Parm6;
00503         virtual ~FactoryImpl() {}
00504         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00505                                 Parm6 )
00506         = 0;
00507     };
00508 
00509     template<typename AP, typename Id,
00510     typename P1,typename P2,typename P3,typename P4,typename P5,
00511     typename P6,typename P7>
00512     struct FactoryImpl<AP, Id, LOKI_TYPELIST_7( P1, P2, P3, P4, P5, P6, P7 )>
00513                 : public FactoryImplBase
00514     {
00515         typedef typename TypeTraits<P1>::ParameterType Parm1;
00516         typedef typename TypeTraits<P2>::ParameterType Parm2;
00517         typedef typename TypeTraits<P3>::ParameterType Parm3;
00518         typedef typename TypeTraits<P4>::ParameterType Parm4;
00519         typedef typename TypeTraits<P5>::ParameterType Parm5;
00520         typedef typename TypeTraits<P6>::ParameterType Parm6;
00521         typedef typename TypeTraits<P7>::ParameterType Parm7;
00522         virtual ~FactoryImpl() {}
00523         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00524                                 Parm6, Parm7 )
00525         = 0;
00526     };
00527 
00528     template<typename AP, typename Id,
00529     typename P1,typename P2,typename P3,typename P4,typename P5,
00530     typename P6,typename P7,typename P8>
00531     struct FactoryImpl<AP, Id, LOKI_TYPELIST_8( P1, P2, P3, P4, P5, P6, P7, P8 )>
00532                 : public FactoryImplBase
00533     {
00534         typedef typename TypeTraits<P1>::ParameterType Parm1;
00535         typedef typename TypeTraits<P2>::ParameterType Parm2;
00536         typedef typename TypeTraits<P3>::ParameterType Parm3;
00537         typedef typename TypeTraits<P4>::ParameterType Parm4;
00538         typedef typename TypeTraits<P5>::ParameterType Parm5;
00539         typedef typename TypeTraits<P6>::ParameterType Parm6;
00540         typedef typename TypeTraits<P7>::ParameterType Parm7;
00541         typedef typename TypeTraits<P8>::ParameterType Parm8;
00542         virtual ~FactoryImpl() {}
00543         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00544                                 Parm6, Parm7, Parm8)
00545         = 0;
00546     };
00547 
00548     template<typename AP, typename Id,
00549     typename P1,typename P2,typename P3,typename P4,typename P5,
00550     typename P6,typename P7,typename P8,typename P9>
00551     struct FactoryImpl<AP, Id, LOKI_TYPELIST_9( P1, P2, P3, P4, P5, P6, P7, P8, P9 )>
00552                 : public FactoryImplBase
00553     {
00554         typedef typename TypeTraits<P1>::ParameterType Parm1;
00555         typedef typename TypeTraits<P2>::ParameterType Parm2;
00556         typedef typename TypeTraits<P3>::ParameterType Parm3;
00557         typedef typename TypeTraits<P4>::ParameterType Parm4;
00558         typedef typename TypeTraits<P5>::ParameterType Parm5;
00559         typedef typename TypeTraits<P6>::ParameterType Parm6;
00560         typedef typename TypeTraits<P7>::ParameterType Parm7;
00561         typedef typename TypeTraits<P8>::ParameterType Parm8;
00562         typedef typename TypeTraits<P9>::ParameterType Parm9;
00563         virtual ~FactoryImpl() {}
00564         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00565                                 Parm6, Parm7, Parm8, Parm9)
00566         = 0;
00567     };
00568 
00569     template<typename AP, typename Id,
00570     typename P1,typename P2,typename P3,typename P4,typename P5,
00571     typename P6,typename P7,typename P8,typename P9,typename P10>
00572     struct FactoryImpl<AP, Id, LOKI_TYPELIST_10( P1, P2, P3, P4, P5, P6, P7, P8, P9, P10 )>
00573                 : public FactoryImplBase
00574     {
00575         typedef typename TypeTraits<P1>::ParameterType Parm1;
00576         typedef typename TypeTraits<P2>::ParameterType Parm2;
00577         typedef typename TypeTraits<P3>::ParameterType Parm3;
00578         typedef typename TypeTraits<P4>::ParameterType Parm4;
00579         typedef typename TypeTraits<P5>::ParameterType Parm5;
00580         typedef typename TypeTraits<P6>::ParameterType Parm6;
00581         typedef typename TypeTraits<P7>::ParameterType Parm7;
00582         typedef typename TypeTraits<P8>::ParameterType Parm8;
00583         typedef typename TypeTraits<P9>::ParameterType Parm9;
00584         typedef typename TypeTraits<P10>::ParameterType Parm10;
00585         virtual ~FactoryImpl() {}
00586         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00587                                 Parm6, Parm7, Parm8, Parm9,Parm10)
00588         = 0;
00589     };
00590 
00591     template<typename AP, typename Id,
00592     typename P1,typename P2,typename P3,typename P4,typename P5,
00593     typename P6,typename P7,typename P8,typename P9,typename P10,
00594     typename P11>
00595     struct FactoryImpl<AP, Id, LOKI_TYPELIST_11( P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11 )>
00596                 : public FactoryImplBase
00597     {
00598         typedef typename TypeTraits<P1>::ParameterType Parm1;
00599         typedef typename TypeTraits<P2>::ParameterType Parm2;
00600         typedef typename TypeTraits<P3>::ParameterType Parm3;
00601         typedef typename TypeTraits<P4>::ParameterType Parm4;
00602         typedef typename TypeTraits<P5>::ParameterType Parm5;
00603         typedef typename TypeTraits<P6>::ParameterType Parm6;
00604         typedef typename TypeTraits<P7>::ParameterType Parm7;
00605         typedef typename TypeTraits<P8>::ParameterType Parm8;
00606         typedef typename TypeTraits<P9>::ParameterType Parm9;
00607         typedef typename TypeTraits<P10>::ParameterType Parm10;
00608         typedef typename TypeTraits<P11>::ParameterType Parm11;
00609         virtual ~FactoryImpl() {}
00610         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00611                                 Parm6, Parm7, Parm8, Parm9,Parm10,
00612                                 Parm11)
00613         = 0;
00614     };
00615 
00616     template<typename AP, typename Id,
00617     typename P1,typename P2,typename P3,typename P4,typename P5,
00618     typename P6,typename P7,typename P8,typename P9,typename P10,
00619     typename P11,typename P12>
00620     struct FactoryImpl<AP, Id, LOKI_TYPELIST_12( P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12 )>
00621                 : public FactoryImplBase
00622     {
00623         typedef typename TypeTraits<P1>::ParameterType Parm1;
00624         typedef typename TypeTraits<P2>::ParameterType Parm2;
00625         typedef typename TypeTraits<P3>::ParameterType Parm3;
00626         typedef typename TypeTraits<P4>::ParameterType Parm4;
00627         typedef typename TypeTraits<P5>::ParameterType Parm5;
00628         typedef typename TypeTraits<P6>::ParameterType Parm6;
00629         typedef typename TypeTraits<P7>::ParameterType Parm7;
00630         typedef typename TypeTraits<P8>::ParameterType Parm8;
00631         typedef typename TypeTraits<P9>::ParameterType Parm9;
00632         typedef typename TypeTraits<P10>::ParameterType Parm10;
00633         typedef typename TypeTraits<P11>::ParameterType Parm11;
00634         typedef typename TypeTraits<P12>::ParameterType Parm12;
00635         virtual ~FactoryImpl() {}
00636         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00637                                 Parm6, Parm7, Parm8, Parm9,Parm10,
00638                                 Parm11,Parm12)
00639         = 0;
00640     };
00641 
00642     template<typename AP, typename Id,
00643     typename P1,typename P2,typename P3,typename P4,typename P5,
00644     typename P6,typename P7,typename P8,typename P9,typename P10,
00645     typename P11,typename P12,typename P13>
00646     struct FactoryImpl<AP, Id, LOKI_TYPELIST_13( P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13 )>
00647                 : public FactoryImplBase
00648     {
00649         typedef typename TypeTraits<P1>::ParameterType Parm1;
00650         typedef typename TypeTraits<P2>::ParameterType Parm2;
00651         typedef typename TypeTraits<P3>::ParameterType Parm3;
00652         typedef typename TypeTraits<P4>::ParameterType Parm4;
00653         typedef typename TypeTraits<P5>::ParameterType Parm5;
00654         typedef typename TypeTraits<P6>::ParameterType Parm6;
00655         typedef typename TypeTraits<P7>::ParameterType Parm7;
00656         typedef typename TypeTraits<P8>::ParameterType Parm8;
00657         typedef typename TypeTraits<P9>::ParameterType Parm9;
00658         typedef typename TypeTraits<P10>::ParameterType Parm10;
00659         typedef typename TypeTraits<P11>::ParameterType Parm11;
00660         typedef typename TypeTraits<P12>::ParameterType Parm12;
00661         typedef typename TypeTraits<P13>::ParameterType Parm13;
00662         virtual ~FactoryImpl() {}
00663         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00664                                 Parm6, Parm7, Parm8, Parm9,Parm10,
00665                                 Parm11,Parm12,Parm13)
00666         = 0;
00667     };
00668 
00669     template<typename AP, typename Id,
00670     typename P1,typename P2,typename P3,typename P4,typename P5,
00671     typename P6,typename P7,typename P8,typename P9,typename P10,
00672     typename P11,typename P12,typename P13,typename P14>
00673     struct FactoryImpl<AP, Id, LOKI_TYPELIST_14( P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14 )>
00674                 : public FactoryImplBase
00675     {
00676         typedef typename TypeTraits<P1>::ParameterType Parm1;
00677         typedef typename TypeTraits<P2>::ParameterType Parm2;
00678         typedef typename TypeTraits<P3>::ParameterType Parm3;
00679         typedef typename TypeTraits<P4>::ParameterType Parm4;
00680         typedef typename TypeTraits<P5>::ParameterType Parm5;
00681         typedef typename TypeTraits<P6>::ParameterType Parm6;
00682         typedef typename TypeTraits<P7>::ParameterType Parm7;
00683         typedef typename TypeTraits<P8>::ParameterType Parm8;
00684         typedef typename TypeTraits<P9>::ParameterType Parm9;
00685         typedef typename TypeTraits<P10>::ParameterType Parm10;
00686         typedef typename TypeTraits<P11>::ParameterType Parm11;
00687         typedef typename TypeTraits<P12>::ParameterType Parm12;
00688         typedef typename TypeTraits<P13>::ParameterType Parm13;
00689         typedef typename TypeTraits<P14>::ParameterType Parm14;
00690         virtual ~FactoryImpl() {}
00691         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00692                                 Parm6, Parm7, Parm8, Parm8,Parm10,
00693                                 Parm11,Parm12,Parm13,Parm14)
00694         = 0;
00695     };
00696 
00697     template<typename AP, typename Id,
00698     typename P1,typename P2,typename P3,typename P4,typename P5,
00699     typename P6,typename P7,typename P8,typename P9,typename P10,
00700     typename P11,typename P12,typename P13,typename P14,typename P15 >
00701     struct FactoryImpl<AP, Id, LOKI_TYPELIST_15( P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15 )>
00702                 : public FactoryImplBase
00703     {
00704         typedef typename TypeTraits<P1>::ParameterType Parm1;
00705         typedef typename TypeTraits<P2>::ParameterType Parm2;
00706         typedef typename TypeTraits<P3>::ParameterType Parm3;
00707         typedef typename TypeTraits<P4>::ParameterType Parm4;
00708         typedef typename TypeTraits<P5>::ParameterType Parm5;
00709         typedef typename TypeTraits<P6>::ParameterType Parm6;
00710         typedef typename TypeTraits<P7>::ParameterType Parm7;
00711         typedef typename TypeTraits<P8>::ParameterType Parm8;
00712         typedef typename TypeTraits<P9>::ParameterType Parm9;
00713         typedef typename TypeTraits<P10>::ParameterType Parm10;
00714         typedef typename TypeTraits<P11>::ParameterType Parm11;
00715         typedef typename TypeTraits<P12>::ParameterType Parm12;
00716         typedef typename TypeTraits<P13>::ParameterType Parm13;
00717         typedef typename TypeTraits<P14>::ParameterType Parm14;
00718         typedef typename TypeTraits<P15>::ParameterType Parm15;
00719         virtual ~FactoryImpl() {}
00720         virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5,
00721                                 Parm6, Parm7, Parm8, Parm9,Parm10,
00722                                 Parm11,Parm12,Parm13,Parm14,Parm15 )
00723         = 0;
00724     };
00725 
00726 #endif //LOKI_DISABLE_TYPELIST_MACROS
00727 
00728 
00745     template
00746     <
00747         class AbstractProduct,
00748         typename IdentifierType,
00749         typename CreatorParmTList = NullType,
00750         template<typename, class> class FactoryErrorPolicy = DefaultFactoryError
00751     >
00752     class Factory : public FactoryErrorPolicy<IdentifierType, AbstractProduct>
00753     {
00754         typedef FactoryImpl< AbstractProduct, IdentifierType, CreatorParmTList > Impl;
00755 
00756         typedef typename Impl::Parm1 Parm1;
00757         typedef typename Impl::Parm2 Parm2;
00758         typedef typename Impl::Parm3 Parm3;
00759         typedef typename Impl::Parm4 Parm4;
00760         typedef typename Impl::Parm5 Parm5;
00761         typedef typename Impl::Parm6 Parm6;
00762         typedef typename Impl::Parm7 Parm7;
00763         typedef typename Impl::Parm8 Parm8;
00764         typedef typename Impl::Parm9 Parm9;
00765         typedef typename Impl::Parm10 Parm10;
00766         typedef typename Impl::Parm11 Parm11;
00767         typedef typename Impl::Parm12 Parm12;
00768         typedef typename Impl::Parm13 Parm13;
00769         typedef typename Impl::Parm14 Parm14;
00770         typedef typename Impl::Parm15 Parm15;
00771 
00772         typedef Functor<AbstractProduct*, CreatorParmTList> ProductCreator;
00773 
00774         typedef AssocVector<IdentifierType, ProductCreator> IdToProductMap;
00775 
00776         IdToProductMap associations_;
00777 
00778     public:
00779 
00780         Factory()
00781             : associations_()
00782         {
00783         }
00784 
00785         ~Factory()
00786         {
00787             associations_.erase(associations_.begin(), associations_.end());
00788         }
00789 
00790         bool Register(const IdentifierType& id, ProductCreator creator)
00791         {
00792             return associations_.insert(
00793                          typename IdToProductMap::value_type(id, creator)).second != 0;
00794         }
00795 
00796         template <class PtrObj, typename CreaFn>
00797         bool Register(const IdentifierType& id, const PtrObj& p, CreaFn fn)
00798         {
00799             ProductCreator creator( p, fn );
00800             return associations_.insert(
00801                 typename IdToProductMap::value_type(id, creator)).second != 0;
00802         }
00803 
00804         bool Unregister(const IdentifierType& id)
00805         {
00806             return associations_.erase(id) != 0;
00807         }
00808 
00809         std::vector<IdentifierType> RegisteredIds()
00810         {
00811             std::vector<IdentifierType> ids;
00812             for(typename IdToProductMap::iterator it = associations_.begin();
00813                 it != associations_.end(); ++it)
00814             {
00815                 ids.push_back(it->first);
00816             }
00817             return ids;
00818         }
00819 
00820         AbstractProduct* CreateObject(const IdentifierType& id)
00821         {
00822             typename IdToProductMap::iterator i = associations_.find(id);
00823             if (i != associations_.end())
00824                 return (i->second)( );
00825             return this->OnUnknownType(id);
00826         }
00827 
00828         AbstractProduct* CreateObject(const IdentifierType& id,
00829                                             Parm1 p1)
00830         {
00831             typename IdToProductMap::iterator i = associations_.find(id);
00832             if (i != associations_.end())
00833                 return (i->second)( p1 );
00834             return this->OnUnknownType(id);
00835         }
00836 
00837         AbstractProduct* CreateObject(const IdentifierType& id,
00838                                             Parm1 p1, Parm2 p2)
00839         {
00840             typename IdToProductMap::iterator i = associations_.find(id);
00841             if (i != associations_.end())
00842                 return (i->second)( p1,p2 );
00843             return this->OnUnknownType(id);
00844         }
00845 
00846         AbstractProduct* CreateObject(const IdentifierType& id,
00847                                             Parm1 p1, Parm2 p2, Parm3 p3)
00848         {
00849             typename IdToProductMap::iterator i = associations_.find(id);
00850             if (i != associations_.end())
00851                 return (i->second)( p1,p2,p3 );
00852             return this->OnUnknownType(id);
00853         }
00854 
00855         AbstractProduct* CreateObject(const IdentifierType& id,
00856                                             Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4)
00857         {
00858             typename IdToProductMap::iterator i = associations_.find(id);
00859             if (i != associations_.end())
00860                 return (i->second)( p1,p2,p3,p4 );
00861             return this->OnUnknownType(id);
00862         }
00863 
00864         AbstractProduct* CreateObject(const IdentifierType& id,
00865                                             Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5)
00866         {
00867             typename IdToProductMap::iterator i = associations_.find(id);
00868             if (i != associations_.end())
00869                 return (i->second)( p1,p2,p3,p4,p5 );
00870             return this->OnUnknownType(id);
00871         }
00872 
00873         AbstractProduct* CreateObject(const IdentifierType& id,
00874                                             Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
00875                                             Parm6 p6)
00876         {
00877             typename IdToProductMap::iterator i = associations_.find(id);
00878             if (i != associations_.end())
00879                 return (i->second)( p1,p2,p3,p4,p5,p6 );
00880             return this->OnUnknownType(id);
00881         }
00882 
00883         AbstractProduct* CreateObject(const IdentifierType& id,
00884                                             Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
00885                                             Parm6 p6, Parm7 p7 )
00886         {
00887             typename IdToProductMap::iterator i = associations_.find(id);
00888             if (i != associations_.end())
00889                 return (i->second)( p1,p2,p3,p4,p5,p6,p7 );
00890             return this->OnUnknownType(id);
00891         }
00892 
00893         AbstractProduct* CreateObject(const IdentifierType& id,
00894                                             Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
00895                                             Parm6 p6, Parm7 p7, Parm8 p8)
00896         {
00897             typename IdToProductMap::iterator i = associations_.find(id);
00898             if (i != associations_.end())
00899                 return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8 );
00900             return this->OnUnknownType(id);
00901         }
00902 
00903         AbstractProduct* CreateObject(const IdentifierType& id,
00904                                             Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
00905                                             Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9)
00906         {
00907             typename IdToProductMap::iterator i = associations_.find(id);
00908             if (i != associations_.end())
00909                 return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8,p9 );
00910             return this->OnUnknownType(id);
00911         }
00912         AbstractProduct* CreateObject(const IdentifierType& id,
00913                                             Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
00914                                             Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9,Parm10 p10)
00915         {
00916             typename IdToProductMap::iterator i = associations_.find(id);
00917             if (i != associations_.end())
00918                 return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10 );
00919             return this->OnUnknownType(id);
00920         }
00921 
00922         AbstractProduct* CreateObject(const IdentifierType& id,
00923                                             Parm1  p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5  p5,
00924                                             Parm6  p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10,
00925                                             Parm11 p11)
00926         {
00927             typename IdToProductMap::iterator i = associations_.find(id);
00928             if (i != associations_.end())
00929                 return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11 );
00930             return this->OnUnknownType(id);
00931         }
00932 
00933         AbstractProduct* CreateObject(const IdentifierType& id,
00934                                             Parm1  p1,  Parm2  p2, Parm3 p3, Parm4 p4, Parm5  p5,
00935                                             Parm6  p6,  Parm7  p7, Parm8 p8, Parm9 p9, Parm10 p10,
00936                                             Parm11 p11, Parm12 p12)
00937         {
00938             typename IdToProductMap::iterator i = associations_.find(id);
00939             if (i != associations_.end())
00940                 return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12 );
00941             return this->OnUnknownType(id);
00942         }
00943 
00944         AbstractProduct* CreateObject(const IdentifierType& id,
00945                                             Parm1  p1,  Parm2  p2,  Parm3  p3, Parm4 p4, Parm5  p5,
00946                                             Parm6  p6,  Parm7  p7,  Parm8  p8, Parm9 p9, Parm10 p10,
00947                                             Parm11 p11, Parm12 p12, Parm13 p13)
00948         {
00949             typename IdToProductMap::iterator i = associations_.find(id);
00950             if (i != associations_.end())
00951                 return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13 );
00952             return this->OnUnknownType(id);
00953         }
00954 
00955         AbstractProduct* CreateObject(const IdentifierType& id,
00956                                             Parm1  p1,  Parm2  p2,  Parm3  p3,  Parm4  p4, Parm5  p5,
00957                                             Parm6  p6,  Parm7  p7,  Parm8  p8,  Parm9  p9, Parm10 p10,
00958                                             Parm11 p11, Parm12 p12, Parm13 p13, Parm14 p14)
00959         {
00960             typename IdToProductMap::iterator i = associations_.find(id);
00961             if (i != associations_.end())
00962                 return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14 );
00963             return this->OnUnknownType(id);
00964         }
00965 
00966         AbstractProduct* CreateObject(const IdentifierType& id,
00967                                             Parm1  p1,  Parm2  p2,  Parm3  p3,  Parm4  p4,  Parm5  p5,
00968                                             Parm6  p6,  Parm7  p7,  Parm8  p8,  Parm9  p9,  Parm10 p10,
00969                                             Parm11 p11, Parm12 p12, Parm13 p13, Parm14 p14, Parm15 p15)
00970         {
00971             typename IdToProductMap::iterator i = associations_.find(id);
00972             if (i != associations_.end())
00973                 return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15 );
00974             return this->OnUnknownType(id);
00975         }
00976 
00977     };
00978 
00979 #else
00980 
00981     template
00982     <
00983         class AbstractProduct,
00984         typename IdentifierType,
00985         typename ProductCreator = AbstractProduct* (*)(),
00986         template<typename, class>
00987             class FactoryErrorPolicy = DefaultFactoryError
00988     >
00989     class Factory
00990         : public FactoryErrorPolicy<IdentifierType, AbstractProduct>
00991     {
00992     public:
00993         bool Register(const IdentifierType& id, ProductCreator creator)
00994         {
00995             return associations_.insert(
00996                 typename IdToProductMap::value_type(id, creator)).second != 0;
00997         }
00998 
00999         bool Unregister(const IdentifierType& id)
01000         {
01001             return associations_.erase(id) != 0;
01002         }
01003 
01004         AbstractProduct* CreateObject(const IdentifierType& id)
01005         {
01006             typename IdToProductMap::iterator i = associations_.find(id);
01007             if (i != associations_.end())
01008             {
01009                 return (i->second)();
01010             }
01011             return this->OnUnknownType(id);
01012         }
01013 
01014     private:
01015         typedef AssocVector<IdentifierType, ProductCreator> IdToProductMap;
01016         IdToProductMap associations_;
01017     };
01018 
01019 #endif //#define ENABLE_NEW_FACTORY_CODE
01020 
01031     template
01032     <
01033         class AbstractProduct,
01034         class ProductCreator =
01035             AbstractProduct* (*)(const AbstractProduct*),
01036         template<typename, class>
01037             class FactoryErrorPolicy = DefaultFactoryError
01038     >
01039     class CloneFactory
01040         : public FactoryErrorPolicy<TypeInfo, AbstractProduct>
01041     {
01042     public:
01043         bool Register(const TypeInfo& ti, ProductCreator creator)
01044         {
01045             return associations_.insert(
01046                 typename IdToProductMap::value_type(ti, creator)).second != 0;
01047         }
01048 
01049         bool Unregister(const TypeInfo& id)
01050         {
01051             return associations_.erase(id) != 0;
01052         }
01053 
01054         AbstractProduct* CreateObject(const AbstractProduct* model)
01055         {
01056             if (model == NULL)
01057             {
01058                return NULL;
01059             }
01060 
01061             typename IdToProductMap::iterator i = 
01062                associations_.find(typeid(*model));
01063                
01064             if (i != associations_.end())
01065             {
01066                 return (i->second)(model);
01067             }
01068             return this->OnUnknownType(typeid(*model));
01069         }
01070 
01071     private:
01072         typedef AssocVector<TypeInfo, ProductCreator> IdToProductMap;
01073         IdToProductMap associations_;
01074     };
01075         
01076 } // namespace Loki
01077 
01078 
01079 #ifdef _MSC_VER
01080 #pragma warning( pop )
01081 #endif
01082 
01083 #endif // end file guardian
01084 

Generated on Sun Feb 25 16:52:22 2007 for Loki by  doxygen 1.5.1-p1