/* { dg-do link } */ /* { dg-timeout-factor 2.0 } */ /* { dg-skip-if "Program too big" { "avr-*-*" } { "*" } { "" } } */ namespace Loki { class NullType {}; template 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 Result; }; template<> struct MakeTypelist<> { typedef NullType Result; }; } } template class Factory; template struct Context { typedef Key KeyType; enum { isWrite = iW }; }; namespace detail { template class CreatorUnitBaseImpl { public: typedef Context Context_; private: typedef void*(CreatorUnitBaseImpl::*CreateFun)(Context_&, unsigned&, const Key&); CreateFun createFun_; protected: virtual void* createUninitialized () = 0; template void* createImpl (Context_& ctx, unsigned& ver, const Key& k) { return createUninitialized(); } private: CreatorUnitBaseImpl(); public: template CreatorUnitBaseImpl (Value*) : createFun_( &CreatorUnitBaseImpl::template createImpl ) { } 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 Creator : protected CreatorUnitBaseImpl, protected CreatorUnitBaseImpl { public: typedef void* (*CreatorFun) (); private: CreatorFun fun_; protected: virtual void* createUninitialized () { if (fun_) return (*fun_)(); return 0; } private: Creator (); public: template Creator (CreatorFun f, Value*) : CreatorUnitBaseImpl((Value*)0), CreatorUnitBaseImpl((Value*)0), fun_(f) { } Creator(const Creator& s) : CreatorUnitBaseImpl(s), CreatorUnitBaseImpl(s), fun_(s.fun_) { } Creator& operator=(const Creator& s) { CreatorUnitBaseImpl::operator=(s); CreatorUnitBaseImpl::operator=(s); fun_ = s.fun_; return *this; } virtual ~Creator () { } template void* createObject (Context& ctx, unsigned& ver, const Key& k) { void* r = CreatorUnitBaseImpl::create(ctx, ver, k); return r; } }; } template class Factory { public: typedef Key KeyType; typedef void* (*CreatorFun) (); typedef detail::Creator Creator; public: Factory () {} ~Factory () {} template bool registerCreator (const Key& k, CreatorFun fun) { return true; } template void* createObject (const Key& k, Context& ctx, unsigned& ver) { return 0; } }; template struct ClassSpec { typedef Key KeyType; typedef Base BaseType; enum {KeyValue = key}; }; template class Serializer; template class Serializer > : public virtual Factory { typedef Key KeyType; typedef Base BaseType; enum {KeyValue = key}; typedef Factory Inherited; typedef Serializer > SelfType; static void* create () { return (void*) (new BaseType); } public: Serializer() { Inherited::template registerCreator( KeyValue, &SelfType::create); } }; template class Serializer >: public Serializer { }; template class Serializer >: public virtual Serializer, public virtual Serializer { }; template class Serializer : public virtual Factory { }; typedef unsigned KeyType; typedef Factory FactoryType; typedef KeyType Key; struct A001 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 1; } static const char* className () {return "A001";} }; struct A002 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 2; } static const char* className () {return "A002";} }; struct A003 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 3; } static const char* className () {return "A003";} }; struct A004 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 4; } static const char* className () {return "A004";} }; struct A005 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 5; } static const char* className () {return "A005";} }; struct A006 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 6; } static const char* className () {return "A006";} }; struct A007 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 7; } static const char* className () {return "A007";} }; struct A008 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 8; } static const char* className () {return "A008";} }; struct A009 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 9; } static const char* className () {return "A009";} }; struct A010 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 10; } static const char* className () {return "A010";} }; struct A011 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 11; } static const char* className () {return "A011";} }; struct A012 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 12; } static const char* className () {return "A012";} }; struct A013 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 13; } static const char* className () {return "A013";} }; struct A014 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 14; } static const char* className () {return "A014";} }; struct A015 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 15; } static const char* className () {return "A015";} }; struct A016 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 16; } static const char* className () {return "A016";} }; struct A017 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 17; } static const char* className () {return "A017";} }; struct A018 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 18; } static const char* className () {return "A018";} }; struct A019 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 19; } static const char* className () {return "A019";} }; struct A020 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 20; } static const char* className () {return "A020";} }; struct A021 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 21; } static const char* className () {return "A021";} }; struct A022 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 22; } static const char* className () {return "A022";} }; struct A023 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 23; } static const char* className () {return "A023";} }; struct A024 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 24; } static const char* className () {return "A024";} }; struct A025 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 25; } static const char* className () {return "A025";} }; struct A026 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 26; } static const char* className () {return "A026";} }; struct A027 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 27; } static const char* className () {return "A027";} }; struct A028 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 28; } static const char* className () {return "A028";} }; struct A029 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 29; } static const char* className () {return "A029";} }; struct A030 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 30; } static const char* className () {return "A030";} }; struct A031 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 31; } static const char* className () {return "A031";} }; struct A032 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 32; } static const char* className () {return "A032";} }; struct A033 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 33; } static const char* className () {return "A033";} }; struct A034 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 34; } static const char* className () {return "A034";} }; struct A035 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 35; } static const char* className () {return "A035";} }; struct A036 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 36; } static const char* className () {return "A036";} }; struct A037 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 37; } static const char* className () {return "A037";} }; struct A038 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 38; } static const char* className () {return "A038";} }; struct A039 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 39; } static const char* className () {return "A039";} }; struct A040 { template bool serialize(Context& ctx, unsigned& ver) { return true; } static Key classId() { return 40; } static const char* className () {return "A040";} }; Factory& getInstance() { static Serializer, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec, ClassSpec >::Result > instance; return instance; } int main () { return 0; }