blob: 0aee9c3b55879f9984d28c099c547110a3bf9e7f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
// { dg-do assemble }
// 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 ) {}
};
template <>
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> ;
|