Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/g4tools/include/tools/rroot/obj_array

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /externals/g4tools/include/tools/rroot/obj_array (Version 11.3.0) and /externals/g4tools/include/tools/rroot/obj_array (Version 11.0.p4)


  1 // Copyright (C) 2010, Guy Barrand. All rights      1 // Copyright (C) 2010, Guy Barrand. All rights reserved.
  2 // See the file tools.license for terms.            2 // See the file tools.license for terms.
  3                                                     3 
  4 #ifndef tools_rroot_obj_array                       4 #ifndef tools_rroot_obj_array
  5 #define tools_rroot_obj_array                       5 #define tools_rroot_obj_array
  6                                                     6 
  7 #include "object"                                   7 #include "object"
  8 #include "../vmanip"                                8 #include "../vmanip"
  9 #include "../scast"                                 9 #include "../scast"
 10                                                    10 
 11 #include "cids"                                    11 #include "cids"
 12                                                    12 
 13 namespace tools {                                  13 namespace tools {
 14 namespace rroot {                                  14 namespace rroot {
 15                                                    15 
 16 template <class T>                                 16 template <class T>
 17 class obj_array : public virtual iro,public st     17 class obj_array : public virtual iro,public std::vector<T*> {
 18   typedef typename std::vector<T*> parent;         18   typedef typename std::vector<T*> parent;
 19 private:                                           19 private:
 20   static const std::string& s_store_class() {      20   static const std::string& s_store_class() {
 21     static const std::string s_v("TObjArray");     21     static const std::string s_v("TObjArray");
 22     return s_v;                                    22     return s_v;
 23   }                                                23   }
 24 public:                                            24 public:
 25   static const std::string& s_class() {            25   static const std::string& s_class() {
 26     static const std::string s_v("tools::rroot     26     static const std::string s_v("tools::rroot::obj_array<"+T::s_class()+">");
 27     return s_v;                                    27     return s_v;
 28   }                                                28   }
 29 public: //iro                                      29 public: //iro
 30   virtual void* cast(const std::string& a_clas     30   virtual void* cast(const std::string& a_class) const {
 31     if(void* p = cmp_cast< obj_array<T> >(this     31     if(void* p = cmp_cast< obj_array<T> >(this,a_class)) return p;
 32     return 0;                                      32     return 0;
 33   }                                                33   }
 34   virtual const std::string& s_cls() const {re     34   virtual const std::string& s_cls() const {return s_class();}
 35 public:                                            35 public:
 36   static cid id_class() {return obj_array_cid(     36   static cid id_class() {return obj_array_cid()+T::id_class();}
 37   virtual void* cast(cid a_class) const {          37   virtual void* cast(cid a_class) const {
 38     if(void* p = cmp_cast<obj_array>(this,a_cl     38     if(void* p = cmp_cast<obj_array>(this,a_class)) {return p;}
 39     return 0;                                      39     return 0;
 40   }                                                40   }
 41   virtual iro* copy() const {return new obj_ar     41   virtual iro* copy() const {return new obj_array<T>(*this);}
 42   virtual bool stream(buffer& a_buffer) {          42   virtual bool stream(buffer& a_buffer) {
 43     ifac::args args;                               43     ifac::args args;
 44     bool accept_null = false;                      44     bool accept_null = false;
 45     return stream(a_buffer,args,accept_null);      45     return stream(a_buffer,args,accept_null);
 46   }                                                46   }
 47 public:                                            47 public:
 48   obj_array(ifac& a_fac)                           48   obj_array(ifac& a_fac)
 49   :m_fac(a_fac)                                    49   :m_fac(a_fac)
 50   {                                                50   {
 51 #ifdef TOOLS_MEM                                   51 #ifdef TOOLS_MEM
 52     mem::increment(s_class().c_str());             52     mem::increment(s_class().c_str());
 53 #endif                                             53 #endif
 54   }                                                54   }
 55   virtual ~obj_array(){                            55   virtual ~obj_array(){
 56     _clear();                                      56     _clear();
 57 #ifdef TOOLS_MEM                                   57 #ifdef TOOLS_MEM
 58     mem::decrement(s_class().c_str());             58     mem::decrement(s_class().c_str());
 59 #endif                                             59 #endif
 60   }                                                60   }
 61 public:                                            61 public:
 62   obj_array(const obj_array& a_from)               62   obj_array(const obj_array& a_from)
 63   :iro(a_from)                                     63   :iro(a_from)
 64   ,parent()                                        64   ,parent()
 65   ,m_fac(a_from.m_fac)                             65   ,m_fac(a_from.m_fac)
 66   {                                                66   {
 67 #ifdef TOOLS_MEM                                   67 #ifdef TOOLS_MEM
 68     mem::increment(s_class().c_str());             68     mem::increment(s_class().c_str());
 69 #endif                                             69 #endif
 70     typedef typename parent::const_iterator it     70     typedef typename parent::const_iterator it_t;
 71     for(it_t it=a_from.begin();it!=a_from.end(     71     for(it_t it=a_from.begin();it!=a_from.end();++it) {
 72       if(!(*it)) {                                 72       if(!(*it)) {
 73         parent::push_back(0);                      73         parent::push_back(0);
 74         m_owns.push_back(false);                   74         m_owns.push_back(false);
 75       } else {                                     75       } else {
 76         iro* _obj = (*it)->copy();                 76         iro* _obj = (*it)->copy();
 77         T* obj = safe_cast<iro,T>(*_obj);          77         T* obj = safe_cast<iro,T>(*_obj);
 78         if(!obj) {                                 78         if(!obj) {
 79           m_fac.out() << "tools::rroot::obj_ar     79           m_fac.out() << "tools::rroot::obj_array::obj_array :"
 80                       << " tools::cast failed. <<  80                       << " inlib::cast failed."
 81                       << std::endl;                81                       << std::endl;
 82           delete _obj;                             82           delete _obj;
 83           parent::push_back(0);                    83           parent::push_back(0);
 84           m_owns.push_back(false);                 84           m_owns.push_back(false);
 85         } else {                                   85         } else {
 86           parent::push_back(obj);                  86           parent::push_back(obj);
 87           m_owns.push_back(true);                  87           m_owns.push_back(true);
 88         }                                          88         }
 89       }                                            89       }
 90     }                                              90     }
 91   }                                                91   }
 92   obj_array& operator=(const obj_array& a_from     92   obj_array& operator=(const obj_array& a_from){
 93     if(&a_from==this) return *this;                93     if(&a_from==this) return *this;
 94                                                    94 
 95     _clear();                                      95     _clear();
 96                                                    96 
 97     typedef typename parent::const_iterator it     97     typedef typename parent::const_iterator it_t;
 98     for(it_t it=a_from.begin();it!=a_from.end(     98     for(it_t it=a_from.begin();it!=a_from.end();++it) {
 99       if(!(*it)) {                                 99       if(!(*it)) {
100         parent::push_back(0);                     100         parent::push_back(0);
101         m_owns.push_back(false);                  101         m_owns.push_back(false);
102       } else {                                    102       } else {
103         iro* _obj = (*it)->copy();                103         iro* _obj = (*it)->copy();
104         T* obj = safe_cast<iro,T>(*_obj);         104         T* obj = safe_cast<iro,T>(*_obj);
105         if(!obj) {                                105         if(!obj) {
106           m_fac.out() << "tools::rroot::obj_ar    106           m_fac.out() << "tools::rroot::obj_array::operator= :"
107                       << " tools::cast failed. << 107                       << " inlib::cast failed."
108                       << std::endl;               108                       << std::endl;
109           delete _obj;                            109           delete _obj;
110           parent::push_back(0);                   110           parent::push_back(0);
111           m_owns.push_back(false);                111           m_owns.push_back(false);
112         } else {                                  112         } else {
113           parent::push_back(obj);                 113           parent::push_back(obj);
114           m_owns.push_back(true);                 114           m_owns.push_back(true);
115         }                                         115         }
116       }                                           116       }
117     }                                             117     }
118                                                   118 
119     return *this;                                 119     return *this;
120   }                                               120   }
121 public:                                           121 public:
122   void cleanup() {_clear();}                      122   void cleanup() {_clear();}
123 public:                                           123 public:
124   bool stream(buffer& a_buffer,const ifac::arg    124   bool stream(buffer& a_buffer,const ifac::args& a_args,bool a_accept_null = false) {
125     _clear();                                     125     _clear();
126                                                   126 
127     //::printf("debug : obj_array::stream : %l    127     //::printf("debug : obj_array::stream : %lu : begin\n",(unsigned long)this);
128                                                   128 
129     short v;                                      129     short v;
130     unsigned int sp, bc;                          130     unsigned int sp, bc;
131     if(!a_buffer.read_version(v,sp,bc)) return    131     if(!a_buffer.read_version(v,sp,bc)) return false;
132                                                   132 
133     //::printf("debug : obj_array::stream : ve    133     //::printf("debug : obj_array::stream : version %d, byte count %d\n",v,bc);
134                                                   134 
135    {uint32 id,bits;                               135    {uint32 id,bits;
136     if(!Object_stream(a_buffer,id,bits)) retur    136     if(!Object_stream(a_buffer,id,bits)) return false;}
137     std::string name;                             137     std::string name;
138     if(!a_buffer.read(name)) return false;        138     if(!a_buffer.read(name)) return false;
139     int nobjects;                                 139     int nobjects;
140     if(!a_buffer.read(nobjects)) return false;    140     if(!a_buffer.read(nobjects)) return false;
141     int lowerBound;                               141     int lowerBound;
142     if(!a_buffer.read(lowerBound)) return fals    142     if(!a_buffer.read(lowerBound)) return false;
143                                                   143 
144     //::printf("debug : obj_array : name \"%s\    144     //::printf("debug : obj_array : name \"%s\", nobject %d, lowerBound %d\n",name.c_str(),nobjects,lowerBound);
145                                                   145 
146     for (int i=0;i<nobjects;i++) {                146     for (int i=0;i<nobjects;i++) {
147       //::printf("debug : obj_array::stream :     147       //::printf("debug : obj_array::stream : %lu : n=%d i=%d ...\n",(unsigned long)this,nobjects,i);
148                                                   148 
149       iro* obj;                                   149       iro* obj;
150       bool created;                               150       bool created;
151       if(!a_buffer.read_object(m_fac,a_args,ob    151       if(!a_buffer.read_object(m_fac,a_args,obj,created)){
152         a_buffer.out() << "tools::rroot::obj_a    152         a_buffer.out() << "tools::rroot::obj_array::stream : can't read object"
153                        << " in obj_array : nam    153                        << " in obj_array : name " << sout(name)
154                        << ", nobjects " << nob    154                        << ", nobjects " << nobjects << ", iobject " << i << std::endl;
155         return false;                             155         return false;
156       }                                           156       }
157       //::printf("debug : obj_array::stream :     157       //::printf("debug : obj_array::stream : %lu : n=%d i=%d : ok, obj %lu\n",(unsigned long)this,
158       //    nobjects,i,(unsigned long)obj);       158       //    nobjects,i,(unsigned long)obj);
159       if(obj) {                                   159       if(obj) {
160         T* to = safe_cast<iro,T>(*obj);           160         T* to = safe_cast<iro,T>(*obj);
161         if(!to) {                                 161         if(!to) {
162           a_buffer.out() << "tools::rroot::obj    162           a_buffer.out() << "tools::rroot::obj_array::stream :"
163                          << " tools::cast fail << 163                          << " inlib::cast failed."
164                          << " " << obj->s_cls(    164                          << " " << obj->s_cls() << " is not a " << T::s_class() << "."
165                          << std::endl;            165                          << std::endl;
166           if(created) {                           166           if(created) {
167             if(a_buffer.map_objs()) a_buffer.r    167             if(a_buffer.map_objs()) a_buffer.remove_in_map(obj);
168             delete obj;                           168             delete obj;
169           }                                       169           }
170         } else {                                  170         } else {
171           if(created) {                           171           if(created) {
172             parent::push_back(to);                172             parent::push_back(to);
173             m_owns.push_back(true);               173             m_owns.push_back(true);
174           } else { //someone else manage this     174           } else { //someone else manage this object.
175             parent::push_back(to);                175             parent::push_back(to);
176             m_owns.push_back(false);              176             m_owns.push_back(false);
177           }                                       177           }
178         }                                         178         }
179       } else {                                    179       } else {
180         //a_accept_null for branch::stream m_b    180         //a_accept_null for branch::stream m_baskets.
181         if(a_accept_null) {                       181         if(a_accept_null) {
182     parent::push_back(0);                         182     parent::push_back(0);
183           m_owns.push_back(false);                183           m_owns.push_back(false);
184         }                                         184         }
185       }                                           185       }
186     }                                             186     }
187                                                   187 
188     return a_buffer.check_byte_count(sp,bc,s_s    188     return a_buffer.check_byte_count(sp,bc,s_store_class());
189   }                                               189   }
190 protected:                                        190 protected:
191   void _clear() {                                 191   void _clear() {
192     typedef typename parent::iterator it_t;       192     typedef typename parent::iterator it_t;
193     typedef std::vector<bool>::iterator itb_t;    193     typedef std::vector<bool>::iterator itb_t;
194     while(!parent::empty()) {                     194     while(!parent::empty()) {
195       it_t it = parent::begin();                  195       it_t it = parent::begin();
196       itb_t itb = m_owns.begin();                 196       itb_t itb = m_owns.begin();
197       T* entry  = (*it);                          197       T* entry  = (*it);
198       bool own = (*itb);                          198       bool own = (*itb);
199       parent::erase(it);                          199       parent::erase(it);
200       m_owns.erase(itb);                          200       m_owns.erase(itb);
201       if(own) delete entry;                       201       if(own) delete entry;
202     }                                             202     }
203   }                                               203   }
204 protected:                                        204 protected:
205   ifac& m_fac;                                    205   ifac& m_fac;
206   std::vector<bool> m_owns;                       206   std::vector<bool> m_owns;
207 };                                                207 };
208                                                   208 
209 }}                                                209 }}
210                                                   210 
211 #endif                                            211 #endif