@@ -703,38 +703,8 @@ class method<Name, Return(Parameters...), Options...>
703
703
template <auto , typename >
704
704
struct thunk ;
705
705
706
- template <
707
- auto Overrider, typename OverriderReturn,
708
- typename ... OverriderParameters>
709
- struct thunk <Overrider, OverriderReturn (*)(OverriderParameters...)> {
710
- static auto fn (detail::remove_virtual<Parameters>... arg) -> Return;
711
- using OverriderParameterTypeIds = detail::type_id_list<
712
- Policy,
713
- detail::spec_polymorphic_types<
714
- Policy, DeclaredParameters,
715
- detail::types<OverriderParameters...>>>;
716
- };
717
-
718
- template <class Container , bool has_next>
719
- struct override_ ;
720
-
721
706
friend class generator ;
722
707
723
- public:
724
- template <auto Function>
725
- struct override_fn ;
726
-
727
- private:
728
- template <class Container >
729
- struct override_ <Container, false > {
730
- override_fn<Container::fn> override_{nullptr };
731
- };
732
-
733
- template <class Container >
734
- struct override_ <Container, true > {
735
- override_fn<Container::fn> add{&Container::next};
736
- };
737
-
738
708
public:
739
709
// Public aliases.
740
710
using return_type = Return;
@@ -753,9 +723,25 @@ class method<Name, Return(Parameters...), Options...>
753
723
template <class Container >
754
724
using next = detail::next_aux<method, Container>;
755
725
726
+ template <auto >
727
+ static Next next_fn;
728
+
729
+ private:
730
+ template <
731
+ auto Overrider, typename OverriderReturn,
732
+ typename ... OverriderParameters>
733
+ struct thunk <Overrider, OverriderReturn (*)(OverriderParameters...)> {
734
+ static auto fn (detail::remove_virtual<Parameters>... arg) -> Return;
735
+ using OverriderParameterTypeIds = detail::type_id_list<
736
+ Policy,
737
+ detail::spec_polymorphic_types<
738
+ Policy, DeclaredParameters,
739
+ detail::types<OverriderParameters...>>>;
740
+ };
741
+
756
742
template <auto Function>
757
- struct override_fn {
758
- explicit override_fn (Next* next = nullptr ) {
743
+ struct override_fn_impl {
744
+ explicit override_fn_impl (Next* next = &next_fn<Function> ) {
759
745
static detail::definition_info info;
760
746
761
747
if (info.method ) {
@@ -774,25 +760,72 @@ class method<Name, Return(Parameters...), Options...>
774
760
}
775
761
};
776
762
777
- template <class Container >
778
- struct override
779
- : override_<Container, detail::has_next<Container>::value> {
780
- using type = override ; // make it a meta-function
763
+ template <auto Function, typename FunctionType>
764
+ struct override_fn_aux ;
765
+
766
+ template <auto Function, typename FnReturnType, typename ... FnParameters>
767
+ struct override_fn_aux <Function, FnReturnType (*)(FnParameters...)> : override_fn_impl<Function>{
768
+ using override_fn_impl<Function>::override_fn_impl;
781
769
};
782
770
783
- template <auto F>
784
- struct add_member_function
785
- : override_fn<detail::member_function_thunk<F, decltype (F)>::fn> {};
771
+ template <
772
+ auto Function, class FnClass , typename FnReturnType,
773
+ typename ... FnParameters>
774
+ struct override_fn_aux <
775
+ Function, FnReturnType (FnClass::*)(FnParameters...)> {
776
+ static auto fn (FnClass* this_, FnParameters&&... args) -> FnReturnType {
777
+ return (this_->*Function)(std::forward<FnParameters>(args)...);
778
+ }
779
+
780
+ override_fn_impl<fn> impl{&next_fn<Function>};
781
+ };
782
+
783
+ public:
784
+ template <auto Function>
785
+ struct override_fn : override_fn_aux<Function, decltype (Function)> {
786
+ using override_fn_aux<Function, decltype (Function)>::override_fn_aux;
787
+ };
786
788
787
789
template <auto ... F>
788
- struct add_member_functions : std::tuple<add_member_function<F>...> {};
790
+ struct override_fns {
791
+ std::tuple<override_fn<F>...> fns;
792
+ };
793
+
794
+ private:
795
+ template <class Container , bool HasNext>
796
+ struct override_aux ;
797
+
798
+ template <class Container >
799
+ struct override_aux <Container, false > : override_fn<Container::fn> {
800
+ override_aux () : override_fn<Container::fn>(nullptr ) {
801
+ }
802
+ };
803
+
804
+ template <class Container >
805
+ struct override_aux <Container, true > : override_fn<Container::fn> {
806
+ override_aux () : override_fn<Container::fn>(&Container::next) {
807
+ }
808
+ };
809
+
810
+ public:
811
+ template <class Container >
812
+ struct override
813
+ : override_aux<Container, detail::has_next<Container>::value> {
814
+ using type = override ; // make it a meta-function
815
+ };
789
816
};
790
817
791
818
template <
792
819
typename Name, typename Return, typename ... Parameters, class ... Options>
793
820
method<Name, Return(Parameters...), Options...>
794
821
method<Name, Return(Parameters...), Options...>::fn;
795
822
823
+ template <
824
+ typename Name, typename Return, typename ... Parameters, class ... Options>
825
+ template <auto >
826
+ typename method<Name, Return(Parameters...), Options...>::Next
827
+ method<Name, Return(Parameters...), Options...>::next_fn;
828
+
796
829
template <typename T>
797
830
constexpr bool is_method = std::is_base_of_v<detail::method_info, T>;
798
831
0 commit comments