| /* { dg-do link } */ |
| /* { dg-timeout-factor 2.0 } */ |
| /* { dg-skip-if "Program too big" { "avr-*-*" } } */ |
| |
| namespace Loki |
| { |
| class NullType {}; |
| template <class T, class U> |
| struct Typelist |
| { |
| typedef T Head; |
| typedef U Tail; |
| }; |
| |
| |
| |
| namespace TL |
| { |
| template |
| < |
| typename T1 = NullType, typename T2 = NullType, typename T3 = |
| NullType, |
| typename T4 = NullType, typename T5 = NullType, typename T6 = |
| NullType, |
| typename T7 = NullType, typename T8 = NullType, typename T9 = |
| NullType, |
| typename T10 = NullType, typename T11 = NullType, typename T12 |
| = NullType, |
| typename T13 = NullType, typename T14 = NullType, typename T15 |
| = NullType, |
| typename T16 = NullType, typename T17 = NullType, typename T18 |
| = NullType, |
| typename T19 = NullType, typename T20 = NullType, typename T21 |
| = NullType, |
| typename T22 = NullType, typename T23 = NullType, typename T24 |
| = NullType, |
| typename T25 = NullType, typename T26 = NullType, typename T27 |
| = NullType, |
| typename T28 = NullType, typename T29 = NullType, typename T30 |
| = NullType, |
| typename T31 = NullType, typename T32 = NullType, typename T33 |
| = NullType, |
| typename T34 = NullType, typename T35 = NullType, typename T36 |
| = NullType, |
| typename T37 = NullType, typename T38 = NullType, typename T39 |
| = NullType, |
| typename T40 = NullType |
| > |
| struct MakeTypelist |
| { |
| private: |
| typedef typename MakeTypelist |
| < |
| T2 , T3 , T4 , |
| T5 , T6 , T7 , |
| T8 , T9 , T10, |
| T11, T12, T13, |
| T14, T15, T16, |
| T17, T18, T19, |
| T20, T21, T22, |
| T23, T24, T25, |
| T26, T27, T28, |
| T29, T30, T31, |
| T32, T33, T34, |
| T35, T36, T37, |
| T38, T39, T40 |
| > |
| ::Result TailResult; |
| |
| public: |
| typedef Typelist<T1, TailResult> Result; |
| }; |
| |
| template<> |
| struct MakeTypelist<> |
| { |
| typedef NullType Result; |
| }; |
| |
| } |
| } |
| template <class Key> |
| class Factory; |
| |
| template <class Key, bool iW> |
| struct Context |
| { |
| typedef Key KeyType; |
| enum |
| { |
| isWrite = iW |
| }; |
| }; |
| |
| namespace detail |
| { |
| |
| template <class Key, bool isWrite> |
| class CreatorUnitBaseImpl |
| { |
| public: |
| typedef Context<Key, isWrite> Context_; |
| private: |
| typedef void*(CreatorUnitBaseImpl::*CreateFun)(Context_&, unsigned&, const |
| Key&); |
| CreateFun createFun_; |
| |
| protected: |
| virtual void* createUninitialized () = 0; |
| template <class Value> |
| void* createImpl (Context_& ctx, unsigned& ver, const Key& k) |
| { |
| return createUninitialized(); |
| } |
| private: |
| CreatorUnitBaseImpl(); |
| public: |
| template <class Value> |
| CreatorUnitBaseImpl (Value*) : |
| createFun_( &CreatorUnitBaseImpl::template createImpl<Value> ) |
| { |
| } |
| |
| virtual ~CreatorUnitBaseImpl () {} |
| |
| CreatorUnitBaseImpl(const CreatorUnitBaseImpl& s) |
| : createFun_(s.createFun_) |
| { |
| } |
| |
| CreatorUnitBaseImpl& operator=(const CreatorUnitBaseImpl& s) |
| { |
| createFun_ = s.createFun_; |
| return *this; |
| } |
| void* create (Context_& ctx, unsigned& ver, const Key& k) |
| { |
| return (this->*createFun_)(ctx, ver, k); |
| } |
| }; |
| |
| template <class Key> |
| class Creator : protected CreatorUnitBaseImpl<Key, true>, protected |
| CreatorUnitBaseImpl<Key, false> |
| { |
| public: |
| typedef void* (*CreatorFun) (); |
| |
| private: |
| CreatorFun fun_; |
| protected: |
| virtual void* createUninitialized () |
| { |
| if (fun_) |
| return (*fun_)(); |
| return 0; |
| } |
| private: |
| Creator (); |
| public: |
| template <class Value> |
| Creator (CreatorFun f, Value*) : |
| CreatorUnitBaseImpl<Key, true>((Value*)0), |
| CreatorUnitBaseImpl<Key, false>((Value*)0), |
| fun_(f) |
| { |
| } |
| |
| Creator(const Creator& s) : |
| CreatorUnitBaseImpl<Key, true>(s), |
| CreatorUnitBaseImpl<Key, false>(s), |
| fun_(s.fun_) |
| { |
| |
| } |
| |
| Creator& operator=(const Creator& s) |
| { |
| CreatorUnitBaseImpl<Key, true>::operator=(s); |
| CreatorUnitBaseImpl<Key, false>::operator=(s); |
| fun_ = s.fun_; |
| return *this; |
| } |
| |
| virtual ~Creator () |
| { |
| } |
| |
| template <class Context> |
| void* createObject (Context& ctx, unsigned& ver, const Key& k) |
| { |
| void* r = CreatorUnitBaseImpl<Key, Context::isWrite>::create(ctx, ver, |
| k); |
| return r; |
| } |
| }; |
| |
| } |
| |
| template <class Key> |
| class Factory |
| { |
| public: |
| typedef Key KeyType; |
| typedef void* (*CreatorFun) (); |
| typedef detail::Creator<Key> Creator; |
| public: |
| Factory () {} |
| ~Factory () {} |
| |
| template <class Value> |
| bool registerCreator (const Key& k, CreatorFun fun) |
| { |
| return true; |
| } |
| template <class Context> |
| void* createObject (const Key& k, Context& ctx, unsigned& ver) |
| { |
| return 0; |
| } |
| }; |
| |
| template <class Key, class Base, Key key> |
| struct ClassSpec |
| { |
| typedef Key KeyType; |
| typedef Base BaseType; |
| enum {KeyValue = key}; |
| }; |
| |
| template <class Key, class T> |
| class Serializer; |
| |
| template <class Key, class Base, Key key> |
| class Serializer<Key, ClassSpec <Key, Base, key> > |
| : public virtual Factory<Key> |
| { |
| typedef Key KeyType; |
| typedef Base BaseType; |
| enum {KeyValue = key}; |
| typedef Factory<Key> Inherited; |
| typedef Serializer<Key, ClassSpec< Key, Base, key > > SelfType; |
| |
| static void* create () |
| { |
| return (void*) (new BaseType); |
| } |
| public: |
| Serializer() |
| { |
| Inherited::template registerCreator<BaseType>( |
| KeyValue, |
| &SelfType::create); |
| } |
| }; |
| |
| template <class Key, class Head> |
| class Serializer<Key, Loki::Typelist<Head, Loki::NullType> >: |
| public Serializer<Key, Head> |
| { |
| }; |
| |
| template <class Key, class Head, class Tail> |
| class Serializer<Key, Loki::Typelist<Head, Tail> >: |
| public virtual Serializer<Key, Head>, |
| public virtual Serializer<Key, Tail> |
| { |
| }; |
| |
| template <class Key> |
| class Serializer<Key, Loki::NullType> : public virtual Factory<Key> |
| { |
| }; |
| |
| |
| |
| |
| typedef unsigned KeyType; |
| |
| |
| |
| typedef Factory<KeyType> FactoryType; |
| |
| typedef KeyType Key; |
| |
| struct A001 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 1; } |
| static const char* className () {return "A001";} |
| }; |
| |
| struct A002 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 2; } |
| static const char* className () {return "A002";} |
| }; |
| |
| struct A003 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 3; } |
| static const char* className () {return "A003";} |
| }; |
| |
| struct A004 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 4; } |
| static const char* className () {return "A004";} |
| }; |
| |
| struct A005 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 5; } |
| static const char* className () {return "A005";} |
| }; |
| |
| struct A006 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 6; } |
| static const char* className () {return "A006";} |
| }; |
| |
| struct A007 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 7; } |
| static const char* className () {return "A007";} |
| }; |
| |
| struct A008 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 8; } |
| static const char* className () {return "A008";} |
| }; |
| |
| struct A009 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 9; } |
| static const char* className () {return "A009";} |
| }; |
| |
| struct A010 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 10; } |
| static const char* className () {return "A010";} |
| }; |
| |
| struct A011 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 11; } |
| static const char* className () {return "A011";} |
| }; |
| |
| struct A012 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 12; } |
| static const char* className () {return "A012";} |
| }; |
| |
| struct A013 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 13; } |
| static const char* className () {return "A013";} |
| }; |
| |
| struct A014 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 14; } |
| static const char* className () {return "A014";} |
| }; |
| |
| struct A015 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 15; } |
| static const char* className () {return "A015";} |
| }; |
| |
| struct A016 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 16; } |
| static const char* className () {return "A016";} |
| }; |
| |
| struct A017 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 17; } |
| static const char* className () {return "A017";} |
| }; |
| |
| struct A018 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 18; } |
| static const char* className () {return "A018";} |
| }; |
| |
| struct A019 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 19; } |
| static const char* className () {return "A019";} |
| }; |
| |
| struct A020 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 20; } |
| static const char* className () {return "A020";} |
| }; |
| |
| struct A021 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 21; } |
| static const char* className () {return "A021";} |
| }; |
| |
| struct A022 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 22; } |
| static const char* className () {return "A022";} |
| }; |
| |
| struct A023 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 23; } |
| static const char* className () {return "A023";} |
| }; |
| |
| struct A024 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 24; } |
| static const char* className () {return "A024";} |
| }; |
| |
| struct A025 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 25; } |
| static const char* className () {return "A025";} |
| }; |
| |
| struct A026 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 26; } |
| static const char* className () {return "A026";} |
| }; |
| |
| struct A027 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 27; } |
| static const char* className () {return "A027";} |
| }; |
| |
| struct A028 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 28; } |
| static const char* className () {return "A028";} |
| }; |
| |
| struct A029 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 29; } |
| static const char* className () {return "A029";} |
| }; |
| |
| struct A030 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 30; } |
| static const char* className () {return "A030";} |
| }; |
| |
| struct A031 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 31; } |
| static const char* className () {return "A031";} |
| }; |
| |
| struct A032 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 32; } |
| static const char* className () {return "A032";} |
| }; |
| |
| struct A033 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 33; } |
| static const char* className () {return "A033";} |
| }; |
| |
| struct A034 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 34; } |
| static const char* className () {return "A034";} |
| }; |
| |
| struct A035 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 35; } |
| static const char* className () {return "A035";} |
| }; |
| |
| struct A036 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 36; } |
| static const char* className () {return "A036";} |
| }; |
| |
| struct A037 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 37; } |
| static const char* className () {return "A037";} |
| }; |
| |
| struct A038 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 38; } |
| static const char* className () {return "A038";} |
| }; |
| |
| struct A039 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 39; } |
| static const char* className () {return "A039";} |
| }; |
| |
| struct A040 |
| { |
| template <class Context> |
| bool serialize(Context& ctx, unsigned& ver) |
| { |
| return true; |
| } |
| static Key classId() { return 40; } |
| static const char* className () {return "A040";} |
| }; |
| |
| Factory<Key>& getInstance() |
| { |
| static Serializer<Key, |
| Loki::TL::MakeTypelist< |
| ClassSpec<Key, A001, 1>, |
| ClassSpec<Key, A002, 2>, |
| ClassSpec<Key, A003, 3>, |
| ClassSpec<Key, A004, 4>, |
| ClassSpec<Key, A005, 5>, |
| ClassSpec<Key, A006, 6>, |
| ClassSpec<Key, A007, 7>, |
| ClassSpec<Key, A008, 8>, |
| ClassSpec<Key, A009, 9>, |
| ClassSpec<Key, A010, 10>, |
| ClassSpec<Key, A011, 11>, |
| ClassSpec<Key, A012, 12>, |
| ClassSpec<Key, A013, 13>, |
| ClassSpec<Key, A014, 14>, |
| ClassSpec<Key, A015, 15>, |
| ClassSpec<Key, A016, 16>, |
| ClassSpec<Key, A017, 17>, |
| ClassSpec<Key, A018, 18>, |
| ClassSpec<Key, A019, 19>, |
| ClassSpec<Key, A020, 20>, |
| ClassSpec<Key, A021, 21>, |
| ClassSpec<Key, A022, 22>, |
| ClassSpec<Key, A023, 23>, |
| ClassSpec<Key, A024, 24>, |
| ClassSpec<Key, A025, 25>, |
| ClassSpec<Key, A026, 26>, |
| ClassSpec<Key, A027, 27>, |
| ClassSpec<Key, A028, 28>, |
| ClassSpec<Key, A029, 29>, |
| ClassSpec<Key, A030, 30>, |
| ClassSpec<Key, A031, 31>, |
| ClassSpec<Key, A032, 32>, |
| ClassSpec<Key, A033, 33>, |
| ClassSpec<Key, A034, 34>, |
| ClassSpec<Key, A035, 35>, |
| ClassSpec<Key, A036, 36>, |
| ClassSpec<Key, A037, 37>, |
| ClassSpec<Key, A038, 38>, |
| ClassSpec<Key, A039, 39>, |
| ClassSpec<Key, A040, 40> |
| >::Result |
| > instance; |
| return instance; |
| } |
| |
| int main () |
| { |
| return 0; |
| } |