blob: 646178a96701cfd22309440654966d0ebd207afc [file] [log] [blame]
/* { 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;
}