00001
00002
00003 #ifndef _included_PackedDataBucketVoid_h
00004 #define _included_PackedDataBucketVoid_h
00005
00011 #ifdef DEBUG_PRINT_DBKT_MEMORY
00012 #include "DAGHMemoryTrace.h"
00013 #endif
00014
00015 #include <cassert>
00016
00017 struct dbkthdr
00018 { unsigned headsize; unsigned datasize; int cnt; };
00019
00020 struct dbkthdrdata
00021 {
00022 unsigned headsize; unsigned datasize; int cnt;
00023 unsigned data[1];
00024 };
00025
00026 union drecord
00027 {
00028 struct dbkthdr head;
00029 struct dbkthdrdata rec;
00030 };
00031
00036 class DataBucketVoid
00037 {
00038 unsigned headsize;
00039 unsigned datasize;
00040 int cnt;
00041 unsigned *hs;
00042 unsigned *ds;
00043 union drecord *bkt;
00044
00045 private:
00046 DataBucketVoid(const DataBucketVoid&);
00047 void operator = (const DataBucketVoid&);
00048
00049 public:
00050 inline DataBucketVoid(void)
00051 : headsize(0), datasize(0), cnt(0), hs(0), ds(0), bkt(0) {}
00052
00053 DataBucketVoid(unsigned const hsize, unsigned const dsize);
00054 DataBucketVoid(unsigned *hsize, unsigned *dsize, int const n);
00055 DataBucketVoid(unsigned hsize, unsigned *dsize, int const n);
00056 DataBucketVoid(union drecord const *package);
00057 DataBucketVoid(union drecord *package);
00058 DataBucketVoid(union drecord const *package, int const n);
00059
00060 inline ~DataBucketVoid(void)
00061 {
00062
00063 #ifdef DEBUG_PRINT_DBKT_MEMORY
00064 DAGHMemoryTrace::free(sizeof(unsigned)*cnt);
00065 DAGHMemoryTrace::free(sizeof(unsigned)*cnt);
00066 DAGHMemoryTrace::free(sizeof(char)*(headsize+datasize));
00067 #endif
00068
00069 if (hs) delete [] hs;
00070 if (ds) delete [] ds;
00071 if (bkt) delete [] ((char *)bkt);
00072 }
00073
00074 inline int num(void) const
00075 { return (cnt); }
00076 inline int num(void)
00077 { return (cnt); }
00078
00079 inline void *head(void)
00080 { return ((void *) ((union drecord *)((char *)(bkt)+hs[0]))->rec.data); }
00081 inline void const *head(void) const
00082 { return ((void *) ((union drecord *)((char *)(bkt)+hs[0]))->rec.data); }
00083
00084 inline void *head(int const i)
00085 { assert (i<cnt);
00086 return ((void *) ((union drecord *)((char *)(bkt)+hs[i]))->rec.data); }
00087 inline void const *head(int const i) const
00088 { assert (i<cnt);
00089 return ((void *) ((union drecord *)((char *)(bkt)+hs[i]))->rec.data); }
00090
00091 inline void *data(void)
00092 { return ((void *) ((char *)(bkt)+ds[0])); }
00093 inline void const *data(void) const
00094 { return ((void *) ((char *)(bkt)+ds[0])); }
00095
00096 inline void *data(int const i)
00097 { assert (i<cnt);
00098 return ((void *) ((char *)(bkt)+ds[i])); }
00099 inline void const *data(int const i) const
00100 { assert (i<cnt);
00101 return ((void *) ((char *)(bkt)+ds[i])); }
00102
00103 inline void *pack(unsigned& size)
00104 { size = headsize+datasize; return((void *) bkt); }
00105 inline void pack(void *&package, unsigned& size)
00106 { size = headsize+datasize; package = (void *) bkt; }
00107 };
00108
00109 #endif