Skip to content

Commit 0b5d720

Browse files
authored
Added noexcept variants to function traits (#298)
1 parent 1cd179d commit 0b5d720

File tree

3 files changed

+407
-2
lines changed

3 files changed

+407
-2
lines changed

include/fplus/function_traits.hpp

Lines changed: 135 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,15 @@ namespace utils {
145145
};
146146
};
147147

148+
#if __cplusplus > 201510L
149+
150+
template <typename ReturnType, typename... Args>
151+
struct function_traits<ReturnType(Args...) noexcept>
152+
: public function_traits<ReturnType(Args...)> {
153+
};
154+
155+
#endif
156+
148157
template <typename ReturnType, typename... Args>
149158
struct function_traits<ReturnType (*)(Args...)>
150159
: public function_traits<ReturnType(Args...)> {
@@ -174,6 +183,39 @@ namespace utils {
174183
typedef const volatile ClassType& owner_type;
175184
};
176185

186+
#if __cplusplus > 201510L
187+
188+
template <typename ReturnType, typename... Args>
189+
struct function_traits<ReturnType (*)(Args...) noexcept>
190+
: public function_traits<ReturnType(Args...)> {
191+
};
192+
193+
template <typename ClassType, typename ReturnType, typename... Args>
194+
struct function_traits<ReturnType (ClassType::*)(Args...) noexcept>
195+
: public function_traits<ReturnType(Args...)> {
196+
typedef ClassType& owner_type;
197+
};
198+
199+
template <typename ClassType, typename ReturnType, typename... Args>
200+
struct function_traits<ReturnType (ClassType::*)(Args...) const noexcept>
201+
: public function_traits<ReturnType(Args...)> {
202+
typedef const ClassType& owner_type;
203+
};
204+
205+
template <typename ClassType, typename ReturnType, typename... Args>
206+
struct function_traits<ReturnType (ClassType::*)(Args...) volatile noexcept>
207+
: public function_traits<ReturnType(Args...)> {
208+
typedef volatile ClassType& owner_type;
209+
};
210+
211+
template <typename ClassType, typename ReturnType, typename... Args>
212+
struct function_traits<ReturnType (ClassType::*)(Args...) const volatile noexcept>
213+
: public function_traits<ReturnType(Args...)> {
214+
typedef const volatile ClassType& owner_type;
215+
};
216+
217+
#endif
218+
177219
template <typename FunctionType>
178220
struct function_traits<std::function<FunctionType>>
179221
: public function_traits<FunctionType> {
@@ -188,7 +230,7 @@ namespace utils {
188230
#ifdef MEM_FN_SYMBOL_XX0SL7G4Z0J
189231

190232
template <typename R, typename C>
191-
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R C::*>>
233+
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R (C::*)()>>
192234
: public function_traits<R(C*)> {
193235
};
194236
template <typename R, typename C, typename... A>
@@ -207,6 +249,28 @@ namespace utils {
207249
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R (C::*)(A...) const volatile>>
208250
: public function_traits<R(const volatile C*, A...)> {
209251
};
252+
#if __cplusplus > 201510L
253+
template <typename R, typename C>
254+
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R (C::*)() noexcept>>
255+
: public function_traits<R(C*)> {
256+
};
257+
template <typename R, typename C, typename... A>
258+
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R (C::*)(A...) noexcept>>
259+
: public function_traits<R(C*, A...)> {
260+
};
261+
template <typename R, typename C, typename... A>
262+
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R (C::*)(A...) const noexcept>>
263+
: public function_traits<R(const C*, A...)> {
264+
};
265+
template <typename R, typename C, typename... A>
266+
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R (C::*)(A...) volatile noexcept>>
267+
: public function_traits<R(volatile C*, A...)> {
268+
};
269+
template <typename R, typename C, typename... A>
270+
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R (C::*)(A...) const volatile noexcept>>
271+
: public function_traits<R(const volatile C*, A...)> {
272+
};
273+
#endif
210274

211275
#undef MEM_FN_SYMBOL_XX0SL7G4Z0J
212276
#endif
@@ -418,6 +482,76 @@ namespace internal {
418482
template <typename FunctionType>
419483
struct has_function_traits<std::function<FunctionType>> : std::true_type {
420484
};
485+
486+
#if __cplusplus > 201510L
487+
488+
template <typename ReturnType, typename... Args>
489+
struct has_function_traits<ReturnType(Args...) noexcept> : std::true_type {
490+
};
491+
492+
template <typename ReturnType, typename... Args>
493+
struct has_function_traits<ReturnType (*)(Args...) noexcept> : std::true_type {
494+
};
495+
496+
template <typename ReturnType, typename ClassType, typename... Args>
497+
struct has_function_traits<ReturnType (ClassType::*)(Args...) noexcept> : std::true_type {
498+
};
499+
500+
template <typename ReturnType, typename ClassType, typename... Args>
501+
struct has_function_traits<ReturnType (ClassType::*)(Args...) const noexcept>
502+
: std::true_type {
503+
};
504+
505+
template <typename ReturnType, typename ClassType, typename... Args>
506+
struct has_function_traits<ReturnType (ClassType::*)(Args...) volatile noexcept>
507+
: std::true_type {
508+
};
509+
510+
template <typename ReturnType, typename ClassType, typename... Args>
511+
struct has_function_traits<ReturnType (ClassType::*)(Args...) const volatile noexcept>
512+
: std::true_type {
513+
};
514+
515+
template <typename ReturnType, typename ClassType, typename... Args>
516+
struct has_function_traits<ReturnType (ClassType::*)(Args...) & noexcept> : std::true_type {
517+
};
518+
519+
template <typename ReturnType, typename ClassType, typename... Args>
520+
struct has_function_traits<ReturnType (ClassType::*)(Args...) const & noexcept>
521+
: std::true_type {
522+
};
523+
524+
template <typename ReturnType, typename ClassType, typename... Args>
525+
struct has_function_traits<ReturnType (ClassType::*)(Args...) volatile & noexcept>
526+
: std::true_type {
527+
};
528+
529+
template <typename ReturnType, typename ClassType, typename... Args>
530+
struct has_function_traits<ReturnType (ClassType::*)(Args...) const volatile & noexcept>
531+
: std::true_type {
532+
};
533+
534+
template <typename ReturnType, typename ClassType, typename... Args>
535+
struct has_function_traits<ReturnType (ClassType::*)(Args...) && noexcept>
536+
: std::true_type {
537+
};
538+
539+
template <typename ReturnType, typename ClassType, typename... Args>
540+
struct has_function_traits<ReturnType (ClassType::*)(Args...) const && noexcept>
541+
: std::true_type {
542+
};
543+
544+
template <typename ReturnType, typename ClassType, typename... Args>
545+
struct has_function_traits<ReturnType (ClassType::*)(Args...) volatile && noexcept>
546+
: std::true_type {
547+
};
548+
549+
template <typename ReturnType, typename ClassType, typename... Args>
550+
struct has_function_traits<ReturnType (ClassType::*)(Args...) const volatile && noexcept>
551+
: std::true_type {
552+
};
553+
554+
#endif
421555
}
422556
}
423557

include_all_in_one/include/fplus/fplus.hpp

Lines changed: 135 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,15 @@ namespace utils {
404404
};
405405
};
406406

407+
#if __cplusplus > 201510L
408+
409+
template <typename ReturnType, typename... Args>
410+
struct function_traits<ReturnType(Args...) noexcept>
411+
: public function_traits<ReturnType(Args...)> {
412+
};
413+
414+
#endif
415+
407416
template <typename ReturnType, typename... Args>
408417
struct function_traits<ReturnType (*)(Args...)>
409418
: public function_traits<ReturnType(Args...)> {
@@ -433,6 +442,39 @@ namespace utils {
433442
typedef const volatile ClassType& owner_type;
434443
};
435444

445+
#if __cplusplus > 201510L
446+
447+
template <typename ReturnType, typename... Args>
448+
struct function_traits<ReturnType (*)(Args...) noexcept>
449+
: public function_traits<ReturnType(Args...)> {
450+
};
451+
452+
template <typename ClassType, typename ReturnType, typename... Args>
453+
struct function_traits<ReturnType (ClassType::*)(Args...) noexcept>
454+
: public function_traits<ReturnType(Args...)> {
455+
typedef ClassType& owner_type;
456+
};
457+
458+
template <typename ClassType, typename ReturnType, typename... Args>
459+
struct function_traits<ReturnType (ClassType::*)(Args...) const noexcept>
460+
: public function_traits<ReturnType(Args...)> {
461+
typedef const ClassType& owner_type;
462+
};
463+
464+
template <typename ClassType, typename ReturnType, typename... Args>
465+
struct function_traits<ReturnType (ClassType::*)(Args...) volatile noexcept>
466+
: public function_traits<ReturnType(Args...)> {
467+
typedef volatile ClassType& owner_type;
468+
};
469+
470+
template <typename ClassType, typename ReturnType, typename... Args>
471+
struct function_traits<ReturnType (ClassType::*)(Args...) const volatile noexcept>
472+
: public function_traits<ReturnType(Args...)> {
473+
typedef const volatile ClassType& owner_type;
474+
};
475+
476+
#endif
477+
436478
template <typename FunctionType>
437479
struct function_traits<std::function<FunctionType>>
438480
: public function_traits<FunctionType> {
@@ -447,7 +489,7 @@ namespace utils {
447489
#ifdef MEM_FN_SYMBOL_XX0SL7G4Z0J
448490

449491
template <typename R, typename C>
450-
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R C::*>>
492+
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R (C::*)()>>
451493
: public function_traits<R(C*)> {
452494
};
453495
template <typename R, typename C, typename... A>
@@ -466,6 +508,28 @@ namespace utils {
466508
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R (C::*)(A...) const volatile>>
467509
: public function_traits<R(const volatile C*, A...)> {
468510
};
511+
#if __cplusplus > 201510L
512+
template <typename R, typename C>
513+
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R (C::*)() noexcept>>
514+
: public function_traits<R(C*)> {
515+
};
516+
template <typename R, typename C, typename... A>
517+
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R (C::*)(A...) noexcept>>
518+
: public function_traits<R(C*, A...)> {
519+
};
520+
template <typename R, typename C, typename... A>
521+
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R (C::*)(A...) const noexcept>>
522+
: public function_traits<R(const C*, A...)> {
523+
};
524+
template <typename R, typename C, typename... A>
525+
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R (C::*)(A...) volatile noexcept>>
526+
: public function_traits<R(volatile C*, A...)> {
527+
};
528+
template <typename R, typename C, typename... A>
529+
struct function_traits<MEM_FN_SYMBOL_XX0SL7G4Z0J<R (C::*)(A...) const volatile noexcept>>
530+
: public function_traits<R(const volatile C*, A...)> {
531+
};
532+
#endif
469533

470534
#undef MEM_FN_SYMBOL_XX0SL7G4Z0J
471535
#endif
@@ -677,6 +741,76 @@ namespace internal {
677741
template <typename FunctionType>
678742
struct has_function_traits<std::function<FunctionType>> : std::true_type {
679743
};
744+
745+
#if __cplusplus > 201510L
746+
747+
template <typename ReturnType, typename... Args>
748+
struct has_function_traits<ReturnType(Args...) noexcept> : std::true_type {
749+
};
750+
751+
template <typename ReturnType, typename... Args>
752+
struct has_function_traits<ReturnType (*)(Args...) noexcept> : std::true_type {
753+
};
754+
755+
template <typename ReturnType, typename ClassType, typename... Args>
756+
struct has_function_traits<ReturnType (ClassType::*)(Args...) noexcept> : std::true_type {
757+
};
758+
759+
template <typename ReturnType, typename ClassType, typename... Args>
760+
struct has_function_traits<ReturnType (ClassType::*)(Args...) const noexcept>
761+
: std::true_type {
762+
};
763+
764+
template <typename ReturnType, typename ClassType, typename... Args>
765+
struct has_function_traits<ReturnType (ClassType::*)(Args...) volatile noexcept>
766+
: std::true_type {
767+
};
768+
769+
template <typename ReturnType, typename ClassType, typename... Args>
770+
struct has_function_traits<ReturnType (ClassType::*)(Args...) const volatile noexcept>
771+
: std::true_type {
772+
};
773+
774+
template <typename ReturnType, typename ClassType, typename... Args>
775+
struct has_function_traits<ReturnType (ClassType::*)(Args...) & noexcept> : std::true_type {
776+
};
777+
778+
template <typename ReturnType, typename ClassType, typename... Args>
779+
struct has_function_traits<ReturnType (ClassType::*)(Args...) const & noexcept>
780+
: std::true_type {
781+
};
782+
783+
template <typename ReturnType, typename ClassType, typename... Args>
784+
struct has_function_traits<ReturnType (ClassType::*)(Args...) volatile & noexcept>
785+
: std::true_type {
786+
};
787+
788+
template <typename ReturnType, typename ClassType, typename... Args>
789+
struct has_function_traits<ReturnType (ClassType::*)(Args...) const volatile & noexcept>
790+
: std::true_type {
791+
};
792+
793+
template <typename ReturnType, typename ClassType, typename... Args>
794+
struct has_function_traits<ReturnType (ClassType::*)(Args...) && noexcept>
795+
: std::true_type {
796+
};
797+
798+
template <typename ReturnType, typename ClassType, typename... Args>
799+
struct has_function_traits<ReturnType (ClassType::*)(Args...) const && noexcept>
800+
: std::true_type {
801+
};
802+
803+
template <typename ReturnType, typename ClassType, typename... Args>
804+
struct has_function_traits<ReturnType (ClassType::*)(Args...) volatile && noexcept>
805+
: std::true_type {
806+
};
807+
808+
template <typename ReturnType, typename ClassType, typename... Args>
809+
struct has_function_traits<ReturnType (ClassType::*)(Args...) const volatile && noexcept>
810+
: std::true_type {
811+
};
812+
813+
#endif
680814
}
681815
}
682816

0 commit comments

Comments
 (0)