SPH
Function.h
Go to the documentation of this file.
1 #pragma once
2 
7 
8 #include "common/Traits.h"
10 
12 
13 namespace Detail {
14 template <typename TSignature>
15 class Callable;
16 
17 template <typename TReturn, typename... TArgs>
18 class Callable<TReturn(TArgs...)> : public Polymorphic {
19 public:
20  virtual TReturn operator()(TArgs... args) = 0;
21 };
22 } // namespace Detail
23 
24 template <typename TSignature>
25 class Function;
26 
30 template <typename TReturn, typename... TArgs>
31 class Function<TReturn(TArgs...)> {
32 private:
33  SharedPtr<Detail::Callable<TReturn(TArgs...)>> holder;
34 
35  template <typename TFunctor>
36  class FunctorCallable : public Detail::Callable<TReturn(TArgs...)> {
37  private:
38  TFunctor functor;
39 
40  public:
41  FunctorCallable(TFunctor&& functor)
42  : functor(std::forward<TFunctor>(functor)) {}
43 
44  virtual TReturn operator()(TArgs... args) override {
45  return functor(args...);
46  }
47  };
48 
49 public:
50  Function() = default;
51 
56  template <typename TFunctor, typename = std::enable_if_t<IsCallable<TFunctor, TArgs...>::value>>
57  Function(TFunctor functor)
58  : holder(makeShared<FunctorCallable<TFunctor>>(std::move(functor))) {}
59 
60  Function(const Function& other)
61  : holder(other.holder) {}
62 
63  Function(Function&& other)
64  : holder(std::move(other.holder)) {}
65 
66  Function(std::nullptr_t)
67  : holder(nullptr) {}
68 
69  template <typename TFunctor>
70  Function& operator=(TFunctor functor) {
71  holder = makeShared<FunctorCallable<TFunctor>>(std::move(functor));
72  return *this;
73  }
74 
75  Function& operator=(const Function& other) {
76  holder = other.holder;
77  return *this;
78  }
79 
81  holder = std::move(other.holder);
82  return *this;
83  }
84 
85  Function& operator=(std::nullptr_t) {
86  holder = nullptr;
87  return *this;
88  }
89 
91  template <typename... Ts>
92  TReturn operator()(Ts&&... args) const {
93  SPH_ASSERT(holder);
94  return (*holder)(std::forward<Ts>(args)...);
95  }
96 
98  template <typename... Ts>
99  void callIfNotNull(Ts&&... args) const {
100  if (holder) {
101  this->operator()(std::forward<Ts>(args)...);
102  }
103  }
104 
105  INLINE explicit operator bool() const {
106  return bool(holder);
107  }
108 };
109 
#define SPH_ASSERT(x,...)
Definition: Assert.h:94
NAMESPACE_SPH_BEGIN
Definition: BarnesHut.cpp:13
#define INLINE
Macros for conditional compilation based on selected compiler.
Definition: Object.h:31
#define NAMESPACE_SPH_END
Definition: Object.h:12
INLINE SharedPtr< T > makeShared(TArgs &&... args)
Definition: SharedPtr.h:410
Few non-standard type traits.
virtual TReturn operator()(TArgs... args)=0
Function(std::nullptr_t)
Definition: Function.h:66
Function(const Function &other)
Definition: Function.h:60
Function & operator=(TFunctor functor)
Definition: Function.h:70
Function & operator=(const Function &other)
Definition: Function.h:75
Function & operator=(Function &&other)
Definition: Function.h:80
Function(TFunctor functor)
Creates a function given a callable object.
Definition: Function.h:57
TReturn operator()(Ts &&... args) const
Calls the function, given argument list.
Definition: Function.h:92
Function(Function &&other)
Definition: Function.h:63
Function & operator=(std::nullptr_t)
Definition: Function.h:85
void callIfNotNull(Ts &&... args) const
Calls the function is set, otherwise it does nothing.
Definition: Function.h:99
Overload of std::swap for Sph::Array.
Definition: Array.h:578
Base class for all polymorphic objects.
Definition: Object.h:88