CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
RecordDetails.h
Go to the documentation of this file.
1 #ifndef CondCore_ORA_RecordDetails_H
2 #define CondCore_ORA_RecordDetails_H
3 #include"AnyData.h"
4 
5 #include <typeinfo>
6 #include <vector>
7 #include <algorithm>
8 #include <boost/type_traits/is_pointer.hpp>
9 
10 #include "CoralBase/Blob.h"
11 
12 namespace ora {
13 
14  struct TypeHandler {
15  std::type_info const * type;
16  virtual bool isPointer() const=0;
17  virtual ~TypeHandler(){}
18  virtual void const * address(const AnyData & ad) const=0;
19 
20  virtual void set(AnyData & ad, void * p) const=0;
21  virtual void const * get(const AnyData & ad) const=0;
22  virtual void create(AnyData & ad) const=0;
23  virtual void destroy(AnyData & ad) const=0;
24 
25  };
26 
27  struct NullTypeHandler : public TypeHandler{
28  NullTypeHandler(std::type_info const& t) { type=&t;}
29  virtual bool isPointer() const { return false;}
30  virtual void const * address(const AnyData &) const{return 0;}
31  virtual void set(AnyData &, void*) const{};
32  virtual void const * get(const AnyData &) const{return 0;};
33  virtual void create(AnyData &) const{};
34  virtual void destroy(AnyData &) const{};
35 
36  };
37 
38  struct VoidStarHandler : public TypeHandler{
39  VoidStarHandler() { type= &typeid(void*);}
40  virtual bool isPointer() const { return true;}
41  virtual void const * address(const AnyData & ad) const{return ad.p;}
42  virtual void set(AnyData &ad, void*p) const{ad.p = p;};
43  virtual void const * get(const AnyData &ad) const{return ad.p;};
44  virtual void create(AnyData &) const{};
45  virtual void destroy(AnyData &) const{};
46 
47  };
48 
49  template<typename T> struct SimpleTypeHandler : public TypeHandler {
50  SimpleTypeHandler() { type = &typeid(T);}
51  virtual bool isPointer() const { return false;}
52  virtual void const * address(const AnyData & ad) const { return get(ad);}
53 
54  virtual void set(AnyData & ad, void * p) const { ad.data<T>() = *reinterpret_cast<T*>(p);}
55  virtual void const * get(const AnyData & ad) const { return &ad.data<T>();}
56  virtual void create(AnyData & ad) const{}
57  virtual void destroy(AnyData & ad) const{}
58 
59  };
60 
61  template<typename T> struct AnyTypeHandler : public TypeHandler {
62  AnyTypeHandler() { type = &typeid(T);}
63  inline static bool inplace() { return sizeof(T) < 9;}
64  virtual bool isPointer() const { return boost::is_pointer<T>::value;}
65 
66  // return pointer to the value (remove pointer if T is pointer)
67  virtual void const * address(const AnyData & ad) const {
68  if (isPointer())
69  return ad.p;
70  else
71  return get(ad);
72  }
73 
74 
75  virtual void set(AnyData & ad, void * p) const {
76  if (inplace())
77  *reinterpret_cast<T*>(ad.address()) = *reinterpret_cast<T*>(p);
78  else
79  *reinterpret_cast<T*>(ad.p) = *reinterpret_cast<T*>(p);
80  }
81 
82  virtual void const * get(const AnyData & ad) const {
83  if (inplace())
84  return ad.address();
85  else
86  return ad.p;
87  }
88  virtual void create(AnyData & ad) const{
89  if (inplace())
90  new(ad.address()) T();
91  else
92  ad.p = new T();
93  }
94  virtual void destroy(AnyData & ad) const{
95  if (inplace())
96  reinterpret_cast<T*>(ad.address())->~T();
97  else
98  delete reinterpret_cast<T*>(ad.p);
99  }
100  };
101 
104 
106 
119 
122 
134 
137 
139 
140  std::vector<TypeHandler const *> all;
141  typedef std::vector<TypeHandler const *>::const_iterator CI;
142  TypeHandler const * operator()(std::type_info const & type) const;
143  };
144 
146  bool operator()(TypeHandler const * rh, TypeHandler const * lh) {
147  return rh->type < lh->type;
148  }
149  };
150 
152  all.push_back(&vs);
153 
154  all.push_back(&b);
155  all.push_back(&c);
156  all.push_back(&uc);
157  all.push_back(&s);
158  all.push_back(&us);
159  all.push_back(&i);
160  all.push_back(&ui);
161  all.push_back(&l);
162  all.push_back(&ll);
163  all.push_back(&ul);
164  all.push_back(&f);
165  all.push_back(&d);
166  all.push_back(&ld);
167  all.push_back(&ss);
168 
169  all.push_back(&bp);
170  all.push_back(&cp);
171  all.push_back(&ucp);
172  all.push_back(&sp);
173  all.push_back(&usp);
174  all.push_back(&ip);
175  all.push_back(&uip);
176  all.push_back(&lp);
177  all.push_back(&ulp);
178  all.push_back(&fp);
179  all.push_back(&dp);
180  all.push_back(&ldp);
181  all.push_back(&ssp);
182 
183  all.push_back(&cb);
184  std::sort(all.begin(),all.end(),CompareTypeHandler());
185  }
186 
187  TypeHandler const * AllKnowTypeHandlers::operator()(std::type_info const & type) const {
188  NullTypeHandler h(type);
189  std::pair<CI,CI> range = std::equal_range(all.begin(),all.end(),&h,CompareTypeHandler());
190  return (range.first==range.second) ? (TypeHandler const *)(0) : *range.first;
191  }
192 
193 
194 }
195 #endif // CondCore_ORA_RecordDEtails_H
virtual void const * address(const AnyData &ad) const
Definition: RecordDetails.h:67
AnyTypeHandler< float * > fp
type
Definition: HCALResponse.h:22
AnyTypeHandler< short * > sp
AnyTypeHandler< coral::Blob > cb
AnyTypeHandler< char > c
virtual bool isPointer() const =0
bool operator()(TypeHandler const *rh, TypeHandler const *lh)
NullTypeHandler(std::type_info const &t)
Definition: RecordDetails.h:28
std::vector< TypeHandler const * > all
T & data()
Definition: AnyData.h:29
virtual bool isPointer() const
Definition: RecordDetails.h:64
virtual void create(AnyData &) const
Definition: RecordDetails.h:33
virtual void destroy(AnyData &ad) const =0
static bool inplace()
Definition: RecordDetails.h:63
AnyTypeHandler< long long * > lp
virtual void const * address(const AnyData &ad) const
Definition: RecordDetails.h:52
virtual bool isPointer() const
Definition: RecordDetails.h:40
virtual bool isPointer() const
Definition: RecordDetails.h:51
bool int lh
Definition: SSEVec.h:55
virtual void create(AnyData &ad) const
Definition: RecordDetails.h:88
AnyTypeHandler< unsigned char > uc
AnyTypeHandler< unsigned int * > uip
AnyTypeHandler< unsigned long long * > ulp
virtual void destroy(AnyData &ad) const
Definition: RecordDetails.h:57
std::type_info const * type
Definition: RecordDetails.h:15
AnyTypeHandler< std::string * > ssp
AnyTypeHandler< long double > ld
AnyTypeHandler< unsigned short > us
AnyTypeHandler< unsigned int > ui
virtual void destroy(AnyData &) const
Definition: RecordDetails.h:34
AnyTypeHandler< float > f
AnyTypeHandler< unsigned short * > usp
AnyTypeHandler< long > l
virtual void const * address(const AnyData &ad) const =0
virtual void create(AnyData &ad) const
Definition: RecordDetails.h:56
AnyTypeHandler< int * > ip
AnyTypeHandler< double * > dp
AnyTypeHandler< char * > cp
virtual void const * address(const AnyData &) const
Definition: RecordDetails.h:30
virtual void set(AnyData &ad, void *p) const
Definition: RecordDetails.h:42
AnyTypeHandler< bool * > bp
virtual void const * address(const AnyData &ad) const
Definition: RecordDetails.h:41
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
AnyTypeHandler< unsigned long long > ul
virtual ~TypeHandler()
Definition: RecordDetails.h:17
virtual void destroy(AnyData &) const
Definition: RecordDetails.h:45
void * p
Definition: AnyData.h:21
AnyTypeHandler< int > i
AnyTypeHandler< unsigned char * > ucp
AnyTypeHandler< double > d
AnyTypeHandler< std::string > ss
virtual void destroy(AnyData &ad) const
Definition: RecordDetails.h:94
TypeHandler const * operator()(std::type_info const &type) const
AnyTypeHandler< short > s
AnyTypeHandler< long long > ll
virtual bool isPointer() const
Definition: RecordDetails.h:29
virtual void set(AnyData &ad, void *p) const
Definition: RecordDetails.h:75
virtual void set(AnyData &, void *) const
Definition: RecordDetails.h:31
std::vector< TypeHandler const * >::const_iterator CI
AnyTypeHandler< long double * > ldp
virtual void set(AnyData &ad, void *p) const =0
long double T
virtual void create(AnyData &) const
Definition: RecordDetails.h:44
AnyTypeHandler< bool > b
void * address()
Definition: AnyData.h:24
virtual void set(AnyData &ad, void *p) const
Definition: RecordDetails.h:54
virtual void create(AnyData &ad) const =0