// Build don't link:
// Origin: Steven Parkes <parkes@sierravista.com>

typedef __SIZE_TYPE__ size_t;

class UUId {};

template <class T> class MetaClass;

class TypeInfo;

struct MetaClassGeneric 
{
                                MetaClassGeneric( TypeInfo& );
};

struct TypeInfo 
{
                        void    (*constructor)( void* );
                        void    initialize( void* );
};

template <class T>
class TypeIDInit {
public:
                                TypeIDInit();
                 static void    initialize();
             static TypeInfo    info;
                  static int    storage[];
                 static void    metaclassConstructor( void* );
};

template <class T>
TypeInfo TypeIDInit<T>::info = 
{
  TypeIDInit<T>::metaclassConstructor
};

template <class T>
inline
TypeIDInit<T>::TypeIDInit()
{
  info.initialize(storage);
}

template <class T>
class NameInfo : public MetaClassGeneric {
public:
                                NameInfo() 
				: MetaClassGeneric( TypeIDInit<T>::info ) {}
};

class MetaClass<UUId>
: public NameInfo<UUId>
{
};

extern "C++"
inline void *operator new(size_t, void *place) throw() { return place; }

template <class T>
void
TypeIDInit<T>::metaclassConstructor( void* place )
{
  new ( place ) MetaClass<T>;
}

template class   TypeIDInit<UUId>   ;

