00001 //Dear emacs, this is -*- c++ -*- 00002 00013 #ifndef EFORMAT_WRITE_SUBDETECTORFRAGMENT_H 00014 #define EFORMAT_WRITE_SUBDETECTORFRAGMENT_H 00015 00016 #include "eformat/write/ROSFragment.h" 00017 00018 namespace eformat { 00019 00020 namespace write { 00021 00022 class FullEventFragment; 00023 00027 class SubDetectorFragment { 00028 00029 public: 00030 00037 SubDetectorFragment (uint32_t source_id); 00038 00045 SubDetectorFragment (uint32_t* sd); 00046 00057 SubDetectorFragment (eformat::write::node_t* sd); 00058 00063 SubDetectorFragment (); 00064 00076 SubDetectorFragment (const SubDetectorFragment& other); 00077 00081 virtual ~SubDetectorFragment () {} 00082 00094 SubDetectorFragment& operator= (const SubDetectorFragment& other); 00095 00104 void status (uint32_t n, const uint32_t* status); 00105 00109 inline uint32_t nstatus (void) const { return m_node[0].base[5]; } 00110 00114 inline const uint32_t* status (void) const { return m_node[1].base; } 00115 00121 inline void minor_version (uint16_t v) 00122 { m_node[0].base[3] = eformat::DEFAULT_VERSION | v; } 00123 00127 inline uint16_t minor_version (void) const 00128 { return 0xffff & m_node[0].base[3]; } 00129 00135 inline void source_id (uint32_t s) 00136 { m_node[0].base[4] = s; } 00137 00141 inline uint32_t source_id (void) const 00142 { return m_node[0].base[4]; } 00143 00149 inline uint32_t meta_size_word (void) const 00150 { return m_node[0].base[2]; } 00151 00155 inline uint32_t size_word (void) const 00156 { return m_node[0].base[1]; } 00157 00171 void append (eformat::write::ROSFragment* ros); 00172 00178 inline const ROSFragment* first_child (void) const { return m_child; } 00179 00187 void size_change (uint32_t o, uint32_t n); 00188 00192 inline const FullEventFragment* parent (void) const 00193 { return m_parent; } 00194 00200 inline void parent (eformat::write::FullEventFragment* fe) 00201 { m_parent = fe; } 00202 00206 inline const SubDetectorFragment* next (void) const { return m_next; } 00207 00213 inline void next (const SubDetectorFragment* n) { m_next = n; } 00214 00224 uint32_t page_count (void) const; 00225 00231 const eformat::write::node_t* bind (void); 00232 00233 private: //representation 00234 00235 uint32_t m_header[7]; 00236 eformat::write::node_t m_node[3]; 00237 eformat::write::FullEventFragment* m_parent; 00238 eformat::write::ROSFragment* m_child; 00239 eformat::write::ROSFragment* m_last; 00240 const eformat::write::SubDetectorFragment* m_next; 00241 eformat::write::node_t m_extra; 00242 uint32_t m_extra_count; 00243 00244 }; 00245 00246 } 00247 00248 } 00249 00250 #endif /* EFORMAT_WRITE_SUBDETECTORFRAGMENT_H */