The Gaudi Framework  v28r2p1 (f1a77ff4)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
ContextSpecificPtr.h
Go to the documentation of this file.
1 #ifndef _GAUDI_CONTEXTSPECIFICPTR_H_
2 #define _GAUDI_CONTEXTSPECIFICPTR_H_
3 
4 #include <unordered_map>
5 #include <mutex>
6 #include <numeric>
7 #include <functional>
8 #include <type_traits>
9 
10 // For the definition of GAUDI_API
11 #include "GaudiKernel/Kernel.h"
13 
14 class EventContext;
15 
16 namespace Gaudi {
17  namespace Hive {
29  template< typename T >
31  private:
34  public:
35 
37  inline T* get() const {
39  return m_ptrs[currentContextId()];
40  }
42  inline T*& set(T* ptr) {
44  return m_ptrs[currentContextId()] = ptr;
45  }
46 
48  inline T*& operator= (T* ptr) { return set(ptr); }
49 
51  inline bool isValid() const { return get(); }
52 
54  inline operator bool () const { return isValid(); }
55 
57  inline bool operator==(T* rhs) const { return get() == rhs; }
58 
60  inline T& operator* () { return *get(); }
61  inline const T& operator* () const { return *get(); }
62  inline T* operator-> () { return get(); }
63  inline const T* operator-> () const { return get(); }
65 
67 
69  void clear() { m_ptrs.clear(); }
70 
74  template< class Mapper >
76  accumulate(Mapper f, typename std::result_of<Mapper(const T*)>::type init) const {
77  typedef typename std::result_of<Mapper(const T*)>::type R;
78  return accumulate(f, init, std::plus<R>());
79  }
80 
84  template< class Mapper, class BinaryOperation >
86  accumulate(Mapper f, typename std::result_of<Mapper(const T*)>::type init,
87  BinaryOperation op) const {
88  typedef typename std::result_of<Mapper(const T*)>::type R;
89  typedef typename StorageType::value_type V;
91  return std::accumulate(m_ptrs.begin(), m_ptrs.end(), init,
92  [&f, &op](const R& partial, const V& p) -> R {
93  return op(partial, f(p.second));
94  });
95  }
96 
98  template< class F >
99  void for_each(F f) const {
101  for(auto& i: m_ptrs) f(i.second);
102  }
103 
105  template< class F >
106  void for_each(F f) {
108  for(auto& i: m_ptrs) f(i.second);
109  }
110 
112  template< class F >
113  void for_all(F f) const {
115  for(auto& i: m_ptrs) f(i.first,i.second);
116  }
117  template< class F >
118  void for_all(F f) {
120  for(auto& i: m_ptrs) f(i.first,i.second);
121  }
122 
123 
124  void deleteAll() {
125  for_each([](T*& p) {delete p; p = nullptr;});
126  }
127 
128 
129  private:
131  mutable StorageType m_ptrs;
134  };
135 
136 
143  template< typename T >
145  public:
147  ContextSpecificData(): m_proto() {}
149  ContextSpecificData(const T& proto): m_proto(proto) {}
150 
153  m_ptr.deleteAll();
154  }
155 
156  inline operator T& () {
157  if (m_ptr)
158  return *m_ptr;
159  else
160  return *(m_ptr = new T(m_proto));
161  }
162 
163  inline operator T& () const {
164  if (m_ptr)
165  return *m_ptr;
166  else
167  return *(m_ptr = new T(m_proto));
168  }
169 
171  inline T& operator= (const T& other) {
172  return (T&)(*this) = other;
173  }
174 
176  inline T accumulate(T init) const {
177  return accumulate(init, std::plus<T>());
178  }
179 
182  template< class T1, class BinaryOperation >
183  T1 accumulate(T1 init, BinaryOperation op) const {
184  return m_ptr.accumulate([] (const T* p) -> T { return *p; },
185  init, op);
186  }
187 
189  template< class F >
190  void for_each(F f) const {
191  m_ptr.for_each([&f] (const T* p) { f(*p); });
192  }
193 
195  template< class F >
196  void for_each(F f) {
197  m_ptr.for_each([&f] (T* p) { f(*p); });
198  }
199 
201  template< class F >
202  void for_all(F f) const {
203  m_ptr.for_all([&f] (size_t s, const T* p) { f(s,*p); });
204  }
205  template< class F >
206  void for_all(F f) {
207  m_ptr.for_all([&f] (size_t s, T* p) { f(s,*p); });
208  }
209 
210 
211 
212  private:
213  // FIXME: implement a proper copy constructor
214  ContextSpecificData(const ContextSpecificData&) = delete;
215 
220 
221  };
222  }
223 }
224 
225 #endif // _GAUDI_CONTEXTSPECIFICPTR_H_
GAUDI_API ContextIdType currentContextId()
Return the current context id.
ContextSpecificData(const T &proto)
Constructor with prototype value.
void for_all(F f) const
Call a function on each element, passing slot# as well.
void clear()
Non thread-safe methods.
void for_each(F f)
Call a function on each contained pointer. (non-const version)
void for_all(F f) const
Call a function on each element, passing slot# as well.
T & operator*()
Dereference operators.
void for_each(F f) const
Call a function on each contained value.
bool isValid() const
Return true if the pointer is not null.
bool operator==(T *rhs) const
Comparison with another pointer.
This class represents an entry point to all the event specific data.
Definition: EventContext.h:25
Simple implementation of a smart pointer with different values for different event contexts (slots)...
T *& operator=(T *ptr)
Assignment operator (.
void for_each(F f)
Call a function on each contained value. (non-const version)
ContextSpecificPtr< T > m_ptr
Internal implementation.
std::mutex m_ptrs_lock
Mutex for the m_ptrs container.
T clear(T...args)
std::result_of< Mapper(const T *)>::type accumulate(Mapper f, typename std::result_of< Mapper(const T *)>::type init, BinaryOperation op) const
Taking a function f that from a T* produces a value, return the accumulated result, through the operation &#39;op&#39;, of all the values corresponding to the contained pointers using init as first value.
void for_each(F f) const
Call a function on each contained pointer.
std::result_of< Mapper(const T *)>::type accumulate(Mapper f, typename std::result_of< Mapper(const T *)>::type init) const
Taking a function f that from a T* produces a value, return the sum of all the values corresponding t...
Implementation of a context specific storage accessible as a sort of smart reference class...
T begin(T...args)
StorageType m_ptrs
Internal storage for the different internal pointers.
string s
Definition: gaudirun.py:245
T1 accumulate(T1 init, BinaryOperation op) const
Return the accumulated result, through the operation &#39;op&#39;, of all the contained values using init as ...
std::unordered_map< ContextIdType, T * > StorageType
Type used for the internal storage.
T accumulate(T init) const
Return the sum of all the contained values using init as first value.
ContextSpecificData()
Constructor with default initialization.
T accumulate(T...args)
Helper functions to set/get the application return code.
Definition: __init__.py:1