5 #ifndef ICE_METRICSFUNCTIONAL_H
6 #define ICE_METRICSFUNCTIONAL_H
11 template<
typename R>
struct ReferenceWrapper
13 static R* get(
const R& v)
15 return const_cast<R*
>(&v);
19 #ifdef ICE_CPP11_MAPPING // C++11 mapping
20 template<
typename R>
struct ReferenceWrapper<::std::shared_ptr<R> >
22 static R* get(const ::std::shared_ptr<R>& v)
28 template<
typename R>
struct ReferenceWrapper<const ::std::shared_ptr<R>& >
30 static R* get(const ::std::shared_ptr<R>& v)
35 #else // C++98 mapping
36 template<
typename R>
struct ReferenceWrapper<IceInternal::ProxyHandle<R> >
38 static R* get(
const IceInternal::ProxyHandle<R>& v)
44 template<
typename R>
struct ReferenceWrapper<const IceInternal::ProxyHandle<R>& >
46 static R* get(
const IceInternal::ProxyHandle<R>& v)
52 template<
typename R>
struct ReferenceWrapper<IceInternal::Handle<R> >
54 static R* get(
const IceInternal::Handle<R>& v)
60 template<
typename R>
struct ReferenceWrapper<const IceInternal::Handle<R>& >
62 static R* get(
const IceInternal::Handle<R>& v)
69 template<
typename R>
struct ReferenceWrapper<R*>
77 template<
typename R>
struct ReferenceWrapper<const R&>
79 static R* get(
const R& v)
81 return const_cast<R*
>(&v);
91 template<
class T,
typename Y,
typename Func>
struct ApplyOnMember
93 ApplyOnMember(Y T::*m, Func f) : func(f), member(m)
98 void operator()(
const R& v)
100 func(IceInternal::ReferenceWrapper<R>::get(v)->*member);
107 template<
typename T>
struct Decrement
109 void operator()(T& v)
115 template<
typename T>
struct Increment
117 void operator()(T& v)
123 template<
typename T>
struct Add
125 Add(T v) : value(v) { }
128 void operator()(Y& v)
136 template<
class T,
typename Y,
typename F> ApplyOnMember<T, Y, F> applyOnMember(Y T::*member, F func)
138 return ApplyOnMember<T, Y, F>(member, func);
141 template<
class T,
typename Y,
typename V> ApplyOnMember<T, Y, Add<V> > add(Y T::*member, V value)
143 return applyOnMember(member, Add<V>(value));
146 template<
class T,
typename Y> ApplyOnMember<T, Y, Increment<Y> > inc(Y T::*member)
148 return applyOnMember(member, Increment<Y>());
151 template<
class T,
typename Y> ApplyOnMember<T, Y, Decrement<Y> > dec(Y T::*member)
153 return applyOnMember(member, Decrement<Y>());