@@ -67,16 +67,17 @@ namespace rtl::detail
6767 inline constexpr const static_method<return_t(args_t ...)> HopFunction<member_kind, args_t...>::returnT() const
6868 {
6969 static_method<return_t (args_t ...)> mth;
70- if (!m_argsTfnMeta. is_empty ())
70+ if (m_fnIndex != rtl::index_none)
7171 {
72- if (m_argsTfnMeta.get_member_kind () != member::Static) {
72+ auto & ty_meta = m_overloadsFnMeta[m_fnIndex];
73+ if (ty_meta.get_member_kind () != member::Static) {
7374 mth.set_init_error (error::InvalidNonStaticMethodCaller);
7475 }
75- else if (m_argsTfnMeta .get_member_kind () == member::Static &&
76- traits::uid<return_t >::value == m_argsTfnMeta .get_return_id ())
76+ else if (ty_meta .get_member_kind () == member::Static &&
77+ traits::uid<return_t >::value == ty_meta .get_return_id ())
7778 {
7879 using function_t = dispatch::function_ptr<return_t , args_t ...>;
79- auto fptr = static_cast <const function_t &>(m_argsTfnMeta .get_functor ()).f_ptr ();
80+ auto fptr = static_cast <const function_t &>(ty_meta .get_functor ()).f_ptr ();
8081 return static_method<return_t (args_t ...)>(fptr);
8182 }
8283 }
@@ -89,24 +90,61 @@ namespace rtl::detail
8990 inline constexpr const function<return_t(args_t ...)> HopFunction<member_kind, args_t...>::returnT() const
9091 {
9192 function<return_t (args_t ...)> fn;
92- if (!m_argsTfnMeta. is_empty () )
93+ if (m_fnIndex != rtl::index_none )
9394 {
94- if (m_argsTfnMeta.get_member_kind () == member::Static)
95+ auto & ty_meta = m_overloadsFnMeta[m_fnIndex];
96+ if (ty_meta.get_member_kind () == member::Static)
9597 {
9698 fn.set_init_error (error::InvalidStaticMethodCaller);
9799 }
98- else if (m_argsTfnMeta .get_member_kind () == member::None &&
99- traits::uid<return_t >::value == m_argsTfnMeta .get_return_id ())
100+ else if (ty_meta .get_member_kind () == member::None &&
101+ traits::uid<return_t >::value == ty_meta .get_return_id ())
100102 {
101103 using function_t = dispatch::function_ptr<return_t , args_t ...>;
102- auto fptr = static_cast <const function_t &>(m_argsTfnMeta .get_functor ()).f_ptr ();
104+ auto fptr = static_cast <const function_t &>(ty_meta .get_functor ()).f_ptr ();
103105 return function<return_t (args_t ...)>(fptr);
104106 }
105107 }
106108 return fn;
107109 }
108110
109111
112+ template <detail::member member_kind>
113+ template <class ...args_t >
114+ inline constexpr const HopFunction<member_kind, args_t ...> Hopper<member_kind>::argsT() const
115+ {
116+ std::vector<rtl::type_meta> fnTyMetas (call_by::ncref);
117+
118+ auto normalId = traits::uid<traits::normal_sign_id_t <args_t ...>>::value;
119+ for (auto & ty_meta : m_functorsMeta)
120+ {
121+ if (normalId == ty_meta.get_normal_args_id ())
122+ {
123+ if (normalId == ty_meta.get_strict_args_id ()) {
124+ fnTyMetas[call_by::value] = ty_meta;
125+ }
126+ else if (!ty_meta.is_any_arg_ncref ()) {
127+ fnTyMetas[call_by::cref] = ty_meta;
128+ }
129+ else fnTyMetas.push_back (ty_meta);
130+ }
131+ }
132+
133+ std::size_t index = rtl::index_none;
134+ auto strictId = traits::uid<traits::strict_sign_id_t <args_t ...>>::value;
135+ for (int i = 0 ; i < fnTyMetas.size (); i++)
136+ {
137+ auto & ty_meta = fnTyMetas[i];
138+ if (!ty_meta.is_empty () && ty_meta.get_strict_args_id () == strictId) {
139+ index = i;
140+ break ;
141+ }
142+ }
143+
144+ return { index, fnTyMetas };
145+ }
146+
147+
110148 template <member member_kind, class ...args_t >
111149 inline void HopFunction<member_kind, args_t ...>::initHopper(function<rtl::Return(args_t ...)>& pHopper) const
112150 {
@@ -156,45 +194,4 @@ namespace rtl::detail
156194 pHopper.get_vhop ().clear ();
157195 }
158196 }
159-
160-
161- template <detail::member member_kind>
162- template <class ...args_t >
163- inline constexpr const HopFunction<member_kind, args_t ...> Hopper<member_kind>::argsT() const
164- {
165- auto strictArgsId = traits::uid<traits::strict_sign_id_t <args_t ...>>::value;
166- auto normalArgsId = traits::uid<traits::normal_sign_id_t <args_t ...>>::value;
167-
168- rtl::type_meta argsTfnMeta;
169- // initializing pos '0' with empty 'type_meta'.
170- std::vector<rtl::type_meta> overloadsFnMeta = { rtl::type_meta () };
171-
172- for (auto & ty_meta : m_functorsMeta)
173- {
174- if (argsTfnMeta.is_empty () && strictArgsId == ty_meta.get_strict_args_id ()) {
175- argsTfnMeta = ty_meta;
176- }
177- if (normalArgsId == ty_meta.get_normal_args_id ())
178- {
179- if (normalArgsId == ty_meta.get_strict_args_id ()) {
180- // same normal & strict ids, means no refs exists in target function's signature
181- // target's function signature is call by value, always at pos '0'.
182- // if doesn't exists, this pos is occupied by an empty 'type_meta'.
183- overloadsFnMeta[0 ] = ty_meta;
184- }
185- else if (!ty_meta.is_any_arg_ncref ()) {
186- // its a const-ref-overload with no non-const-ref in signature, added from pos '1' onwards.
187- overloadsFnMeta.push_back (ty_meta);
188- }
189- }
190- }
191-
192- for (auto & ty_meta : m_functorsMeta) {
193- if (normalArgsId == ty_meta.get_normal_args_id () && ty_meta.is_any_arg_ncref ()) {
194- // any remaining overload, const/non-const ref added from pos '1' onwards.
195- overloadsFnMeta.push_back (ty_meta);
196- }
197- }
198- return { argsTfnMeta, overloadsFnMeta };
199- }
200197}
0 commit comments