Skip to content

Commit 60761df

Browse files
committed
Fix compile error when using Heter classes with CounterRemover, #68
1 parent 39daab7 commit 60761df

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

include/eventpp/utilities/counterremover.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#define COUNTERREMOVER_H_211532679833
1616

1717
#include "../eventpolicies.h"
18+
#include "../internal/typeutil_i.h"
1819

1920
namespace eventpp {
2021

@@ -41,7 +42,8 @@ class CounterRemover <
4142
};
4243

4344
template <typename ...Args>
44-
void operator() (Args && ...args) const {
45+
auto operator() (Args && ...args) const
46+
-> typename std::enable_if<internal_::CanInvoke<Callback, Args ...>::value, void>::type {
4547
if(--data->triggerCount <= 0) {
4648
data->dispatcher.removeListener(data->event, data->handle);
4749
}
@@ -123,7 +125,8 @@ class CounterRemover <
123125
};
124126

125127
template <typename ...Args>
126-
void operator() (Args && ...args) const {
128+
auto operator() (Args && ...args) const
129+
-> typename std::enable_if<internal_::CanInvoke<Callback, Args ...>::value, void>::type {
127130
if(--data->triggerCount <= 0) {
128131
data->callbackList.remove(data->handle);
129132
}

readme.md

+1
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@ Added CallbackList, EventDispatcher, EventQueue, CounterRemover, ConditionalRemo
320320
<td align="center"><a href="https://github.com/henaiguo/"><img alt="henaiguo" src="https://github.com/henaiguo.png?s=100" width="100px;" /></a><span>henaiguo</span></td>
321321
<td align="center"><a href="https://github.com/sr-tream/"><img alt="sr-tream" src="https://github.com/sr-tream.png?s=100" width="100px;" /></a><span>sr-tream</span></td>
322322
<td align="center"><a href="https://github.com/Drise13/"><img alt="Drise13" src="https://github.com/Drise13.png?s=100" width="100px;" /></a><span>Drise13</span></td>
323+
<td align="center"><a href="https://github.com/iamzone/"><img alt="iamzone" src="https://github.com/iamzone.png?s=100" width="100px;" /></a><span>iamzone</span></td>
323324
</tr>
324325
</table>
325326

tests/unittest/test_counterremover.cpp

+15-5
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ TEST_CASE("CounterRemover, CallbackList, has parameters")
162162

163163
TEST_CASE("CounterRemover, HeterEventDispatcher")
164164
{
165-
eventpp::HeterEventDispatcher<int, eventpp::HeterTuple<void ()> > dispatcher;
165+
eventpp::HeterEventDispatcher<int, eventpp::HeterTuple<void (), void (int)> > dispatcher;
166166
constexpr int event = 3;
167167

168168
std::vector<int> dataList(4);
@@ -174,7 +174,7 @@ TEST_CASE("CounterRemover, HeterEventDispatcher")
174174
eventpp::counterRemover(dispatcher).prependListener(event, [&dataList]() {
175175
++dataList[1];
176176
});
177-
auto handle = eventpp::counterRemover(dispatcher).appendListener(event, [&dataList]() {
177+
auto handle = eventpp::counterRemover(dispatcher).appendListener(event, [&dataList](int) {
178178
++dataList[2];
179179
}, 2);
180180
eventpp::counterRemover(dispatcher).insertListener(event, [&dataList]() {
@@ -183,22 +183,27 @@ TEST_CASE("CounterRemover, HeterEventDispatcher")
183183

184184
REQUIRE(dataList == std::vector<int> { 0, 0, 0, 0 });
185185

186-
dispatcher.dispatch(event);
186+
dispatcher.dispatch(event); // for void()
187+
REQUIRE(dataList == std::vector<int> { 1, 1, 0, 1 });
188+
dispatcher.dispatch(event, 5); // for void(int)
187189
REQUIRE(dataList == std::vector<int> { 1, 1, 1, 1 });
188190

189191
dispatcher.dispatch(event);
192+
dispatcher.dispatch(event, 5);
190193
REQUIRE(dataList == std::vector<int> { 2, 1, 2, 2 });
191194

192195
dispatcher.dispatch(event);
196+
dispatcher.dispatch(event, 5);
193197
REQUIRE(dataList == std::vector<int> { 3, 1, 2, 3 });
194198

195199
dispatcher.dispatch(event);
200+
dispatcher.dispatch(event, 5);
196201
REQUIRE(dataList == std::vector<int> { 4, 1, 2, 3 });
197202
}
198203

199204
TEST_CASE("CounterRemover, HeterCallbackList")
200205
{
201-
eventpp::HeterCallbackList<eventpp::HeterTuple<void ()> > callbackList;
206+
eventpp::HeterCallbackList<eventpp::HeterTuple<void (), void (int)> > callbackList;
202207

203208
std::vector<int> dataList(4);
204209

@@ -209,7 +214,7 @@ TEST_CASE("CounterRemover, HeterCallbackList")
209214
eventpp::counterRemover(callbackList).prepend([&dataList]() {
210215
++dataList[1];
211216
});
212-
auto handle = eventpp::counterRemover(callbackList).append([&dataList]() {
217+
auto handle = eventpp::counterRemover(callbackList).append([&dataList](int) {
213218
++dataList[2];
214219
}, 2);
215220
eventpp::counterRemover(callbackList).insert([&dataList]() {
@@ -219,15 +224,20 @@ TEST_CASE("CounterRemover, HeterCallbackList")
219224
REQUIRE(dataList == std::vector<int> { 0, 0, 0, 0 });
220225

221226
callbackList();
227+
REQUIRE(dataList == std::vector<int> { 1, 1, 0, 1 });
228+
callbackList(5);
222229
REQUIRE(dataList == std::vector<int> { 1, 1, 1, 1 });
223230

224231
callbackList();
232+
callbackList(5);
225233
REQUIRE(dataList == std::vector<int> { 2, 1, 2, 2 });
226234

227235
callbackList();
236+
callbackList(5);
228237
REQUIRE(dataList == std::vector<int> { 3, 1, 2, 3 });
229238

230239
callbackList();
240+
callbackList(5);
231241
REQUIRE(dataList == std::vector<int> { 4, 1, 2, 3 });
232242
}
233243

0 commit comments

Comments
 (0)