// ********************************************************************** // // Copyright (c) 2003-2017 ZeroC, Inc. All rights reserved. // // This copy of Ice is licensed to you under the terms described in the // ICE_LICENSE file included in this distribution. // // ********************************************************************** #ifndef ICE_METRICSFUNCTIONAL_H #define ICE_METRICSFUNCTIONAL_H namespace IceInternal { template struct ReferenceWrapper { static R* get(const R& v) { return const_cast(&v); } }; 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(); } }; 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 { template struct ApplyOnMember { ApplyOnMember(Y T::*member, Func func) : func(func), member(member) { } 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 value) : value(value) { } 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()); } } #endif