All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
DataObjectDescriptor.cpp
Go to the documentation of this file.
1 /*
2 * DataObjectHandle.cpp
3  *
4  * Created on: Jan 9, 2014
5  * Author: dfunke
6  */
7 
8 #include <boost/algorithm/string.hpp>
9 #include <boost/lexical_cast.hpp>
10 #include <sstream>
11 #include <csignal>
12 #include <algorithm>
13 
14 #include <GaudiKernel/DataObjectDescriptor.h>
15 
16 const char ADDR_SEP = '&';
17 const char FIELD_SEP = '|';
18 const char ITEM_SEP = '#';
19 
20 const std::string DataObjectDescriptor::NULL_ = "NULL";
21 
22 std::ostream& operator<<( std::ostream& stream ,
23  const DataObjectDescriptor& di )
24 { return stream << di.toString() ; }
25 
26 const std::string DataObjectDescriptor::toString() const {
27  std::stringstream str;
28 
29  str << m_tag << FIELD_SEP;
30  str << m_address;
31 
32  if(UNLIKELY(!m_altAddresses.empty())){
33  for(auto & s : m_altAddresses)
34  str << ADDR_SEP << s;
35  }
36 
37  str << FIELD_SEP;
38 
39  str << boost::lexical_cast<std::string>(m_optional) << FIELD_SEP;
40  str << boost::lexical_cast<std::string>(m_accessType);
41 
42  return str.str();
43 }
44 
45 const std::string DataObjectDescriptor::pythonRepr() const {
46  return "DataObjectDescriptor(\"" + toString() + "\")";
47 }
48 
49 void DataObjectDescriptor::fromString(const std::string& s) {
50 
51  if(s == "") //nothing to do
52  return;
53 
54  std::vector<std::string> items;
55 
56  boost::split(items, s, boost::is_any_of(boost::lexical_cast<std::string>(FIELD_SEP)), boost::token_compress_on);
57 
58  setTag(items[0]);
59 
60  if(LIKELY(items[1].find(ADDR_SEP) == std::string::npos))
61  setAddress(items[1]); //address
62  else { //alternative addresses provided
63  std::vector<std::string> addr;
64  boost::split(addr, items[1], boost::is_any_of(boost::lexical_cast<std::string>(ADDR_SEP)), boost::token_compress_on);
65 
66  setAddress(addr[0]); //main address
67  setAltAddresses(addr, true); //set alternatives, skipping first
68  }
69 
70  setOptional(boost::lexical_cast<bool>( items[2] ));
71  setAccessType(MinimalDataObjectHandle::AccessType(boost::lexical_cast<int>( items[3] )));
72 
73 }
74 
76  return m_accessType;
77 }
78 
82 }
83 
85  return m_optional;
86 }
87 
88 void DataObjectDescriptor::setOptional(bool optional) {
90 }
91 
92 const std::string& DataObjectDescriptor::tag() const {
93  return m_tag;
94 }
95 
96 void DataObjectDescriptor::setTag(const std::string& tag) {
97  m_tag = tag;
98 }
99 
100 std::string DataObjectDescriptor::tag(const std::string & s) {
101  std::vector<std::string> items;
102 
103  boost::split(items, s,
104  boost::is_any_of(boost::lexical_cast<std::string>(FIELD_SEP)),
105  boost::token_compress_on);
106 
107  return items[0];
108 }
109 
110 const std::string& DataObjectDescriptor::address() const {
111  return m_address;
112 }
113 
114 const std::vector<std::string>& DataObjectDescriptor::alternativeAddresses() const {
115  return m_altAddresses;
116 }
117 
118 void DataObjectDescriptor::setAddress(const std::string& address) {
119  //if(!m_handle || !m_handle->initialized())
120  m_address = address;
121 }
122 
123 void DataObjectDescriptor::setAddresses(const std::vector<std::string>& addresses) {
124  //if(!m_handle || !m_handle->initialized()){
125  if(!addresses.empty()){
126  setAddress(addresses[0]);
127  setAltAddresses(addresses, true);
128  }
129  //}
130 }
131 
132 void DataObjectDescriptor::setAltAddresses(const std::vector<std::string> & addresses, bool skipFirst){
133  //if(!m_handle || !m_handle->initialized())
134  m_altAddresses.assign(addresses.begin() + skipFirst, addresses.end());
135 }
136 
137 const std::string DataObjectDescriptorCollection::toString() const {
138  std::stringstream out;
139 
140  for(auto it = m_dataItems.begin(); it != m_dataItems.end(); ++it){
141  out << it->second->descriptor()->toString() << ITEM_SEP;
142  }
143 
144  std::string sOut = out.str();
145 
146  return sOut.substr(0, sOut.length()-1);
147 }
148 
150  m_dataItems.insert(other.m_dataItems.begin(), other.m_dataItems.end());
151 }
152 
154  m_dataItems.clear();
155  m_dataItems.insert(other.m_dataItems.begin(), other.m_dataItems.end());
156 
157  return *this;
158 }
159 
161  return "DataObjectDescriptorCollection(\"" + toString() + "\")";
162 }
163 
164 bool DataObjectDescriptorCollection::contains(const std::string & s) const {
165  return s != "" && m_dataItems.find(s) != m_dataItems.end();
166 }
167 
169  std::string productName = o->dataProductName();
170 
171  std::vector<std::string> locations;
172 
173  locations.emplace_back(productName);
174  locations.insert(locations.end(), o->alternativeDataProductNames().begin(), o->alternativeDataProductNames().end());
175  std::sort(locations.begin(), locations.end());
176 
177  for(auto & item : m_dataItems){
178  //do deep search
179 
180  //make the common case fast
181  if(item.second->dataProductName() == productName)
182  return true;
183 
184  //otherwise we have to do a set intersection
185  std::vector<std::string> iLocations;
186  iLocations.emplace_back(item.second->dataProductName());
187  iLocations.insert(iLocations.end(), item.second->alternativeDataProductNames().begin(), item.second->alternativeDataProductNames().end());
188  std::sort(iLocations.begin(), iLocations.end());
189 
190  auto it=std::set_intersection (iLocations.begin(), iLocations.end(), locations.begin(), locations.end(), iLocations.begin());
191 
192  //check if we have a non-zero intersection size
193  if(std::distance(iLocations.begin(), it) > 0)
194  return true;
195 
196  }
197 
198  return false;
199 }
200 
201 bool DataObjectDescriptorCollection::insert(const std::string& tag,
202  MinimalDataObjectHandle * descriptor){
203 
204  if(!contains(tag)){
205  auto res = m_dataItems.insert(std::make_pair(tag, descriptor));
206 
207  return res.second;
208  }
209 
210  return false;
211 }
212 
214 
215  if(!contains(item->descriptor()->tag())){
216  auto res = m_dataItems.insert(std::make_pair(item->descriptor()->tag(), item));
217 
218  return res.second;
219  }
220 
221  return false;
222 }
223 
225 
226  if(contains(item->descriptor()->tag())){
227  m_dataItems.at(item->descriptor()->tag()) = item;
228 
229  return true;
230  }
231 
232  return false;
233 }
234 
236  std::string tag = DataObjectDescriptor::tag(item);
237 
238  if(tag != "" && contains(tag)){
239  m_dataItems.at(tag)->descriptor()->fromString(item);
240 
241  return true;
242  }
243 
244  return false;
245 }
246 
248  return *m_dataItems.at(tag);
249 }
250 
252  return *m_dataItems.at(tag);
253 }
254 
257 : Property(name, typeid(DataObjectDescriptor)),
258  m_item(&item) {
259 }
260 
262 : Property(other.name(), typeid(DataObjectDescriptor)), m_item(other.m_item) {
263 }
264 
266 : Property(other.name(), typeid(DataObjectDescriptor)) {
267 
268  m_item = const_cast<DataObjectDescriptor *>(&other.value());
269 
270 }
271 
274 
275  setName(value.name());
276  m_item = value.m_item;
277 
278  return *this;
279 }
280 
283 
284  setName(value.name());
285 
286  delete m_item;
287  m_item = const_cast<DataObjectDescriptor *>(&value.value());
288 
289  return *this;
290 }
291 
293  return new DataObjectDescriptorProperty(*this);
294 }
295 
297  return destination.assign(*this);
298 }
299 
301  return fromString(source.toString()).isSuccess();
302 }
303 
304 void DataObjectDescriptorProperty::toStream(std::ostream& out) const {
305  out << toString();
306 }
307 
309  useReadHandler();
310  return m_item->toString();
311 }
312 
314  m_item->fromString(s);
315 
316  return useUpdateHandler();
317 }
318 
320  useReadHandler();
321  return *m_item;
322 }
323 
325  m_item = &value;
326 
327  return useUpdateHandler();
328 }
329 
332 : Property(name, typeid(DataObjectDescriptorCollection)), m_dataItems(&items){
333 }
334 
337 : Property(other.name(), typeid(DataObjectDescriptorCollection)), m_dataItems(other.m_dataItems){
338 }
339 
342 : Property(other.name(), typeid(DataObjectDescriptorCollection)){
343 
345 }
346 
349 
350  m_dataItems = value.m_dataItems;
351  return *this;
352 }
353 
356 
357  delete m_dataItems;
359  return *this;
360 }
361 
363  return new DataObjectDescriptorCollectionProperty(*this);
364 }
365 
367  return destination.assign(*this);
368 }
369 
371  return fromString(source.toString());
372 }
373 
375  useReadHandler();
376  return m_dataItems->toString();
377 }
378 
380  useReadHandler();
381  out << m_dataItems->toString();
382 }
383 
385  if(s == "") // nothing to do
386  return StatusCode::SUCCESS;
387 
388  std::vector<std::string> items;
389  boost::split(items, s, boost::is_any_of(boost::lexical_cast<std::string>(ITEM_SEP)), boost::token_compress_on);
390 
391  for(uint i = 0; i < items.size(); ++i){
392  if(!m_dataItems->update(items[i]))
393  return StatusCode::FAILURE;
394  }
395 
396  return useUpdateHandler();
397 }
398 
400  useReadHandler();
401  return *m_dataItems;
402 }
403 
405  m_dataItems = &value;
406  return useUpdateHandler();
407 }
const std::vector< std::string > & alternativeDataProductNames() const
DataObjectDescriptorCollection * m_dataItems
DataObjectDescriptor * descriptor()
virtual void useReadHandler() const
use the call-back function at reading
Definition: Property.cpp:80
MinimalDataObjectHandle::AccessType accessType() const
virtual bool assign(const Property &source)=0
import the property value form the source
std::ostream & operator<<(std::ostream &stream, const DataObjectDescriptor &di)
virtual DataObjectDescriptorProperty * clone() const
clone: "virtual constructor"
virtual std::string toString() const =0
value -> string
virtual bool assign(const Property &source)
import the property value form the source
const char FIELD_SEP
void setTag(const std::string &tag)
const std::string & name() const
property name
Definition: Property.h:45
DataObjectDescriptorCollection & operator=(const DataObjectDescriptorCollection &other)
virtual void toStream(std::ostream &out) const
value -> stream
virtual const DataObjectDescriptor & value() const
virtual std::string toString() const
value -> string
const DataObjectDescriptorCollection & value() const
void setAltAddresses(const std::vector< std::string > &addresses)
const std::string & tag() const
const std::string & dataProductName() const
Return the product name.
bool contains(const std::string &o) const
bool update(MinimalDataObjectHandle *item)
const std::string pythonRepr() const
virtual DataObjectDescriptorCollectionProperty * clone() const
clone: "virtual constructor"
virtual bool load(Property &destination) const
export the property value to the destination
const char ADDR_SEP
virtual std::string toString() const
value -> string
bool setValue(DataObjectDescriptorCollection &value)
const char ITEM_SEP
std::vector< std::string > m_altAddresses
void setAddress(const std::string &address)
virtual bool useUpdateHandler()
use the call-back function at update
Definition: Property.cpp:92
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
DataObjectDescriptorProperty & operator=(DataObjectDescriptorProperty &value)
const std::string toString() const
const std::string & address() const
MinimalDataObjectHandle::AccessType m_accessType
virtual bool assign(const Property &source)
import the property value form the source
virtual StatusCode fromString(const std::string &s)
string -> value
void setAddresses(const std::vector< std::string > &address)
void setOptional(bool optional)
bool insert(const std::string &tag, MinimalDataObjectHandle *descriptor)
Property base class allowing Property* collections to be "homogeneous".
Definition: Property.h:38
void setName(std::string value)
set the new value for the property name
Definition: Property.h:92
void fromString(const std::string &s)
virtual bool setValue(DataObjectDescriptor &value)
string s
Definition: gaudirun.py:245
tuple item
print s1,s2
Definition: ana.py:146
#define UNLIKELY(x)
Definition: Kernel.h:126
void setAccessType(MinimalDataObjectHandle::AccessType accessType)
static const std::string NULL_
AccessType
The type of the access.
virtual bool load(Property &destination) const
export the property value to the destination
#define LIKELY(x)
Definition: Kernel.h:125
list i
Definition: ana.py:128
const MinimalDataObjectHandle & operator[](const std::string &tag) const
DataObjectDescriptorProperty(const std::string &name, DataObjectDescriptor &item)
const std::string toString() const
const std::vector< std::string > & alternativeAddresses() const
virtual void toStream(std::ostream &out) const
value -> stream
const std::string pythonRepr() const
DataObjectDescriptorCollectionProperty & operator=(DataObjectDescriptorCollectionProperty &value)
DataObjectDescriptorCollectionProperty(const std::string &name, DataObjectDescriptorCollection &items)
virtual StatusCode fromString(const std::string &s)
string -> value