1 #ifndef _GAUDI_CONTEXTSPECIFICPTR_H_ 2 #define _GAUDI_CONTEXTSPECIFICPTR_H_ 4 #include <unordered_map> 29 template<
typename T >
37 inline T*
get()
const {
42 inline T*&
set(T* ptr) {
51 inline bool isValid()
const {
return get(); }
54 inline operator bool ()
const {
return isValid(); }
57 inline bool operator==(T* rhs)
const {
return get() == rhs; }
61 inline const T&
operator* ()
const {
return *
get(); }
74 template<
class Mapper >
84 template<
class Mapper,
class BinaryOperation >
87 BinaryOperation op)
const {
89 typedef typename StorageType::value_type V;
92 [&f, &op](
const R& partial,
const V& p) -> R {
93 return op(partial, f(p.second));
101 for(
auto& i:
m_ptrs) f(i.second);
108 for(
auto& i:
m_ptrs) f(i.second);
115 for(
auto& i:
m_ptrs) f(i.first,i.second);
120 for(
auto& i:
m_ptrs) f(i.first,i.second);
125 for_each([](T*& p) {
delete p; p =
nullptr;});
143 template<
typename T >
156 inline operator T& () {
160 return *(m_ptr =
new T(m_proto));
163 inline operator T& ()
const {
167 return *(m_ptr =
new T(m_proto));
172 return (T&)(*this) = other;
182 template<
class T1,
class BinaryOperation >
184 return m_ptr.accumulate([] (
const T* p) -> T {
return *p; },
191 m_ptr.for_each([&f] (
const T* p) { f(*p); });
197 m_ptr.for_each([&f] (T* p) { f(*p); });
203 m_ptr.for_all([&f] (
size_t s,
const T* p) { f(s,*p); });
207 m_ptr.for_all([&f] (
size_t s, T* p) { f(s,*p); });
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.
T m_proto
Prototype value.
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.
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 'op', 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...
StorageType m_ptrs
Internal storage for the different internal pointers.
~ContextSpecificData()
Destructor.
T1 accumulate(T1 init, BinaryOperation op) const
Return the accumulated result, through the operation 'op', 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.
Helper functions to set/get the application return code.