Skip to content

Commit f806fb1

Browse files
committed
make method_info base private
1 parent baff0d3 commit f806fb1

File tree

3 files changed

+84
-69
lines changed

3 files changed

+84
-69
lines changed

include/boost/openmethod/compiler.hpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,23 @@ struct compiler : detail::generic_compiler {
267267
static constexpr bool trace_enabled =
268268
Registry::template has_policy<policies::trace>;
269269
using indent = typename detail::trace_type<Registry>::indent;
270+
271+
template<typename Id, typename Signature>
272+
const method*
273+
operator[](const openmethod::method<Id, Signature, Registry>& fn) const {
274+
auto type_id = Registry::rtti::template static_type<
275+
openmethod::method<Id, Signature, Registry>>();
276+
auto iter = std::find_if(
277+
methods.begin(), methods.end(), [type_id](const method& m) {
278+
return m.info->method_type_id == type_id;
279+
});
280+
281+
if (iter != methods.end()) {
282+
return &*iter;
283+
}
284+
285+
return nullptr;
286+
}
270287
};
271288

272289
compiler() -> compiler<default_registry>;

include/boost/openmethod/core.hpp

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -987,14 +987,14 @@ struct valid_method_parameter<virtual_<T>, Registry>
987987
} // namespace detail
988988

989989
template<
990-
typename Method, typename ReturnType,
990+
typename Name, typename ReturnType,
991991
class Registry = BOOST_OPENMETHOD_DEFAULT_REGISTRY>
992992
class method;
993993

