// // Copyright (c) ZeroC, Inc. All rights reserved. // #ifndef ICE_METRICSFUNCTIONAL_H #define ICE_METRICSFUNCTIONAL_H namespace IceInternal { template struct ReferenceWrapper { static R* get(const R& v) { return const_cast(&v); } }; #ifdef ICE_CPP11_MAPPING // C++11 mapping template struct ReferenceWrapper<::std::shared_ptr > { static R* get(const ::std::shared_ptr& v) { return v.get(); } }; template struct ReferenceWrapper& > { static R* get(const ::std::shared_ptr& v) { return v.get(); } }; #else // C++98 mapping template struct ReferenceWrapper > { static R* get(const IceInternal::ProxyHandle& v) { return v.get(); } }; template struct ReferenceWrapper& > { static R* get(const IceInternal::ProxyHandle& v) { return v.get(); } }; template struct ReferenceWrapper > { static R* get(const IceInternal::Handle& v) { return v.get(); } }; template struct ReferenceWrapper& > { static R* get(const IceInternal::Handle& v) { return v.get(); } }; #endif template struct ReferenceWrapper { static R* get(R* v) { return v; } }; template struct ReferenceWrapper { static R* get(const R& v) { return const_cast(&v); } }; }; namespace IceMX { /// \cond INTERNAL template struct ApplyOnMember { ApplyOnMember(Y T::*m, Func f) : func(f), member(m) { } template void operator()(const R& v) { func(IceInternal::ReferenceWrapper::get(v)->*member); } Func func; Y T::*member; }; template struct Decrement { void operator()(T& v) { --v; } }; template struct Increment { void operator()(T& v) { ++v; } }; template struct Add { Add(T v) : value(v) { } template void operator()(Y& v) { v += value; } T value; }; template ApplyOnMember applyOnMember(Y T::*member, F func) { return ApplyOnMember(member, func); } template ApplyOnMember > add(Y T::*member, V value) { return applyOnMember(member, Add(value)); } template ApplyOnMember > inc(Y T::*member) { return applyOnMember(member, Increment()); } template ApplyOnMember > dec(Y T::*member) { return applyOnMember(member, Decrement()); } /// \endcond } #endif