Ice 3.7 C++11 API Reference
Loading...
Searching...
No Matches
MetricsFunctional.h
Go to the documentation of this file.
1//
2// Copyright (c) ZeroC, Inc. All rights reserved.
3//
4
5#ifndef ICE_METRICSFUNCTIONAL_H
6#define ICE_METRICSFUNCTIONAL_H
7
8namespace IceInternal
9{
10
11template<typename R> struct ReferenceWrapper
12{
13 static R* get(const R& v)
14 {
15 return const_cast<R*>(&v);
16 }
17};
18
19#ifdef ICE_CPP11_MAPPING // C++11 mapping
20template<typename R> struct ReferenceWrapper<::std::shared_ptr<R> >
21{
22 static R* get(const ::std::shared_ptr<R>& v)
23 {
24 return v.get();
25 }
26};
27
28template<typename R> struct ReferenceWrapper<const ::std::shared_ptr<R>& >
29{
30 static R* get(const ::std::shared_ptr<R>& v)
31 {
32 return v.get();
33 }
34};
35#else // C++98 mapping
36template<typename R> struct ReferenceWrapper<IceInternal::ProxyHandle<R> >
37{
38 static R* get(const IceInternal::ProxyHandle<R>& v)
39 {
40 return v.get();
41 }
42};
43
44template<typename R> struct ReferenceWrapper<const IceInternal::ProxyHandle<R>& >
45{
46 static R* get(const IceInternal::ProxyHandle<R>& v)
47 {
48 return v.get();
49 }
50};
51
52template<typename R> struct ReferenceWrapper<IceInternal::Handle<R> >
53{
54 static R* get(const IceInternal::Handle<R>& v)
55 {
56 return v.get();
57 }
58};
59
60template<typename R> struct ReferenceWrapper<const IceInternal::Handle<R>& >
61{
62 static R* get(const IceInternal::Handle<R>& v)
63 {
64 return v.get();
65 }
66};
67#endif
68
69template<typename R> struct ReferenceWrapper<R*>
70{
71 static R* get(R* v)
72 {
73 return v;
74 }
75};
76
77template<typename R> struct ReferenceWrapper<const R&>
78{
79 static R* get(const R& v)
80 {
81 return const_cast<R*>(&v);
82 }
83};
84
85};
86
87namespace IceMX
88{
89
91template<class T, typename Y, typename Func> struct ApplyOnMember
92{
93 ApplyOnMember(Y T::*m, Func f) : func(f), member(m)
94 {
95 }
96
97 template<typename R>
98 void operator()(const R& v)
99 {
100 func(IceInternal::ReferenceWrapper<R>::get(v)->*member);
101 }
102
103 Func func;
104 Y T::*member;
105};
106
107template<typename T> struct Decrement
108{
109 void operator()(T& v)
110 {
111 --v;
112 }
113};
114
115template<typename T> struct Increment
116{
117 void operator()(T& v)
118 {
119 ++v;
120 }
121};
122
123template<typename T> struct Add
124{
125 Add(T v) : value(v) { }
126
127 template<typename Y>
128 void operator()(Y& v)
129 {
130 v += value;
131 }
132
133 T value;
134};
135
136template<class T, typename Y, typename F> ApplyOnMember<T, Y, F> applyOnMember(Y T::*member, F func)
137{
138 return ApplyOnMember<T, Y, F>(member, func);
139}
140
141template<class T, typename Y, typename V> ApplyOnMember<T, Y, Add<V> > add(Y T::*member, V value)
142{
143 return applyOnMember(member, Add<V>(value));
144}
145
146template<class T, typename Y> ApplyOnMember<T, Y, Increment<Y> > inc(Y T::*member)
147{
148 return applyOnMember(member, Increment<Y>());
149}
150
151template<class T, typename Y> ApplyOnMember<T, Y, Decrement<Y> > dec(Y T::*member)
152{
153 return applyOnMember(member, Decrement<Y>());
154}
156
157}
158
159#endif
T * get() const
Definition Handle.h:25
Definition Metrics.h:65