Merge "Clean up the code to build successfully on macOS" into devel/master
[platform/core/uifw/dali-core.git] / dali / public-api / signals / slot-delegate.h
1 #ifndef DALI_SLOT_DELEGATE_H
2 #define DALI_SLOT_DELEGATE_H
3
4 /*
5  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // INTERNAL INCLUDES
22 #include <dali/public-api/common/dali-common.h>
23 #include <dali/public-api/signals/connection-tracker.h>
24
25 namespace Dali
26 {
27 /**
28  * @addtogroup dali_core_signals
29  * @{
30  */
31
32 /**
33  * @brief SlotDelegates can be used to connect member functions to signals, without inheriting from SlotDelegateInterface.
34  *
35  * Note that the object providing the member function is expected to own the SlotDelegate; therefore when the object
36  * is destroyed, the SlotDelegate destructor will automatically disconnect.
37  *
38  * @code
39  *
40  * class Example // This does not inherit from SlotDelegateInterface!
41  * {
42  * public:
43  *
44  *   Example()
45  *   : mSlotDelegate( this )
46  *   {
47  *   }
48  *
49  *   ~Example()
50  *   {
51  *     // mSlotDelegate disconnects automatically here
52  *   }
53  *
54  *   void Animate()
55  *   {
56  *     Animation animation = Animation::New( 1.0f );
57  *     animation.FinishedSignal().Connect( mSlotDelegate, &Example::OnAnimationFinished );
58  *     animation.Play(); // fire & forget
59  *   }
60  *
61  *   void OnAnimationFinished( Animation& animation )
62  *   {
63  *     std::cout << "Animation Finished!" << std::endl;
64  *   }
65  *
66  * private:
67  *
68  *  SlotDelegate<Example> mSlotDelegate;
69  *
70  * };
71  *
72  * @endcode
73  * @SINCE_1_0.0
74  */
75 template<typename Slot>
76 class SlotDelegate
77 {
78 public:
79   /**
80    * @brief Constructor.
81    *
82    * @SINCE_1_0.0
83    * @param[in] slot The object with a callback
84    */
85   SlotDelegate(Slot* slot)
86   : mSlot(slot)
87   {
88   }
89
90   /**
91    * @brief Non-virtual destructor.
92    *
93    * @SINCE_1_0.0
94    */
95   ~SlotDelegate() = default;
96
97   /**
98    * @brief Disconnects all signals from this object.
99    *
100    * @SINCE_1_0.0
101    */
102   void DisconnectAll()
103   {
104     mConnectionTracker.DisconnectAll();
105   }
106
107   /**
108    * @copydoc ConnectionTracker::GetConnectionCount
109    */
110   std::size_t GetConnectionCount() const
111   {
112     return mConnectionTracker.GetConnectionCount();
113   }
114
115   /**
116    * @brief Retrieves the slot object.
117    *
118    * @SINCE_1_0.0
119    * @return The object with a callback
120    */
121   Slot* GetSlot()
122   {
123     return mSlot;
124   }
125
126   /**
127    * @brief Retrieves the connection tracker component.
128    *
129    * @SINCE_1_0.0
130    * @return The connection tracker component
131    */
132   ConnectionTracker* GetConnectionTracker()
133   {
134     return &mConnectionTracker;
135   }
136
137 private:
138   SlotDelegate(const SlotDelegate&) = delete;            ///< Deleted copy constructor. @SINCE_1_0.0
139   SlotDelegate(SlotDelegate&&)      = delete;            ///< Deleted move constructor. @SINCE_1_9.25
140   SlotDelegate& operator=(const SlotDelegate&) = delete; ///< Deleted copy assignment operator. @SINCE_1_0.0
141   SlotDelegate& operator=(SlotDelegate&&) = delete;      ///< Deleted move assignment operator. @SINCE_1_9.25
142
143 private:
144   Slot* mSlot; ///< The slot object
145
146   // Use composition instead of inheritance (virtual methods don't mix well with templates)
147   ConnectionTracker mConnectionTracker; ///< A connection tracker
148 };
149
150 /**
151  * @}
152  */
153 } // namespace Dali
154
155 #endif // DALI_SLOT_DELEGATE_H