Ice 3.7 C++11 API Reference
Loading...
Searching...
No Matches
Functional.h
Go to the documentation of this file.
1//
2// Copyright (c) ZeroC, Inc. All rights reserved.
3//
4
5#ifndef ICE_UTIL_FUNCTIONAL_H
6#define ICE_UTIL_FUNCTIONAL_H
7
8#include <IceUtil/Config.h>
9
10#if !defined(ICE_CPP11_MAPPING) && (ICE_CPLUSPLUS < 201703L)
11
12#include <IceUtil/Handle.h>
13#include <functional>
14
15namespace IceUtilInternal
16{
17
18// ----------------------------------------------------------------------
19// Various function objects that work with handles instead of plain
20// pointers.
21// ----------------------------------------------------------------------
22
23template<class R, class T, class H>
24class MemFun : public std::unary_function<H, R>
25{
26 typedef R (T::*MemberFN)(void);
27 MemberFN _mfn;
28
29public:
30
31 explicit MemFun(MemberFN p) : _mfn(p) { }
32 R operator()(H handle) const
33 {
34 return (handle.get() ->* _mfn)();
35 }
36};
37
38template<class R, class T, class H, class A>
39class MemFun1 : public std::binary_function<H, A, R>
40{
41 typedef R (T::*MemberFN)(A);
42 MemberFN _mfn;
43
44public:
45
46 explicit MemFun1(MemberFN p) : _mfn(p) { }
47 R operator()(H handle, A arg) const
48 {
49 return (handle.get() ->* _mfn)(arg);
50 }
51};
52
53template<class T, class H>
54class VoidMemFun : public std::unary_function<H, void>
55{
56 typedef void (T::*MemberFN)(void);
57 MemberFN _mfn;
58
59public:
60
61 explicit VoidMemFun(MemberFN p) : _mfn(p) { }
62 void operator()(H handle) const
63 {
64 (handle.get() ->* _mfn)();
65 }
66};
67
68template<class T, class H, class A>
69class VoidMemFun1 : public std::binary_function<H, A, void>
70{
71 typedef void (T::*MemberFN)(A);
72 MemberFN _mfn;
73
74public:
75
76 explicit VoidMemFun1(MemberFN p) : _mfn(p) { }
77 void operator()(H handle, A arg) const
78 {
79 (handle.get() ->* _mfn)(arg);
80 }
81};
82
83template<class R, class K, class T, class H>
84class SecondMemFun : public std::unary_function<std::pair<K, H>, R>
85{
86 typedef R (T::*MemberFN)(void);
87 MemberFN _mfn;
88
89public:
90
91 explicit SecondMemFun(MemberFN p) : _mfn(p) { }
92 R operator()(std::pair<K, H> pair) const
93 {
94 return (pair.second.get() ->* _mfn)();
95 }
96};
97
98template<class R, class K, class T, class H, class A>
99class SecondMemFun1 : public std::binary_function<std::pair<K, H>, A, R>
100{
101 typedef R (T::*MemberFN)(A);
102 MemberFN _mfn;
103
104public:
105
106 explicit SecondMemFun1(MemberFN p) : _mfn(p) { }
107 R operator()(std::pair<K, H> pair, A arg) const
108 {
109 return (pair.second.get() ->* _mfn)(arg);
110 }
111};
112
113template<class K, class T, class H>
114class SecondVoidMemFun : public std::unary_function<std::pair<K, H>, void>
115{
116 typedef void (T::*MemberFN)(void);
117 MemberFN _mfn;
118
119public:
120
121 explicit SecondVoidMemFun(MemberFN p) : _mfn(p) { }
122 void operator()(std::pair<K, H> pair) const
123 {
124 (pair.second.get() ->* _mfn)();
125 }
126};
127
128template<class K, class T, class H, class A>
129class SecondVoidMemFun1 : public std::binary_function<std::pair<K, H>, A, void>
130{
131 typedef void (T::*MemberFN)(A);
132 MemberFN _mfn;
133
134public:
135
136 explicit SecondVoidMemFun1(MemberFN p) : _mfn(p) { }
137 void operator()(std::pair<K, H> pair, A arg) const
138 {
139 (pair.second.get() ->* _mfn)(arg);
140 }
141};
142
143template<class R, class T, class H>
144class ConstMemFun : public std::unary_function<H, R>
145{
146 typedef R (T::*MemberFN)(void) const;
147 MemberFN _mfn;
148
149public:
150
151 explicit ConstMemFun(MemberFN p) : _mfn(p) { }
152 R operator()(H handle) const
153 {
154 return (handle.get() ->* _mfn)();
155 }
156};
157
158template<class R, class T, class H, class A>
159class ConstMemFun1 : public std::binary_function<H, A, R>
160{
161 typedef R (T::*MemberFN)(A) const;
162 MemberFN _mfn;
163
164public:
165
166 explicit ConstMemFun1(MemberFN p) : _mfn(p) { }
167 R operator()(H handle, A arg) const
168 {
169 return (handle.get() ->* _mfn)(arg);
170 }
171};
172
173template<class T, class H>
174class ConstVoidMemFun : public std::unary_function<H, void>
175{
176 typedef void (T::*MemberFN)(void) const;
177 MemberFN _mfn;
178
179public:
180
181 explicit ConstVoidMemFun(MemberFN p) : _mfn(p) { }
182 void operator()(H handle) const
183 {
184 (handle.get() ->* _mfn)();
185 }
186};
187
188template<class T, class H, class A>
189class ConstVoidMemFun1 : public std::binary_function<H, A, void>
190{
191 typedef void (T::*MemberFN)(A) const;
192 MemberFN _mfn;
193
194public:
195
196 explicit ConstVoidMemFun1(MemberFN p) : _mfn(p) { }
197 void operator()(H handle, A arg) const
198 {
199 (handle.get() ->* _mfn)(arg);
200 }
201};
202
203template<class R, class K, class T, class H>
204class SecondConstMemFun : public std::unary_function<std::pair<K, H>, R>
205{
206 typedef R (T::*MemberFN)(void) const;
207 MemberFN _mfn;
208
209public:
210
211 explicit SecondConstMemFun(MemberFN p) : _mfn(p) { }
212 R operator()(std::pair<K, H> pair) const
213 {
214 return (pair.second.get() ->* _mfn)();
215 }
216};
217
218template<class R, class K, class T, class H, class A>
219class SecondConstMemFun1 : public std::binary_function<std::pair<K, H>, A, R>
220{
221 typedef R (T::*MemberFN)(A) const;
222 MemberFN _mfn;
223
224public:
225
226 explicit SecondConstMemFun1(MemberFN p) : _mfn(p) { }
227 R operator()(std::pair<K, H> pair, A arg) const
228 {
229 return (pair.second.get() ->* _mfn)(arg);
230 }
231};
232
233template<class K, class T, class H>
234class SecondConstVoidMemFun : public std::unary_function<std::pair<K, H>, void>
235{
236 typedef void (T::*MemberFN)(void) const;
237 MemberFN _mfn;
238
239public:
240
241 explicit SecondConstVoidMemFun(MemberFN p) : _mfn(p) { }
242 void operator()(std::pair<K, H> pair) const
243 {
244 (pair.second.get() ->* _mfn)();
245 }
246};
247
248template<class K, class T, class H, class A>
249class SecondConstVoidMemFun1 : public std::binary_function<std::pair<K, H>, A, void>
250{
251 typedef void (T::*MemberFN)(A) const;
252 MemberFN _mfn;
253
254public:
255
256 explicit SecondConstVoidMemFun1(MemberFN p) : _mfn(p) { }
257 void operator()(std::pair<K, H> pair, A arg) const
258 {
259 (pair.second.get() ->* _mfn)(arg);
260 }
261};
262
263}
264
265// ----------------------------------------------------------------------
266// Inline functions that return function objects that work with
267// IceUtil::Handle
268// ----------------------------------------------------------------------
269
270namespace IceUtil
271{
272
273template<class R, class T>
274inline ::IceUtilInternal::MemFun<R, T, Handle<T> >
275memFun(R (T::*p)(void))
276{
277 return ::IceUtilInternal::MemFun<R, T, Handle<T> >(p);
278}
279
280template<class R, class T, class A>
281inline ::IceUtilInternal::MemFun1<R, T, Handle<T>, A>
282memFun1(R (T::*p)(A))
283{
284 return ::IceUtilInternal::MemFun1<R, T, Handle<T>, A>(p);
285}
286
287template<class T>
288inline ::IceUtilInternal::VoidMemFun<T, Handle<T> >
289voidMemFun(void (T::*p)(void))
290{
291 return ::IceUtilInternal::VoidMemFun<T, Handle<T> >(p);
292}
293
294template<class T, class A>
295inline ::IceUtilInternal::VoidMemFun1<T, Handle<T>, A>
296voidMemFun1(void (T::*p)(A))
297{
298 return ::IceUtilInternal::VoidMemFun1<T, Handle<T>, A>(p);
299}
300
301template<class R, class K, class T>
302inline ::IceUtilInternal::SecondMemFun<R, K, T, Handle<T> >
303secondMemFun(R (T::*p)(void))
304{
305 return ::IceUtilInternal::SecondMemFun<R, K, T, Handle<T> >(p);
306}
307
308template<class R, class K, class T, class A>
309inline ::IceUtilInternal::SecondMemFun1<R, K, T, Handle<T>, A>
310secondMemFun1(R (T::*p)(A))
311{
312 return ::IceUtilInternal::SecondMemFun1<R, K, T, Handle<T>, A>(p);
313}
314
315template<class K, class T>
316inline ::IceUtilInternal::SecondVoidMemFun<K, T, Handle<T> >
317secondVoidMemFun(void (T::*p)(void))
318{
319 return ::IceUtilInternal::SecondVoidMemFun<K, T, Handle<T> >(p);
320}
321
322template<class K, class T, class A>
323inline ::IceUtilInternal::SecondVoidMemFun1<K, T, Handle<T>, A>
324secondVoidMemFun1(void (T::*p)(A))
325{
326 return ::IceUtilInternal::SecondVoidMemFun1<K, T, Handle<T>, A>(p);
327}
328
329template<class R, class T>
330inline ::IceUtilInternal::ConstMemFun<R, T, Handle<T> >
331constMemFun(R (T::*p)(void) const)
332{
333 return ::IceUtilInternal::ConstMemFun<R, T, Handle<T> >(p);
334}
335
336template<class R, class T, class A>
337inline ::IceUtilInternal::ConstMemFun1<R, T, Handle<T>, A>
338constMemFun1(R (T::*p)(A) const)
339{
340 return ::IceUtilInternal::ConstMemFun1<R, T, Handle<T>, A>(p);
341}
342
343template<class T>
344inline ::IceUtilInternal::ConstVoidMemFun<T, Handle<T> >
345constVoidMemFun(void (T::*p)(void) const)
346{
347 return ::IceUtilInternal::ConstVoidMemFun<T, Handle<T> >(p);
348}
349
350template<class T, class A>
351inline ::IceUtilInternal::ConstVoidMemFun1<T, Handle<T>, A>
352constVoidMemFun1(void (T::*p)(A) const)
353{
354 return ::IceUtilInternal::ConstVoidMemFun1<T, Handle<T>, A>(p);
355}
356
357template<class R, class K, class T>
358inline ::IceUtilInternal::SecondConstMemFun<R, K, T, Handle<T> >
359secondConstMemFun(R (T::*p)(void) const)
360{
361 return ::IceUtilInternal::SecondConstMemFun<R, K, T, Handle<T> >(p);
362}
363
364template<class R, class K, class T, class A>
365inline ::IceUtilInternal::SecondConstMemFun1<R, K, T, Handle<T>, A>
366secondConstMemFun1(R (T::*p)(A) const)
367{
368 return ::IceUtilInternal::SecondConstMemFun1<R, K, T, Handle<T>, A>(p);
369}
370
371template<class K, class T>
372inline ::IceUtilInternal::SecondConstVoidMemFun<K, T, Handle<T> >
373secondConstVoidMemFun(void (T::*p)(void) const)
374{
375 return ::IceUtilInternal::SecondConstVoidMemFun<K, T, Handle<T> >(p);
376}
377
378template<class K, class T, class A>
379inline ::IceUtilInternal::SecondConstVoidMemFun1<K, T, Handle<T>, A>
380secondConstVoidMemFun1(void (T::*p)(A) const)
381{
382 return ::IceUtilInternal::SecondConstVoidMemFun1<K, T, Handle<T>, A>(p);
383}
384
385}
386
387#endif
388
389#endif
Definition Optional.h:1095