00001 #ifndef BASE_BUFFER_H 00002 #define BASE_BUFFER_H 00003 00004 #include "base/SubEvent.h" 00005 00006 namespace base { 00007 00011 struct RawDataRec { 00012 int refcnt; // number of references 00013 00014 unsigned kind; // like ROC event, SPADIC or MBS or .. 00015 unsigned boardid; // board id 00016 unsigned format; // raw data format like optic, Ethernet for ROC and so on 00017 00018 GlobalTime_t local_tm; // buffer head time in local scale, 00019 GlobalTime_t global_tm; // buffer head time in global time 00020 00021 void* buf; // raw data 00022 unsigned datalen; // length of raw data 00023 00024 RawDataRec() : refcnt(0), kind(0), boardid(0), format(0), local_tm(0), global_tm(0), buf(0), datalen(0) {} 00025 00026 void reset() 00027 { 00028 refcnt = 0; 00029 kind = 0; 00030 boardid = 0; 00031 format = 0; 00032 local_tm = 0; 00033 global_tm = 0; 00034 buf = 0; 00035 datalen = 0; 00036 } 00037 }; 00038 00039 class Buffer { 00040 protected: 00041 RawDataRec* fRec; 00042 public: 00043 Buffer() : fRec(0) {} 00044 Buffer(const Buffer& src) : fRec(src.fRec) { if (fRec) fRec->refcnt++; } 00045 ~Buffer() { reset(); } 00046 00047 Buffer& operator=(const Buffer& src) 00048 { 00049 reset(); 00050 fRec = src.fRec; 00051 if (fRec) fRec->refcnt++; 00052 return *this; 00053 } 00054 00055 bool null() const { return fRec==0; } 00056 00057 void reset(); 00058 00059 RawDataRec& operator()(void) const { return *fRec; } 00060 00061 RawDataRec& rec() const { return *fRec; } 00062 00065 void makecopyof(void* buf, unsigned datalen); 00066 00070 void makereferenceof(void* buf, unsigned datalen); 00071 00072 }; 00073 00074 } 00075 00076 #endif