Line data Source code
1 : // XEMacs -*-C++-*-
2 : #ifndef ALIHLTHOMERDATA_H
3 : #define ALIHLTHOMERDATA_H
4 :
5 : //************************************************************************
6 : //*
7 : //*
8 : //* This file is property of and copyright by the Technical Computer
9 : //* Science Group, Kirchhoff Institute for Physics, Ruprecht-Karls-
10 : //* University, Heidelberg, Germany, 2001
11 : //* This file has been written by Timm Morten Steinbeck,
12 : //* timm@kip.uni-heidelberg.de
13 : //*
14 : //*
15 : //* See the file license.txt for details regarding usage, modification,
16 : //* distribution and warranty.
17 : //* Important: This file is provided without any warranty, including
18 : //* fitness for any particular purpose.
19 : //*
20 : //*
21 : //* Newer versions of this file's package will be made available from
22 : //* http://web.kip.uni-heidelberg.de/Hardwinf/L3/
23 : //* or the corresponding page of the Heidelberg Alice Level 3 group.
24 : //*
25 : //************************************************************************/
26 :
27 : /*
28 : ***************************************************************************
29 : **
30 : ** $Author$ - Initial Version by Timm Morten Steinbeck
31 : **
32 : ** $Id$
33 : **
34 : ***************************************************************************
35 : */
36 :
37 : #ifdef USE_ROOT
38 : #include "Rtypes.h"
39 : #endif
40 : #include <limits.h>
41 :
42 :
43 : // Determine the sizes of the different integer type
44 : // homer_uint32, homer_uint64
45 : #if !defined(USE_ROOT) && !defined(__CINT__)
46 : // First homer_uint32
47 : #if USHRT_MAX==4294967295
48 : typedef unsigned short homer_uint32;
49 : #else // USHRT_MAX==4294967295
50 :
51 : #if UINT_MAX==4294967295
52 : typedef unsigned int homer_uint32;
53 : #else // UINT_MAX==4294967295
54 :
55 : #if ULONG_MAX==4294967295l
56 : typedef unsigned long homer_uint32;
57 : #else // ULONG_MAX==4294967295l
58 :
59 : #error Could not typedef homer_uint32
60 :
61 : #endif // ULONG_MAX==4294967295l
62 :
63 : #endif // UINT_MAX==4294967295
64 :
65 : #endif // USHRT_MAX==4294967295
66 :
67 : // Then homer_uint16
68 : #if USHRT_MAX==65535
69 : typedef unsigned short homer_uint16;
70 : #else // USHRT_MAX==65535
71 :
72 : #if UINT_MAX==65535
73 : typedef unsigned int homer_uint16;
74 : #else // UINT_MAX==65535
75 :
76 : #if ULONG_MAX==65535
77 : typedef unsigned long homer_uint16;
78 : #else // ULONG_MAX==65535
79 :
80 : #error Could not typedef homer_uint16
81 :
82 : #endif // ULONG_MAX==65535
83 :
84 : #endif // UINT_MAX==65535
85 :
86 : #endif // USHRT_MAX==65535
87 :
88 : // Then homer_uint64
89 : #if ULONG_MAX==18446744073709551615UL
90 : typedef unsigned long homer_uint64;
91 : #else // ULONG_MAX==18446744073709551615UL
92 :
93 : #if defined __GNUC__
94 : typedef unsigned long long homer_uint64;
95 : #else // defined __GNUC__
96 :
97 : #if defined __SUNPRO_CC
98 : typedef unsigned long long homer_uint64;
99 : #else // defined __SUNPRO_CC
100 :
101 : #error Could not typedef homer_uint64
102 :
103 : #endif // defined __SUNPRO_CC
104 : #endif // defined __GNUC__
105 :
106 : #endif // ULONG_MAX==18446744073709551615UL
107 :
108 : typedef unsigned char homer_uint8;
109 :
110 : #else // !USE_ROOT && !CINT
111 :
112 :
113 : typedef UShort_t homer_uint16;
114 : typedef UInt_t homer_uint32;
115 : typedef ULong64_t homer_uint64;
116 : typedef Byte_t homer_uint8;
117 :
118 : #ifdef __CINT__
119 : typedef int key_t;
120 : #endif
121 :
122 : #endif // USE_ROOT
123 :
124 : //typedef homer_uint64 AliEventID_t;
125 :
126 :
127 : #define kAttribute_8b_StartOffset 0
128 : #define kByteOrderAttribute_8b_Offset kAttribute_8b_StartOffset+0
129 : #define kVersionAttribute_8b_Offset kAttribute_8b_StartOffset+1
130 : #define kAlignment_8b_StartOffset 24
131 : #define kUInt64Alignment_8b_Offset kAlignment_8b_StartOffset+0
132 : #define kUInt32Alignment_8b_Offset kAlignment_8b_StartOffset+1
133 : #define kUInt16Alignment_8b_Offset kAlignment_8b_StartOffset+2
134 : #define kUInt8Alignment_8b_Offset kAlignment_8b_StartOffset+3
135 : #define kDoubleAlignment_8b_Offset kAlignment_8b_StartOffset+4
136 : #define kFloatAlignment_8b_Offset kAlignment_8b_StartOffset+5
137 :
138 :
139 : #define kID_64b_Offset 1
140 : #define kLength_64b_Offset 2
141 : #define kType_64b_Offset 4
142 : #define kSubType1_64b_Offset 5
143 : #define kSubType2_64b_Offset 6
144 : #define kBirth_s_64b_Offset 7
145 : #define kBirth_us_64b_Offset 8
146 : #define kProducerNode_64b_Offset 9
147 : #define kOffset_64b_Offset 10
148 : #define kSize_64b_Offset 11
149 : #define kStatusFlags_64b_Offset 12
150 : #define kEnd_64b_Offset 13
151 : #define kCount_64b_Words kEnd_64b_Offset
152 :
153 : // Possible values for fAttributes[kByteOrderAttribute]
154 : /* Keep this consistent with BCLNetworkData.hpp kLittleEndian/kBigEndian and AliHLTSubEventDataDescriptor.hpp */
155 : const homer_uint8 kHOMERUnknownByteOrder = 0;
156 : const homer_uint8 kHOMERLittleEndianByteOrder = 1;
157 : const homer_uint8 kHOMERBigEndianByteOrder = 2;
158 : #ifdef __i386__
159 : const homer_uint8 kHOMERNativeByteOrder = kHOMERLittleEndianByteOrder;
160 : #else
161 : #ifdef __arm__
162 : const homer_uint8 kHOMERNativeByteOrder = kHOMERLittleEndianByteOrder;
163 : #else
164 : #ifdef __x86_64__
165 : const homer_uint8 kHOMERNativeByteOrder = kHOMERLittleEndianByteOrder;
166 : #else
167 : #ifdef __ia64__
168 : const homer_uint8 kHOMERNativeByteOrder = kHOMERLittleEndianByteOrder;
169 : #else
170 : #if defined(__powerpc__)
171 : const homer_uint8 kHOMERNativeByteOrder = kHOMERBigEndianByteOrder;
172 : #else
173 : #ifdef __CINT__
174 : const homer_uint8 kHOMERNativeByteOrder = kHOMERLittleEndianByteOrder;
175 : #warning Assuming little endian format for __CINT__
176 : #else
177 : const homer_uint8 kHOMERNativeByteOrder = kHOMERLittleEndianByteOrder;
178 : #warning Assuming little endian format for unknown architecture
179 : //#error Byte format (little/big endian) currently not defined for platforms other than intel i386 compatible, x86-64 (AMD64) and arm...
180 : #endif
181 : #endif
182 : #endif
183 : #endif
184 : #endif
185 : #endif
186 :
187 :
188 : //#define HOMER_BLOCK_DESCRIPTOR_TYPEID (((homer_uint64)'HOBL')<<32 | 'KDES')
189 : #define HOMER_BLOCK_DESCRIPTOR_TYPEID ( (((homer_uint64)'H')<<56)|(((homer_uint64)'O')<<48)|(((homer_uint64)'B')<<40)|(((homer_uint64)'L')<<32)|(((homer_uint64)'K')<<24)|(((homer_uint64)'D')<<16)|(((homer_uint64)'E')<<8)|(((homer_uint64)'S')<<0) )
190 : //#define HOMER_BLOCK_DESCRIPTOR_TYPEID ( (((homer_uint64)'H')<<56)|(((homer_uint64)'O')<<48) )
191 : #define HOMER_HEADER_CURRENT_VERSION 2
192 :
193 :
194 : class AliHLTHOMERBlockDescriptor
195 : {
196 : public:
197 :
198 : static unsigned GetHOMERBlockDescriptorSize()
199 : {
200 0 : return sizeof(homer_uint64)*kCount_64b_Words;
201 : }
202 :
203 : AliHLTHOMERBlockDescriptor( void* header = 0 )
204 0 : : fHeader(header)
205 0 : {
206 0 : }
207 : void UseHeader( void* header )
208 : {
209 0 : fHeader = header;
210 0 : }
211 : void Initialize()
212 : {
213 0 : if ( fHeader )
214 : {
215 0 : for ( unsigned ii=0; ii<kCount_64b_Words; ii++ )
216 0 : ((homer_uint64*)fHeader)[ ii ] = (homer_uint64)0;
217 0 : ((homer_uint64*)fHeader)[ kID_64b_Offset ] = HOMER_BLOCK_DESCRIPTOR_TYPEID;
218 0 : ((homer_uint64*)fHeader)[ kLength_64b_Offset ] = GetHOMERBlockDescriptorSize();
219 0 : ((homer_uint8*)fHeader)[ kByteOrderAttribute_8b_Offset ] = kHOMERNativeByteOrder;
220 0 : ((homer_uint8*)fHeader)[ kVersionAttribute_8b_Offset ] = HOMER_HEADER_CURRENT_VERSION;
221 0 : }
222 0 : }
223 :
224 : void SetByteOrder( homer_uint8 bo ) const
225 : {
226 : if ( fHeader )
227 : ((homer_uint8*)fHeader)[ kByteOrderAttribute_8b_Offset ] = bo;
228 : }
229 : homer_uint8 GetByteOrder() const
230 : {
231 : if ( fHeader )
232 : return ((homer_uint8*)fHeader)[ kByteOrderAttribute_8b_Offset ];
233 : return 0xFF;
234 : }
235 : void SetVersion( homer_uint8 v ) const
236 : {
237 : if ( fHeader )
238 : ((homer_uint8*)fHeader)[ kVersionAttribute_8b_Offset ] = v;
239 : }
240 : void SetID( homer_uint64 id ) const
241 : {
242 : if ( fHeader )
243 : ((homer_uint64*)fHeader)[ kID_64b_Offset ] = id;
244 : }
245 : void SetHeaderLength( homer_uint64 l ) const
246 : {
247 : if ( fHeader )
248 : ((homer_uint64*)fHeader)[ kLength_64b_Offset ] = l;
249 : }
250 : homer_uint64 GetHeaderLength() const
251 : {
252 0 : if ( fHeader )
253 0 : return ((homer_uint64*)fHeader)[ kLength_64b_Offset ];
254 0 : return 0;
255 0 : }
256 : void SetAlignment( homer_uint8 type, homer_uint8 align ) const
257 : {
258 : if ( fHeader && type<6 )
259 : ((homer_uint8*)fHeader)[ kAlignment_8b_StartOffset+type ] = align;
260 : }
261 : void SetUInt64Alignment( homer_uint8 align ) const
262 : {
263 0 : if ( fHeader )
264 0 : ((homer_uint8*)fHeader)[ kUInt64Alignment_8b_Offset ] = align;
265 0 : }
266 : void SetUInt32Alignment( homer_uint8 align ) const
267 : {
268 0 : if ( fHeader )
269 0 : ((homer_uint8*)fHeader)[ kUInt32Alignment_8b_Offset ] = align;
270 0 : }
271 : void SetUInt16Alignment( homer_uint8 align ) const
272 : {
273 0 : if ( fHeader )
274 0 : ((homer_uint8*)fHeader)[ kUInt16Alignment_8b_Offset ] = align;
275 0 : }
276 : void SetUInt8Alignment( homer_uint8 align ) const
277 : {
278 0 : if ( fHeader )
279 0 : ((homer_uint8*)fHeader)[ kUInt8Alignment_8b_Offset ] = align;
280 0 : }
281 : void SetDoubleAlignment( homer_uint8 align ) const
282 : {
283 0 : if ( fHeader )
284 0 : ((homer_uint8*)fHeader)[ kDoubleAlignment_8b_Offset ] = align;
285 0 : }
286 : void SetFloatAlignment( homer_uint8 align ) const
287 : {
288 0 : if ( fHeader )
289 0 : ((homer_uint8*)fHeader)[ kFloatAlignment_8b_Offset ] = align;
290 0 : }
291 : void SetType( homer_uint64 t ) const
292 : {
293 0 : if ( fHeader )
294 0 : ((homer_uint64*)fHeader)[ kType_64b_Offset ] = t;
295 0 : }
296 : void SetSubType1( homer_uint64 st1 ) const
297 : {
298 0 : if ( fHeader )
299 0 : ((homer_uint64*)fHeader)[ kSubType1_64b_Offset ] = st1;
300 0 : }
301 : void SetSubType2( homer_uint64 st2 ) const
302 : {
303 0 : if ( fHeader )
304 0 : ((homer_uint64*)fHeader)[ kSubType2_64b_Offset ] = st2;
305 0 : }
306 : void SetBirth_s( homer_uint64 bs ) const
307 : {
308 0 : if ( fHeader )
309 0 : ((homer_uint64*)fHeader)[ kBirth_s_64b_Offset ] = bs;
310 0 : }
311 : void SetBirth_us( homer_uint64 bus ) const
312 : {
313 0 : if ( fHeader )
314 0 : ((homer_uint64*)fHeader)[ kBirth_us_64b_Offset ] = bus;
315 0 : }
316 : void SetProducerNode( homer_uint64 pn ) const
317 : {
318 0 : if ( fHeader )
319 0 : ((homer_uint64*)fHeader)[ kProducerNode_64b_Offset ] = pn;
320 0 : }
321 : void SetBlockOffset( homer_uint64 bo ) const
322 : {
323 0 : if ( fHeader )
324 0 : ((homer_uint64*)fHeader)[ kOffset_64b_Offset ] = bo;
325 0 : }
326 : homer_uint64 GetBlockOffset() const
327 : {
328 0 : if ( fHeader )
329 0 : return ((homer_uint64*)fHeader)[ kOffset_64b_Offset ];
330 0 : return 0;
331 0 : }
332 : void SetBlockSize( homer_uint64 bs ) const
333 : {
334 0 : if ( fHeader )
335 0 : ((homer_uint64*)fHeader)[ kSize_64b_Offset ] = bs;
336 0 : }
337 : homer_uint64 GetBlockSize() const
338 : {
339 0 : if ( fHeader )
340 0 : return ((homer_uint64*)fHeader)[ kSize_64b_Offset ];
341 0 : return 0;
342 0 : }
343 : void SetStatusFlags( homer_uint64 bs ) const
344 : {
345 0 : if ( fHeader )
346 0 : ((homer_uint64*)fHeader)[ kStatusFlags_64b_Offset ] = bs;
347 0 : }
348 : homer_uint64 GetStatusFlags() const
349 : {
350 : if ( fHeader )
351 : return ((homer_uint64*)fHeader)[ kStatusFlags_64b_Offset ];
352 : return 0;
353 : }
354 :
355 : void* GetHeader() const
356 : {
357 0 : return fHeader;
358 : }
359 :
360 : protected:
361 : void* fHeader; //! transient
362 :
363 : private:
364 : /** copy constructor prohibited */
365 : AliHLTHOMERBlockDescriptor(const AliHLTHOMERBlockDescriptor&);
366 : /** assignment operator prohibited */
367 : AliHLTHOMERBlockDescriptor& operator=(const AliHLTHOMERBlockDescriptor&);
368 : };
369 :
370 : // the HOMERBlockDescriptor is used in the code
371 : typedef class AliHLTHOMERBlockDescriptor HOMERBlockDescriptor;
372 :
373 :
374 : /*
375 : ***************************************************************************
376 : **
377 : ** $Author$ - Initial Version by Timm Morten Steinbeck
378 : **
379 : ** $Id$
380 : **
381 : ***************************************************************************
382 : */
383 :
384 : #endif // ALIHLTHOMERDATA_H
|