@@ -86,13 +86,24 @@ namespace etl
86
86
// *************************************************************************
87
87
// / Declaration.
88
88
// *************************************************************************
89
- template <typename T> class delegate ;
89
+ template <typename T>
90
+ class delegate ;
91
+
92
+ // *************************************************************************
93
+ // / Specialisation - base class of all delegates.
94
+ // *************************************************************************
95
+ template <>
96
+ class delegate <void >
97
+ {
98
+ protected:
99
+ delegate () = default ;
100
+ };
90
101
91
102
// *************************************************************************
92
103
// / Specialisation.
93
104
// *************************************************************************
94
105
template <typename TReturn, typename ... TParams>
95
- class delegate <TReturn(TParams...)> final
106
+ class delegate <TReturn(TParams...)> final : public delegate< void >
96
107
{
97
108
public:
98
109
@@ -111,7 +122,7 @@ namespace etl
111
122
// *************************************************************************
112
123
// Construct from lambda or functor.
113
124
// *************************************************************************
114
- template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !etl::is_same<etl:: delegate<TReturn(TParams...) >, TLambda>::value, void >>
125
+ template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !std::is_base_of< delegate<void >, TLambda>::value, void >>
115
126
ETL_CONSTEXPR14 delegate (TLambda& instance)
116
127
{
117
128
assign ((void *)(&instance), lambda_stub<TLambda>);
@@ -120,7 +131,7 @@ namespace etl
120
131
// *************************************************************************
121
132
// Construct from const lambda or functor.
122
133
// *************************************************************************
123
- template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !etl::is_same<etl:: delegate<TReturn(TParams...) >, TLambda>::value, void >>
134
+ template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !std::is_base_of< delegate<void >, TLambda>::value, void >>
124
135
ETL_CONSTEXPR14 delegate (const TLambda& instance)
125
136
{
126
137
assign ((void *)(&instance), const_lambda_stub<TLambda>);
@@ -139,7 +150,7 @@ namespace etl
139
150
// *************************************************************************
140
151
// / Create from Lambda or Functor.
141
152
// *************************************************************************
142
- template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !etl::is_same<etl:: delegate<TReturn(TParams...) >, TLambda>::value, void >>
153
+ template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !std::is_base_of< delegate<void >, TLambda>::value, void >>
143
154
ETL_NODISCARD
144
155
static ETL_CONSTEXPR14 delegate create (TLambda& instance)
145
156
{
@@ -149,7 +160,7 @@ namespace etl
149
160
// *************************************************************************
150
161
// / Create from const Lambda or Functor.
151
162
// *************************************************************************
152
- template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !etl::is_same<etl:: delegate<TReturn(TParams...) >, TLambda>::value, void >>
163
+ template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !std::is_base_of< delegate<void >, TLambda>::value, void >>
153
164
ETL_NODISCARD
154
165
static ETL_CONSTEXPR14 delegate create (const TLambda& instance)
155
166
{
@@ -257,7 +268,7 @@ namespace etl
257
268
// *************************************************************************
258
269
// / Set from Lambda or Functor.
259
270
// *************************************************************************
260
- template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !etl::is_same<etl:: delegate<TReturn(TParams...) >, TLambda>::value, void >>
271
+ template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !std::is_base_of< delegate<void >, TLambda>::value, void >>
261
272
ETL_CONSTEXPR14 void set (TLambda& instance)
262
273
{
263
274
assign ((void *)(&instance), lambda_stub<TLambda>);
@@ -266,7 +277,7 @@ namespace etl
266
277
// *************************************************************************
267
278
// / Set from const Lambda or Functor.
268
279
// *************************************************************************
269
- template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !etl::is_same<etl:: delegate<TReturn(TParams...) >, TLambda>::value, void >>
280
+ template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !std::is_base_of< delegate<void >, TLambda>::value, void >>
270
281
ETL_CONSTEXPR14 void set (const TLambda& instance)
271
282
{
272
283
assign ((void *)(&instance), const_lambda_stub<TLambda>);
@@ -427,7 +438,7 @@ namespace etl
427
438
// *************************************************************************
428
439
// / Create from Lambda or Functor.
429
440
// *************************************************************************
430
- template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !etl::is_same<etl:: delegate<TReturn(TParams...) >, TLambda>::value, void >>
441
+ template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !std::is_base_of< delegate<void >, TLambda>::value, void >>
431
442
ETL_CONSTEXPR14 delegate& operator =(TLambda& instance)
432
443
{
433
444
assign ((void *)(&instance), lambda_stub<TLambda>);
@@ -437,7 +448,7 @@ namespace etl
437
448
// *************************************************************************
438
449
// / Create from const Lambda or Functor.
439
450
// *************************************************************************
440
- template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !etl::is_same<etl:: delegate<TReturn(TParams...) >, TLambda>::value, void >>
451
+ template <typename TLambda, typename = etl::enable_if_t <etl::is_class<TLambda>::value && !std::is_base_of< delegate<void >, TLambda>::value, void >>
441
452
ETL_CONSTEXPR14 delegate& operator =(const TLambda& instance)
442
453
{
443
454
assign ((void *)(&instance), const_lambda_stub<TLambda>);
0 commit comments