00001
00010 #ifndef StArchInfo_h
00011 #define StArchInfo_h
00012
00013 #include <stdlib.h>
00014
00015 #include "TNamed.h"
00016
00017 #if !defined(__LITTLE_ENDIAN)
00018 # define __LITTLE_ENDIAN 1234
00019 #endif
00020 #if !defined(__BIG_ENDIAN)
00021 # define __BIG_ENDIAN 4321
00022 #endif
00023 #if !defined(__PDP_ENDIAN)
00024 # define __PDP_ENDIAN 3412
00025 #endif
00026
00027
00028
00029 class StArchInfo :public TNamed {
00030 public:
00031 StArchInfo();
00032 ~StArchInfo();
00033
00034
00035 Bool_t isBigEndian();
00036 Bool_t isLittleEndian();
00037 Int_t Endian();
00038
00040 template<typename T> static long align(const T &)
00041 {
00042 return align<T>();
00043 }
00044
00046
00051 template<typename T> static int align()
00052 {
00053 static int done = -1;
00054 if (done<0) {
00055 struct { char c; T test; } probe;
00056 done = ((char*)&probe.test)-&probe.c;
00057 }
00058 return done;
00059 }
00060
00062
00067 template <typename C, typename T> static int padding(const T&offset)
00068 {
00069 long offchar = (long)&offset;
00070 long alg = align<C>();
00071 return int((alg + ((offchar - 1) & ~(alg - 1))) - offchar);
00072 }
00073
00075
00080 template <typename T, typename C> static int padding(const T&offset, const C&)
00081 {
00082 return padding<C,T>(offset);
00083 }
00084 private:
00085 Int_t fEndian;
00086
00087 ClassDef(StArchInfo,0)
00088 };
00089
00090 #endif