CodePorting.Translator Cs2Cpp
CodePorting.Translator.Cs2Cpp.Framework
delegate.h
1
3#ifndef _aspose_system_function_h_
4#define _aspose_system_function_h_
5
6#include "shared_ptr.h"
7#include "weak_ptr.h"
8#include "exceptions.h"
9#include <utility>
10#include <memory>
11#include <functional>
12#include <cstring>
13#include "system/details/delegate_holding_variables.h"
14
15namespace System
16{
18 template<class Unused>
19 class Delegate;
21
54 template <class ReturnType, class... ArgumentTypes>
55 class Delegate <ReturnType(ArgumentTypes...)> : public System::Details::DelegateHoldingVariables
56 {
57
58 public:
60 Delegate() = default;
61
62 // noncopyable
63 Delegate(const Delegate&) = default;
64 Delegate& operator=(const Delegate&) = default;
65
66 // movable
69 Delegate(Delegate&& o) noexcept : m_invoker(std::move(o.m_invoker)) {}
70
74 Delegate& operator=(Delegate&& o) noexcept { m_invoker = std::move(o.m_invoker); }
75
79 template<class T>
80 Delegate(T function, typename std::enable_if<!std::is_bind_expression<T>::value && std::is_pointer<T>::value && std::is_function<typename std::remove_pointer<T>::type>::value>::type * = 0)
81 : m_invoker( new FunctionInvoker<T>(std::move(function)) )
82 {
83 }
84
88 template<class T>
89 Delegate(T function, typename std::enable_if<std::is_bind_expression<T>::value>::type * = 0)
90 : m_invoker( new BindInvoker<T>(function) )
91 {
92 }
93
98 template<class T>
99 Delegate(int functor_tag, T& functor)
100 : m_invoker( new FunctorInvoker<T>(functor) )
101 {
102 }
103
108 template<class T>
109 Delegate(long functor_tag, T&& functor)
110 : m_invoker( new BindInvoker<T>(std::move(functor)) )
111 {
112 }
113
114 // member function
120 template <class MemberType, class ClassType>
121 Delegate(MemberType ClassType::* member, ClassType* obj)
122 : m_invoker( new ClassMemberInvoker<MemberType, ClassType>(member, obj) )
123 {
124 }
125
131 template <class MemberType, class MemberClass, class ClassType>
132 Delegate(MemberType MemberClass::*member, const SharedPtr<ClassType>& obj)
133 : m_invoker(new ClassMemberInvoker<MemberType, ClassType>(member, obj))
134 {
135 }
136
141 template <class R, class... Args>
142 Delegate(std::function<R(Args...)> f)
143 : m_invoker( new StdFunctionInvoker<std::function<R(Args...)>>(f) )
144 {
145 }
146
150 ReturnType operator()(ArgumentTypes... args) const
151 {
152 return m_invoker->invoke(args...);
153 }
154
158 bool operator==(const Delegate& f) const
159 {
160 if( m_invoker == f.m_invoker )
161 return true; // handles both null case and self test
162
163 if( !m_invoker || !f.m_invoker )
164 return false;
165
166 return m_invoker->compare( *f.m_invoker.get());
167 }
168
171 bool Empty() const { return m_invoker->is_empty(); }
172
173#if defined(ASPOSE_GET_SHARED_MEMBERS) || defined(__DBG_FOR_EACH_MEMBER)
175 const std::shared_ptr<Details::HeldVariables>& GetHeldVariables() const noexcept
176 {
177 return m_heldVariables;
178 }
179#endif
180
181 private:
182
186 struct BaseInvoker
187 {
189 BaseInvoker(){}
190
192 virtual ~BaseInvoker() {}
193
194 BaseInvoker(const BaseInvoker&) = delete;
195 BaseInvoker& operator=(const BaseInvoker&) = delete;
196
200 virtual ReturnType invoke(ArgumentTypes... args) = 0;
201
205 bool compare(const BaseInvoker& other)
206 {
207 if( fast_compare_object() != other.fast_compare_object() )
208 return false;
209
210 return deep_compare(other);
211 }
212
215 size_t hash() const
216 {
217 return static_cast<size_t>(fast_compare_object());
218 }
219
223 virtual bool deep_compare(const BaseInvoker& other) const = 0;
224
228 virtual const void * fast_compare_object() const = 0;
229
232 virtual bool is_empty() const = 0;
233
234 };
235
240 template<class T>
241 struct FunctionInvoker : public BaseInvoker
242 {
245 FunctionInvoker(T function) : m_function(std::move(function))
246 {
247 static_assert(!std::is_bind_expression<T>::value, "Bind");
248 static_assert(std::is_pointer<T>::value, "Only functions and static member functions is supported, not all callable objects (functors).");
249 }
250
254 ReturnType invoke(ArgumentTypes... args) override
255 {
256 return m_function(args...);
257 }
258 protected:
262 const void * fast_compare_object() const override
263 {
264 return reinterpret_cast<const void *>(m_function);
265 }
266
270 bool deep_compare(const BaseInvoker& other) const override
271 {
272 auto obj = dynamic_cast<const FunctionInvoker<T>*>(&other);
273 return obj && m_function == obj->m_function;
274 }
275
278 bool is_empty() const override { return m_function == nullptr; }
279
280 private:
282 T m_function;
283 };
284
289 template<class T>
290 struct BindInvoker : public BaseInvoker
291 {
294 BindInvoker(T function) : m_function(std::move(function))
295 {
296 }
297
301 ReturnType invoke(ArgumentTypes... args) override
302 {
303 return m_function(args...);
304 }
305 protected:
308 const void * fast_compare_object() const override
309 {
310 return reinterpret_cast<const void *>(1);
311 }
312
318 bool deep_compare(const BaseInvoker& other) const override
319 {
320 return false;
321 }
322
325 bool is_empty() const override { return false; }
326
327 private:
329 T m_function;
330 };
331
336 template<class T>
337 struct FunctorInvoker : public BaseInvoker
338 {
341 FunctorInvoker(T& functor) : m_functor(functor)
342 {
343 }
344
348 ReturnType invoke(ArgumentTypes... args) override
349 {
350 return m_functor(args...);
351 }
352 protected:
356 const void * fast_compare_object() const override
357 {
358 return reinterpret_cast<const void *>(1);
359 }
360
364 bool deep_compare(const BaseInvoker& other) const override
365 {
366 auto obj = dynamic_cast<const FunctorInvoker<T>*>(&other);
367 return obj && m_functor == obj->m_functor;
368 }
369
372 bool is_empty() const override { return false; }
373
374 private:
376 T m_functor;
377 };
378
383 template<class T>
384 struct StdFunctionInvoker : public BaseInvoker
385 {
388 StdFunctionInvoker(T function) : m_function(function)
389 {
390 }
391
395 ReturnType invoke(ArgumentTypes... args) override
396 {
397 return m_function(args...);
398 }
399 protected:
403 const void * fast_compare_object() const override
404 {
405 auto ptr = m_function.template target<ReturnType(*)(ArgumentTypes...)>();
406 return ptr;
407 }
408
413 bool deep_compare(const BaseInvoker& other) const override
414 {
415 return false;
416 }
417
420 bool is_empty() const override { return m_function == nullptr; }
421
422 private:
424 T m_function;
425 };
426
432 template<class MemberType, class ClassType>
433 struct ClassMemberInvoker : public BaseInvoker
434 {
436 using ClassFunction = MemberType ClassType::*;
437
441 ClassMemberInvoker(ClassFunction member, const SharedPtr<ClassType>& obj)
442 : m_member_function(member), m_obj(obj, obj.get_Mode())
443 {}
444
448 ClassMemberInvoker(ClassFunction member, ClassType* obj)
449 : m_member_function(member), m_obj(obj, SmartPtrMode::Weak)
450 {}
451
455 ReturnType invoke(ArgumentTypes... args) override
456 {
457 auto* ptr = m_obj.get();
458 if (ptr != nullptr)
459 {
460 return (detail::cast_statically_or_dynamically<Object, ClassType>::cast(ptr)->*m_member_function)(args...);
461 }
462
463 throw NullReferenceException(u"Delegate: Object reference not set to an instance of an object.");
464 }
465
468 bool is_empty() const override { return m_obj == nullptr; }
469
470 protected:
474 const void * fast_compare_object() const override
475 {
476 return m_obj.get();
477 }
478
482 bool deep_compare(const BaseInvoker& other) const override
483 {
484 typedef ClassMemberInvoker<MemberType, ClassType> ThisType;
485 auto obj = dynamic_cast<const ThisType*>(&other);
486 return obj && m_member_function == obj->m_member_function && m_obj == obj->m_obj;
487 }
488
489 private:
491 ClassFunction m_member_function;
492
494 SmartPtr<ClassType> m_obj;
495 };
496
498
500 std::shared_ptr<BaseInvoker> m_invoker;
501 };
502} // namespace System
503#endif // _aspose_system_function_h_
bool Empty() const
Determines if the current delegate object is empty, e.g. does not point to any entity.
Definition: delegate.h:171
Delegate(long functor_tag, T &&functor)
Moving constructor. Constructs a delegate from the specified function object.
Definition: delegate.h:109
Delegate()=default
Default constructor. Constructs the delegate object that does not point to anything.
Delegate(T function, typename std::enable_if< std::is_bind_expression< T >::value >::type *=0)
Constructor. Constructs a delegate from the specified pointer to the function object generated by std...
Definition: delegate.h:89
Delegate(int functor_tag, T &functor)
Constructor. Constructs a delegate from the specified function object.
Definition: delegate.h:99
Delegate(T function, typename std::enable_if<!std::is_bind_expression< T >::value &&std::is_pointer< T >::value &&std::is_function< typename std::remove_pointer< T >::type >::value >::type *=0)
Constructor. Constructs a delegate object from the specified pointer to free function or static metho...
Definition: delegate.h:80
ReturnType operator()(ArgumentTypes... args) const
Invokes a function, method or a function object that is pointed to by current delegate object.
Definition: delegate.h:150
bool operator==(const Delegate &f) const
Compares two delegate objects to check if they point to the same entity.
Definition: delegate.h:158
Delegate(MemberType MemberClass::*member, const SharedPtr< ClassType > &obj)
Constructor. Constructs a delegate that points to the specified non-static method of the specified ob...
Definition: delegate.h:132
Delegate(Delegate &&o) noexcept
Moving copy constructor. Takes the ownership of an entity pointed to by the specified delegate.
Definition: delegate.h:69
Delegate & operator=(Delegate &&o) noexcept
Moving assignment operator. Takes the ownership of an entity pointed to by the specified delegate.
Definition: delegate.h:74
Delegate & operator=(const Delegate &)=default
Delegate(std::function< R(Args...)> f)
Constructs a delegate object that points to an std::function function object.
Definition: delegate.h:142
Delegate(MemberType ClassType::*member, ClassType *obj)
Constructor. Constructs a delegate that points to the specified non-static method of the specified ob...
Definition: delegate.h:121
Pointer class to wrap types being allocated on heap. Use it to manage memory for classes inheriting O...
Definition: smart_ptr.h:180
Definition: db_command.h:9
SmartPtrMode
SmartPtr pointer type: weak or shared. Defines whether pointer is being counted when it is being deci...
Definition: smart_ptr.h:68
static To * cast(From *pointer)
Performs actual pointer casting using dynamic_cast.
Definition: detail.h:38