00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00013 #ifndef LOKI_FACTORYPARM_INC_
00014 #define LOKI_FACTORYPARM_INC_
00015
00016
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
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
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 }
01077
01078
01079 #ifdef _MSC_VER
01080 #pragma warning( pop )
01081 #endif
01082
01083 #endif // end file guardian
01084