994994
template<
995995
typename Name, typename... Parameters, typename ReturnType, class Registry>
996-
class method<Name, auto(Parameters...)->ReturnType, Registry>
997-
: public std::conditional_t<
996+
class method<Name, ReturnType(Parameters...), Registry>
997+
: std::conditional_t<
998998
Registry::deferred_static_rtti, detail::deferred_method_info,
999999
detail::method_info> {
10001000
// Aliases used in implementation only. Everything extracted from template
@@ -1065,7 +1065,8 @@ class method<Name, auto(Parameters...)->ReturnType, Registry>
10651065
template<auto, typename>
10661066
struct thunk;
10671067

1068-
friend class generator;
1068+
template<auto, typename>
1069+
struct thunk;
10691070

10701071
method();
10711072
method(const method&) = delete;
@@ -1170,22 +1171,22 @@ class method<Name, auto(Parameters...)->ReturnType, Registry>
11701171

11711172
template<
11721173
typename Name, typename... Parameters, typename ReturnType, class Registry>
1173-
method<Name, auto(Parameters...)->ReturnType, Registry>
1174-
method<Name, auto(Parameters...)->ReturnType, Registry>::fn;
1174+
method<Name, ReturnType(Parameters...), Registry>
1175+
method<Name, ReturnType(Parameters...), Registry>::fn;
11751176

11761177
template<
11771178
typename Name, typename... Parameters, typename ReturnType, class Registry>
11781179
template<auto>
11791180
typename method<
1180-
Name, auto(Parameters...)->ReturnType, Registry>::FunctionPointer
1181-
method<Name, auto(Parameters...)->ReturnType, Registry>::next;
1181+
Name, ReturnType(Parameters...), Registry>::FunctionPointer
1182+
method<Name, ReturnType(Parameters...), Registry>::next;
11821183

11831184
template<typename T>
11841185
constexpr bool is_method = std::is_base_of_v<detail::method_info, T>;
11851186

11861187
template<
11871188
typename Name, typename... Parameters, typename ReturnType, class Registry>
1188-
method<Name, auto(Parameters...)->ReturnType, Registry>::method() {
1189+
method<Name, ReturnType(Parameters...), Registry>::method() {
11891190
this->slots_strides_ptr = slots_strides;
11901191

11911192
if constexpr (!Registry::deferred_static_rtti) {
@@ -1208,7 +1209,7 @@ method<Name, auto(Parameters...)->ReturnType, Registry>::method() {
12081209
template<
12091210
typename Name, typename... Parameters, typename ReturnType, class Registry>
12101211
void method<
1211-
Name, auto(Parameters...)->ReturnType, Registry>::resolve_type_ids() {
1212+
Name, ReturnType(Parameters...), Registry>::resolve_type_ids() {
12121213
using namespace detail;
12131214
this->method_type_id = rtti::template static_type<method>();
12141215
this->return_type_id = rtti::template static_type<
@@ -1222,19 +1223,19 @@ void method<
12221223

12231224
template<
12241225
typename Name, typename... Parameters, typename ReturnType, class Registry>
1225-
std::size_t method<Name, auto(Parameters...)->ReturnType, Registry>::
1226+
std::size_t method<Name, ReturnType(Parameters...), Registry>::
12261227
slots_strides[2 * Arity - 1];
12271228

12281229
template<
12291230
typename Name, typename... Parameters, typename ReturnType, class Registry>
1230-
method<Name, auto(Parameters...)->ReturnType, Registry>::~method() {
1231+
method<Name, ReturnType(Parameters...), Registry>::~method() {
12311232
Registry::methods.remove(*this);
12321233
}
12331234

12341235
template<
12351236
typename Name, typename... Parameters, typename ReturnType, class Registry>
12361237
template<class Error>
1237-
auto method<Name, auto(Parameters...)->ReturnType, Registry>::
1238+
auto method<Name, ReturnType(Parameters...), Registry>::
12381239
check_static_offset(std::size_t actual, std::size_t expected) const
12391240
-> void {
12401241
using namespace detail;
@@ -1260,7 +1261,7 @@ auto method<Name, auto(Parameters...)->ReturnType, Registry>::
12601261
template<
12611262
typename Name, typename... Parameters, typename ReturnType, class Registry>
12621263
BOOST_FORCEINLINE auto
1263-
method<Name, auto(Parameters...)->ReturnType, Registry>::operator()(
1264+
method<Name, ReturnType(Parameters...), Registry>::operator()(
12641265
detail::remove_virtual<Parameters>... args) const -> ReturnType {
12651266
using namespace detail;
12661267
auto pf = resolve(parameter_traits<Parameters, Registry>::peek(args)...);
@@ -1272,8 +1273,8 @@ template<
12721273
typename Name, typename... Parameters, typename ReturnType, class Registry>
12731274
template<typename... ArgType>
12741275
BOOST_FORCEINLINE typename method<
1275-
Name, auto(Parameters...)->ReturnType, Registry>::FunctionPointer
1276-
method<Name, auto(Parameters...)->ReturnType, Registry>::resolve(
1276+
Name, ReturnType(Parameters...), Registry>::FunctionPointer
1277+
method<Name, ReturnType(Parameters...), Registry>::resolve(
12771278
const ArgType&... args) const {
12781279
using namespace detail;
12791280

@@ -1296,7 +1297,7 @@ template<
12961297
typename Name, typename... Parameters, typename ReturnType, class Registry>
12971298
template<typename ArgType>
12981299
BOOST_FORCEINLINE auto
1299-
method<Name, auto(Parameters...)->ReturnType, Registry>::vptr(
1300+
method<Name, ReturnType(Parameters...), Registry>::vptr(
13001301
const ArgType& arg) const -> vptr_type {
13011302
if constexpr (detail::is_virtual_ptr<ArgType>) {
13021303
return arg.vptr();
@@ -1309,7 +1310,7 @@ template<
13091310
typename Name, typename... Parameters, typename ReturnType, class Registry>
13101311
template<typename MethodArgList, typename ArgType, typename... MoreArgTypes>
13111312
BOOST_FORCEINLINE auto
1312-
method<Name, auto(Parameters...)->ReturnType, Registry>::resolve_uni(
1313+
method<Name, ReturnType(Parameters...), Registry>::resolve_uni(
13131314
const ArgType& arg, const MoreArgTypes&... more_args) const
13141315
-> detail::word {
13151316

@@ -1338,7 +1339,7 @@ template<
13381339
typename Name, typename... Parameters, typename ReturnType, class Registry>
13391340
template<typename MethodArgList, typename ArgType, typename... MoreArgTypes>
13401341
BOOST_FORCEINLINE auto
1341-
method<Name, auto(Parameters...)->ReturnType, Registry>::resolve_multi_first(
1342+
method<Name, ReturnType(Parameters...), Registry>::resolve_multi_first(
13421343
const ArgType& arg, const MoreArgTypes&... more_args) const
13431344
-> detail::word {
13441345

@@ -1379,7 +1380,7 @@ template<
13791380
std::size_t VirtualArg, typename MethodArgList, typename ArgType,
13801381
typename... MoreArgTypes>
13811382
BOOST_FORCEINLINE auto
1382-
method<Name, auto(Parameters...)->ReturnType, Registry>::resolve_multi_next(
1383+
method<Name, ReturnType(Parameters...), Registry>::resolve_multi_next(
13831384
vptr_type dispatch, const ArgType& arg,
13841385
const MoreArgTypes&... more_args) const -> detail::word {
13851386

@@ -1423,7 +1424,7 @@ method<Name, auto(Parameters...)->ReturnType, Registry>::resolve_multi_next(
14231424
template<
14241425
typename Name, typename... Parameters, typename ReturnType, class Registry>
14251426
template<auto Fn>
1426-
inline auto method<Name, auto(Parameters...)->ReturnType, Registry>::has_next()
1427+
inline auto method<Name, ReturnType(Parameters...), Registry>::has_next()
14271428
-> bool {
14281429
if (next<Fn> == fn_not_implemented) {
14291430
return false;
@@ -1441,7 +1442,7 @@ inline auto method<Name, auto(Parameters...)->ReturnType, Registry>::has_next()
14411442
template<
14421443
typename Name, typename... Parameters, typename ReturnType, class Registry>
14431444
BOOST_NORETURN auto
1444-
method<Name, auto(Parameters...)->ReturnType, Registry>::fn_not_implemented(
1445+
method<Name, ReturnType(Parameters...), Registry>::fn_not_implemented(
14451446
detail::remove_virtual<Parameters>... args) -> ReturnType {
14461447
if constexpr (Registry::template has_policy<policies::error_handler>) {
14471448
not_implemented_error error;
@@ -1457,7 +1458,7 @@ method<Name, auto(Parameters...)->ReturnType, Registry>::fn_not_implemented(
14571458
template<
14581459
typename Name, typename... Parameters, typename ReturnType, class Registry>
14591460
BOOST_NORETURN auto
1460-
method<Name, auto(Parameters...)->ReturnType, Registry>::fn_ambiguous(
1461+
method<Name, ReturnType(Parameters...), Registry>::fn_ambiguous(
14611462
detail::remove_virtual<Parameters>... args) -> ReturnType {
14621463
if constexpr (Registry::template has_policy<policies::error_handler>) {
14631464
ambiguous_error error;
@@ -1483,7 +1484,7 @@ template<
14831484
typename Name, typename... Parameters, typename ReturnType, class Registry>
14841485
template<
14851486
auto Overrider, typename OverriderReturn, typename... OverriderParameters>
1486-
auto method<Name, auto(Parameters...)->ReturnType, Registry>::
1487+
auto method<Name, ReturnType(Parameters...), Registry>::
14871488
thunk<Overrider, OverriderReturn (*)(OverriderParameters...)>::fn(
14881489
detail::remove_virtual<Parameters>... arg) -> ReturnType {
14891490
using namespace detail;
@@ -1555,7 +1556,7 @@ method<Name, ReturnType(Parameters...), Registry>::override_impl<
15551556
template<
15561557
typename Name, typename... Parameters, typename ReturnType, class Registry>
15571558
template<auto Function, typename FnReturnType>
1558-
void method<Name, auto(Parameters...)->ReturnType, Registry>::override_impl<
1559+
void method<Name, ReturnType(Parameters...), Registry>::override_impl<
15591560
Function, FnReturnType>::resolve_type_ids() {
15601561
using namespace detail;
15611562

test/test_compiler.cpp

Lines changed: 41 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -197,18 +197,15 @@ BOOST_AUTO_TEST_CASE(test_use_classes_diamond) {
197197
/// ============================================================================
198198
// Test assign_slots.
199199

200-
template<typename Compiler>
201-
auto get_method(const Compiler& comp, const detail::method_info& info) -> const
202-
auto& {
203-
for (const auto& m : comp.methods) {
204-
if (m.info == &info) {
205-
return m;
206-
}
200+
auto check(const detail::generic_compiler::method* method)
201+
-> const detail::generic_compiler::method* {
202+
if (method) {
203+
return method;
207204
}
208205

209206
BOOST_FAIL("method not found");
210207

211-
return comp.methods.front();
208+
return nullptr;
212209
}
213210

214211
template<int>
@@ -244,8 +241,8 @@ BOOST_AUTO_TEST_CASE(test_assign_slots_a_b1_c) {
244241

245242
auto comp = initialize<test_registry>();
246243

247-
BOOST_TEST_REQUIRE(get_method(comp, m_B).slots.size() == 1u);
248-
BOOST_TEST(get_method(comp, m_B).slots[0] == 0u);
244+
BOOST_TEST_REQUIRE(check(comp[m_B])->slots.size() == 1u);
245+
BOOST_TEST(check(comp[m_B])->slots[0] == 0u);
249246
BOOST_TEST(get_class<A>(comp)->vtbl.size() == 0u);
250247
BOOST_TEST(get_class<B>(comp)->vtbl.size() == 1u);
251248
BOOST_TEST(get_class<C>(comp)->vtbl.size() == 0u);
@@ -274,16 +271,16 @@ BOOST_AUTO_TEST_CASE(test_assign_slots_a1_b1_c1) {
274271
ADD_METHOD(C);
275272
auto comp = initialize<test_registry>();
276273

277-
BOOST_TEST_REQUIRE(get_method(comp, m_A).slots.size() == 1u);
278-
BOOST_TEST(get_method(comp, m_A).slots[0] == 0u);
274+
BOOST_TEST_REQUIRE(check(comp[m_A])->slots.size() == 1u);
275+
BOOST_TEST(check(comp[m_A])->slots[0] == 0u);
279276
BOOST_TEST(get_class<A>(comp)->vtbl.size() == 1u);
280277

281-
BOOST_TEST_REQUIRE(get_method(comp, m_B).slots.size() == 1u);
282-
BOOST_TEST(get_method(comp, m_B).slots[0] == 1u);
278+
BOOST_TEST_REQUIRE(check(comp[m_B])->slots.size() == 1u);
279+
BOOST_TEST(check(comp[m_B])->slots[0] == 1u);
283280
BOOST_TEST(get_class<B>(comp)->vtbl.size() == 2u);
284281

285-
BOOST_TEST_REQUIRE(get_method(comp, m_C).slots.size() == 1u);
286-
BOOST_TEST(get_method(comp, m_C).slots[0] == 1u);
282+
BOOST_TEST_REQUIRE(check(comp[m_C])->slots.size() == 1u);
283+
BOOST_TEST(check(comp[m_C])->slots[0] == 1u);
287284
BOOST_TEST(get_class<C>(comp)->vtbl.size() == 2u);
288285
}
289286

@@ -315,20 +312,20 @@ BOOST_AUTO_TEST_CASE(test_assign_slots_a1_b1_d1_c1_d1) {
315312
ADD_METHOD(D);
316313
auto comp = initialize<test_registry>();
317314

318-
BOOST_TEST_REQUIRE(get_method(comp, m_A).slots.size() == 1u);
319-
BOOST_TEST(get_method(comp, m_A).slots[0] == 0u);
315+
BOOST_TEST_REQUIRE(check(comp[m_A])->slots.size() == 1u);
316+
BOOST_TEST(check(comp[m_A])->slots[0] == 0u);
320317
BOOST_TEST(get_class<A>(comp)->vtbl.size() == 1u);
321318

322-
BOOST_TEST_REQUIRE(get_method(comp, m_B).slots.size() == 1u);
323-
BOOST_TEST(get_method(comp, m_B).slots[0] == 1u);
319+
BOOST_TEST_REQUIRE(check(comp[m_B])->slots.size() == 1u);
320+
BOOST_TEST(check(comp[m_B])->slots[0] == 1u);
324321
BOOST_TEST(get_class<B>(comp)->vtbl.size() == 2u);
325322

326-
BOOST_TEST_REQUIRE(get_method(comp, m_D).slots.size() == 1u);
327-
BOOST_TEST(get_method(comp, m_D).slots[0] == 2u);
323+
BOOST_TEST_REQUIRE(check(comp[m_D])->slots.size() == 1u);
324+
BOOST_TEST(check(comp[m_D])->slots[0] == 2u);
328325
BOOST_TEST(get_class<D>(comp)->vtbl.size() == 4u);
329326

330-
BOOST_TEST_REQUIRE(get_method(comp, m_C).slots.size() == 1u);
331-
BOOST_TEST(get_method(comp, m_C).slots[0] == 3u);
327+
BOOST_TEST_REQUIRE(check(comp[m_C])->slots.size() == 1u);
328+
BOOST_TEST(check(comp[m_C])->slots[0] == 3u);
332329
BOOST_TEST(get_class<C>(comp)->vtbl.size() == 4u);
333330
// slots 0-2 in C are wasted, to make room for methods in B and D
334331
}
@@ -366,31 +363,31 @@ BOOST_AUTO_TEST_CASE(test_assign_slots_a1_b1_d1_c1_d1_e2) {
366363
ADD_METHOD_N(E, 3);
367364
auto comp = initialize<test_registry>();
368365

369-
BOOST_TEST_REQUIRE(get_method(comp, m_A).slots.size() == 1u);
370-
BOOST_TEST(get_method(comp, m_A).slots[0] == 0u);
366+
BOOST_TEST_REQUIRE(check(comp[m_A])->slots.size() == 1u);
367+
BOOST_TEST(check(comp[m_A])->slots[0] == 0u);
371368
BOOST_TEST(get_class<A>(comp)->vtbl.size() == 1u);
372369

373-
BOOST_TEST_REQUIRE(get_method(comp, m_B).slots.size() == 1u);
374-
BOOST_TEST(get_method(comp, m_B).slots[0] == 1u);
370+
BOOST_TEST_REQUIRE(check(comp[m_B])->slots.size() == 1u);
371+
BOOST_TEST(check(comp[m_B])->slots[0] == 1u);
375372
BOOST_TEST(get_class<B>(comp)->vtbl.size() == 2u);
376373

377-
BOOST_TEST_REQUIRE(get_method(comp, m_D).slots.size() == 1u);
378-
BOOST_TEST(get_method(comp, m_D).slots[0] == 2u);
374+
BOOST_TEST_REQUIRE(check(comp[m_D])->slots.size() == 1u);
375+
BOOST_TEST(check(comp[m_D])->slots[0] == 2u);
379376
BOOST_TEST(get_class<D>(comp)->vtbl.size() == 4u);
380377

381-
BOOST_TEST_REQUIRE(get_method(comp, m_C).slots.size() == 1u);
382-
BOOST_TEST(get_method(comp, m_C).slots[0] == 3u);
378+
BOOST_TEST_REQUIRE(check(comp[m_C])->slots.size() == 1u);
379+
BOOST_TEST(check(comp[m_C])->slots[0] == 3u);
383380
BOOST_TEST(get_class<C>(comp)->vtbl.size() == 4u);
384381
// slots 0-2 in C are wasted, to make room for methods in B and D
385382

386-
BOOST_TEST_REQUIRE(get_method(comp, m_E1).slots.size() == 1u);
387-
BOOST_TEST(get_method(comp, m_E1).slots[0] == 1u);
383+
BOOST_TEST_REQUIRE(check(comp[m_E1])->slots.size() == 1u);
384+
BOOST_TEST(check(comp[m_E1])->slots[0] == 1u);
388385

389-
BOOST_TEST_REQUIRE(get_method(comp, m_E2).slots.size() == 1u);
390-
BOOST_TEST(get_method(comp, m_E2).slots[0] == 2u);
386+
BOOST_TEST_REQUIRE(check(comp[m_E2])->slots.size() == 1u);
387+
BOOST_TEST(check(comp[m_E2])->slots[0] == 2u);
391388

392-
BOOST_TEST_REQUIRE(get_method(comp, m_E3).slots.size() == 1u);
393-
BOOST_TEST(get_method(comp, m_E3).slots[0] == 4u);
389+
BOOST_TEST_REQUIRE(check(comp[m_E3])->slots.size() == 1u);
390+
BOOST_TEST(check(comp[m_E3])->slots[0] == 4u);
394391

395392
BOOST_TEST(get_class<E>(comp)->vtbl.size() == 5u);
396393
}
@@ -420,16 +417,16 @@ BOOST_AUTO_TEST_CASE(test_assign_slots_a1_c1_b1) {
420417
ADD_METHOD(C);
421418
auto comp = initialize<test_registry>();
422419

423-
BOOST_TEST_REQUIRE(get_method(comp, m_A).slots.size() == 1u);
424-
BOOST_TEST(get_method(comp, m_A).slots[0] == 0u);
420+
BOOST_TEST_REQUIRE(check(comp[m_A])->slots.size() == 1u);
421+
BOOST_TEST(check(comp[m_A])->slots[0] == 0u);
425422
BOOST_TEST(get_class<A>(comp)->vtbl.size() == 1u);
426423

427-
BOOST_TEST_REQUIRE(get_method(comp, m_C).slots.size() == 1u);
428-
BOOST_TEST(get_method(comp, m_C).slots[0] == 1u);
424+
BOOST_TEST_REQUIRE(check(comp[m_C])->slots.size() == 1u);
425+
BOOST_TEST(check(comp[m_C])->slots[0] == 1u);
429426
BOOST_TEST(get_class<C>(comp)->vtbl.size() == 3u);
430427

431-
BOOST_TEST_REQUIRE(get_method(comp, m_B).slots.size() == 1u);
432-
BOOST_TEST(get_method(comp, m_B).slots[0] == 2u);
428+
BOOST_TEST_REQUIRE(check(comp[m_B])->slots.size() == 1u);
429+
BOOST_TEST(check(comp[m_B])->slots[0] == 2u);
433430
BOOST_TEST(get_class<B>(comp)->first_slot == 2u);
434431
BOOST_TEST(get_class<B>(comp)->vtbl.size() == 1u);
435432
}

0 commit comments

Comments
 (0)