Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v31r0 (aeb156f0)
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 <functional>
5 #include <mutex>
6 #include <numeric>
7 #include <type_traits>
8 #include <unordered_map>
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 
35  public:
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>
75  auto accumulate( Mapper f, std::result_of_t<Mapper( const T* )> init ) const -> decltype( init ) {
76  return accumulate( f, init, std::plus<>() );
77  }
78 
82  template <class Mapper, class BinaryOperation>
83  auto accumulate( Mapper f, std::result_of_t<Mapper( const T* )> init, BinaryOperation op ) const
84  -> decltype( init ) {
86  return std::accumulate( m_ptrs.begin(), m_ptrs.end(), init, [&f, &op]( const auto& partial, const auto& p ) {
87  return op( partial, f( p.second ) );
88  } );
89  }
90 
92  template <class F>
93  void for_each( F f ) const {
95  for ( auto& i : m_ptrs ) f( i.second );
96  }
97 
99  template <class F>
100  void for_each( F f ) {
102  for ( auto& i : m_ptrs ) f( i.second );
103  }
104 
106  template <class F>
107  void for_all( F f ) const {
109  for ( auto& i : m_ptrs ) f( i.first, i.second );
110  }
111  template <class F>
112  void for_all( F f ) {
114  for ( auto& i : m_ptrs ) f( i.first, i.second );
115  }
116 
117  void deleteAll() {
118  for_each( []( T*& p ) {
119  delete p;
120  p = nullptr;
121  } );
122  }
123 
124  private:
126  mutable StorageType m_ptrs;
129  };
130 
137  template <typename T>
139  public:
141  ContextSpecificData( T proto = {} ) : m_proto( std::move( proto ) ) {}
142 
144  ~ContextSpecificData() { m_ptr.deleteAll(); }
145 
146  operator T&() {
147  if ( !m_ptr ) m_ptr = new T( m_proto );
148  return *m_ptr;
149  }
150 
151  operator T&() const {
152  if ( !m_ptr ) m_ptr = new T( m_proto );
153  return *m_ptr;
154  }
155 
157  T& operator=( const T& other ) { return (T&)( *this ) = other; }
158 
160  T accumulate( T init ) const { return accumulate( init, std::plus<>() ); }
161 
164  template <class T1, class BinaryOperation>
165  T1 accumulate( T1 init, BinaryOperation op ) const {
166  return m_ptr.accumulate( []( const T* p ) { return *p; }, init, op );
167  }
168 
170  template <class F>
171  void for_each( F f ) const {
172  m_ptr.for_each( [&f]( const T* p ) { f( *p ); } );
173  }
174 
176  template <class F>
177  void for_each( F f ) {
178  m_ptr.for_each( [&f]( T* p ) { f( *p ); } );
179  }
180 
182  template <class F>
183  void for_all( F f ) const {
184  m_ptr.for_all( [&f]( size_t s, const T* p ) { f( s, *p ); } );
185  }
186  template <class F>
187  void for_all( F f ) {
188  m_ptr.for_all( [&f]( size_t s, T* p ) { f( s, *p ); } );
189  }
190 
191  private:
192  // FIXME: implement a proper copy constructor
193  ContextSpecificData( const ContextSpecificData& ) = delete;
194 
196  T m_proto = {};
199  };
200  } // namespace Hive
201 } // namespace Gaudi
202 
203 #endif // _GAUDI_CONTEXTSPECIFICPTR_H_
GAUDI_API ContextIdType currentContextId()
Return the current context id.
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.
ContextSpecificData(T proto={})
Constructor with prototype value.
void for_each(F f) const
Call a function on each contained value.
auto accumulate(Mapper f, std::result_of_t< Mapper(const T *)> init) const -> decltype(init)
Taking a function f that from a T* produces a value, return the sum of all the values corresponding t...
bool isValid() const
Return true if the pointer is not null.
T & operator=(const T &other)
Assignment operator.
bool operator==(T *rhs) const
Comparison with another pointer.
This class represents an entry point to all the event specific data.
Definition: EventContext.h:31
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.
auto accumulate(Mapper f, std::result_of_t< Mapper(const T *)> init, BinaryOperation op) const -> decltype(init)
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.
T clear(T...args)
T move(T...args)
void for_each(F f) const
Call a function on each contained pointer.
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:312
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.
T accumulate(T...args)
Helper functions to set/get the application return code.
Definition: __init__.py:1