Ice 3.7 C++11 API Reference
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 
8 namespace IceInternal
9 {
10 
11 template<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
20 template<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 
28 template<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
36 template<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 
44 template<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 
52 template<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 
60 template<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 
69 template<typename R> struct ReferenceWrapper<R*>
70 {
71  static R* get(R* v)
72  {
73  return v;
74  }
75 };
76 
77 template<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 
87 namespace IceMX
88 {
89 
91 template<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 
107 template<typename T> struct Decrement
108 {
109  void operator()(T& v)
110  {
111  --v;
112  }
113 };
114 
115 template<typename T> struct Increment
116 {
117  void operator()(T& v)
118  {
119  ++v;
120  }
121 };
122 
123 template<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 
136 template<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 
141 template<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 
146 template<class T, typename Y> ApplyOnMember<T, Y, Increment<Y> > inc(Y T::*member)
147 {
148  return applyOnMember(member, Increment<Y>());
149 }
150 
151 template<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
IceMX
Definition: Metrics.h:65