a870850cc8d164efdc322198a725e106cfa05975
[u/mrichter/AliRoot.git] / CONTAINERS / AliCTypes.h
1 #ifndef ALI_CTypes
2 #define ALI_CTypes
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 /* $Id$ */
7
8 //////////////////////////////////////////////////////////////////////////
9 //                                                                      //
10 // Ali C types                                                          //
11 //                     
12 // MI                                                                   //
13 // Macros for defining Containers                                       //
14 //                                                                      //
15 //////////////////////////////////////////////////////////////////////////
16 #include "TMemberInspector.h"
17 #include "TClass.h"
18 #include "TStorage.h"
19
20 class TDumpMembers : public TMemberInspector {
21 public:
22    TDumpMembers() { }
23    void Inspect(TClass *cl, const char *parent, const char *name, const void *addr);
24 };
25
26 //////////////////////////////////////////////////////////////////////////
27
28
29
30 // Removed:
31 // friend operator>>
32 // _ClassInit_
33 #define LClassDef(name,id) \
34 private: \
35    static TClass *fgIsA; \
36 public: \
37    static TClass *Class(); \
38    static const char *Class_Name(); \
39    static Version_t Class_Version() { return id; } \
40    static void Dictionary(); \
41    TClass *IsA() const { return name::Class(); } \
42    void ShowMembers(TMemberInspector &insp, char *parent); \
43    void Streamer(TBuffer &b); \
44    static const char *DeclFileName() { return __FILE__; } \
45    static int DeclFileLine() { return __LINE__; } \
46    static const char *ImplFileName(); \
47    static int ImplFileLine();  \
48    void    *operator new(size_t sz) { return TStorage::ObjectAlloc(sz); } \
49    void    *operator new(size_t sz, void *vp) { return vp; } \
50    void  Dump();
51    static int ImplFileLine();  
52
53 #define LClassImp(name)  \
54   void name::Dump() { \
55      char parent[256]; \
56      parent[0] = 0;  \
57      TDumpMembers dm;  \
58      ShowMembers(dm, parent); \
59   } \
60   ClassImp(name)
61
62
63 /*
64 #define ClassArrayDef(name) \
65 private: \
66   static AliArrayVT * fgArrayInfo;  \
67 public: \
68   static name * Unchecked1DAt(const AliObjectArray & arr, UInt_t index)\
69     { return ((name*)arr.Unchecked1DAt(index));} \
70   static name * Unchecked2DAt(const AliObjectArray & arr, UInt_t index)  \
71     { return ((name*)arr.Unchecked2DAt(index));} \
72   static name * UncheckedAt(const AliObjectArray & arr, UInt_t index)  \
73     { return (name*)arr.UncheckedAt(index);}  \
74   static name * At(const AliObjectArray & arr, UInt_t index)  \
75     { return (arr.GetClassInfo()==fgArrayInfo) ? (name*)arr.At(index): 0;}  \
76   static name * CastAt(const AliObjectArray & arr, UInt_t index)  \
77     { return (name*) ((arr.GetClass())->DynamicCast(Class(), arr.At(index))) ;}  \
78   static AliArrayVT *  GetArrayInfo(); \
79
80
81
82 //This should be in automatic generated code
83 #define ClassArrayImp(name) \
84 AliArrayVT *  name::fgArrayInfo = 0; \
85 char *name ##__MakeBuffer(UInt_t size) { return (char*)new  name[size];} \
86 void  name ##__DeleteBuffer(void *p) {delete [] (name*)p;}  \
87 int   name ##__Cmp(char *p1, char * p2){return ((name*)p1)->Compare((name*)p2);}  \
88 void  name ##__StreamObject(TBuffer&   b, char * object){ ((name*)object)->Streamer(b);} \
89 void  name ##__StreamBuffer(TBuffer&   b, char * object, UInt_t size ); \
90 void  name ##__DumpObject(char *p) {return ((name*)p)->Dump();}  \
91 void  name ##__StreamBuffer(TBuffer&   b, char * object, UInt_t size ) \
92 { \
93   for (UInt_t i=0;i<size;i++) ((name*)object)[i].Streamer(b); \
94 } \
95 void name ##__DTORBuffer(void *p) { \
96   ((name*)p)->~name(); \
97 } \
98 void name ##__CTORBuffer(void *p) { \
99    new (p)name; \
100 } \
101 void name ##__DTORBuffer(void *p, const UInt_t size) { \
102   name * pp = (name*)p; \
103   name * pmax  = pp+size; \
104   while (pp<pmax) (pp++)->~name(); \
105 } \
106 void name ##__CTORBuffer(void *p, const UInt_t size) { \
107    name * pp = (name*)p; \
108    name * pmax  = pp+size; \
109   while (pp<pmax) new (pp++)name; \
110 } \
111 AliArrayVT *name::GetArrayInfo() \
112 {  \
113   if (!fgArrayInfo) {  \
114      fgArrayInfo = new AliArrayVT;    \
115      fgArrayInfo->cmp = &(name ##__Cmp); \
116      fgArrayInfo->delbuffer = &(name ##__DeleteBuffer); \
117      fgArrayInfo->mkbuffer = &(name ##__MakeBuffer);  \
118      fgArrayInfo->ctorbuffer = &(name ##__CTORBuffer); \
119      fgArrayInfo->dtorbuffer = &(name ##__DTORBuffer);  \
120      fgArrayInfo->stream  =  &(name ##__StreamObject); \
121      fgArrayInfo->streamb =  &(name ##__StreamBuffer); \
122      fgArrayInfo->dump =   &(name ##__DumpObject); \
123      fgArrayInfo->fClass = name::Class(); \
124      fgArrayInfo->fClassName = "name"; \
125      fgArrayInfo->fSize = sizeof(name); \
126   }  \
127   return fgArrayInfo; \
128
129 */
130
131
132 #endif  // ALI_CTypes