From 3dc4d99722e50942b5eb7dd1fef3beacd72849a5 Mon Sep 17 00:00:00 2001 From: Bartosz Wieczorek Date: Mon, 12 Mar 2018 07:45:01 +0100 Subject: [PATCH] cleanup --- benchmarks/CMakeLists.txt | 20 - benchmarks/bench_signal.cpp | 62 - benchmarks/main.cpp | 3 - share/dyno.hpp | 16 - share/dyno/builtin.hpp | 134 - share/dyno/concept.hpp | 162 - share/dyno/concept_map.hpp | 285 - share/dyno/detail/bind_signature.hpp | 57 - share/dyno/detail/dsl.hpp | 146 - share/dyno/detail/empty_object.hpp | 86 - share/dyno/detail/erase_function.hpp | 73 - share/dyno/detail/erase_signature.hpp | 41 - share/dyno/detail/eraser_traits.hpp | 148 - share/dyno/detail/has_duplicates.hpp | 30 - share/dyno/detail/is_placeholder.hpp | 30 - share/dyno/detail/macro.hpp.erb | 124 - share/dyno/detail/preprocessor.hpp | 31 - share/dyno/detail/transform_signature.hpp | 30 - share/dyno/experimental/unrolled_vtable.hpp | 69 - share/dyno/experimental/vtable.hpp | 103 - share/dyno/macro.hpp | 7552 ----------------- share/dyno/poly.hpp | 260 - share/dyno/storage.hpp | 662 -- share/dyno/vtable.hpp | 415 - sql/schema.sql | 2 +- .../include/eedb/db/pg/PgItemsRepository.hpp | 2 +- .../include/eedb/db/pg/model/all.hpp | 20 +- .../include/eedb/db/pg/model/auth_identity.h | 7 +- .../include/eedb/db/pg/model/auth_info.h | 7 +- .../include/eedb/db/pg/model/auth_token.h | 6 +- .../include/eedb/db/pg/model/category.h | 6 +- .../include/eedb/db/pg/model/category_items.h | 6 +- .../include/eedb/db/pg/model/group.h | 8 +- .../include/eedb/db/pg/model/item.h | 6 +- .../include/eedb/db/pg/model/parameter.h | 7 +- .../include/eedb/db/pg/model/stat.h | 6 +- .../include/eedb/db/pg/model/system_info.h | 7 +- .../include/eedb/db/pg/model/unit.h | 397 +- .../include/eedb/db/pg/model/user_audit.h | 6 +- .../eedb/db/pg/model/user_audit_action.h | 6 +- .../include/eedb/mock/db/pg/CategoryMock.hpp | 9 +- .../src/data/PgAuthIdentity.cpp | 2 +- .../src/data/PgAuthToken.cpp | 2 +- .../src/data/PgItemsRepository.cpp | 6 +- .../postgresql_connector/src/data/PgUsers.cpp | 6 +- .../test/test_eedb_data_PgItemsRepository.cpp | 31 +- src/libs/eedb/include/eedb/Value.hpp | 11 +- src/libs/eedb/include/eedb/db/Item.hpp | 3 +- src/libs/eedb/test/test_Value.cpp | 12 +- tests/CMakeLists.txt | 4 - tests/mocks/SessionMock.hpp | 19 - tests/mocks/db/UserDatabaseMock.hpp | 11 - tests/mocks/widgets/AuthPageMock.hpp | 21 - tests/mocks/widgets/MainPageMock.hpp | 12 - tests/mocks/widgets/NavigationBarMock.hpp | 17 - tests/unit/CMakeLists.txt | 28 - tests/unit/WidgetTest.hpp | 27 - tests/unit/main.cpp | 11 - tests/unit/test_eedb_CategoriesTree.cpp | 22 - tests/unit/test_eedb_DefaultAuthPage.cpp | 83 - tests/unit/test_eedb_DefaultHomePage.cpp | 27 - tests/unit/test_eedb_DefaultNavigationBar.cpp | 47 - tests/unit/test_eedb_Item.cpp | 0 tests/unit/test_eedb_Items.cpp | 0 tests/unit/test_eedb_application.cpp | 93 - tests/utils/CMakeLists.txt | 1 - 66 files changed, 303 insertions(+), 11240 deletions(-) delete mode 100644 benchmarks/CMakeLists.txt delete mode 100644 benchmarks/bench_signal.cpp delete mode 100644 benchmarks/main.cpp delete mode 100644 share/dyno.hpp delete mode 100644 share/dyno/builtin.hpp delete mode 100644 share/dyno/concept.hpp delete mode 100644 share/dyno/concept_map.hpp delete mode 100644 share/dyno/detail/bind_signature.hpp delete mode 100644 share/dyno/detail/dsl.hpp delete mode 100644 share/dyno/detail/empty_object.hpp delete mode 100644 share/dyno/detail/erase_function.hpp delete mode 100644 share/dyno/detail/erase_signature.hpp delete mode 100644 share/dyno/detail/eraser_traits.hpp delete mode 100644 share/dyno/detail/has_duplicates.hpp delete mode 100644 share/dyno/detail/is_placeholder.hpp delete mode 100644 share/dyno/detail/macro.hpp.erb delete mode 100644 share/dyno/detail/preprocessor.hpp delete mode 100644 share/dyno/detail/transform_signature.hpp delete mode 100644 share/dyno/experimental/unrolled_vtable.hpp delete mode 100644 share/dyno/experimental/vtable.hpp delete mode 100644 share/dyno/macro.hpp delete mode 100644 share/dyno/poly.hpp delete mode 100644 share/dyno/storage.hpp delete mode 100644 share/dyno/vtable.hpp delete mode 100644 tests/CMakeLists.txt delete mode 100644 tests/mocks/SessionMock.hpp delete mode 100644 tests/mocks/db/UserDatabaseMock.hpp delete mode 100644 tests/mocks/widgets/AuthPageMock.hpp delete mode 100644 tests/mocks/widgets/MainPageMock.hpp delete mode 100644 tests/mocks/widgets/NavigationBarMock.hpp delete mode 100644 tests/unit/CMakeLists.txt delete mode 100644 tests/unit/WidgetTest.hpp delete mode 100644 tests/unit/main.cpp delete mode 100644 tests/unit/test_eedb_CategoriesTree.cpp delete mode 100644 tests/unit/test_eedb_DefaultAuthPage.cpp delete mode 100644 tests/unit/test_eedb_DefaultHomePage.cpp delete mode 100644 tests/unit/test_eedb_DefaultNavigationBar.cpp delete mode 100644 tests/unit/test_eedb_Item.cpp delete mode 100644 tests/unit/test_eedb_Items.cpp delete mode 100644 tests/unit/test_eedb_application.cpp delete mode 100644 tests/utils/CMakeLists.txt diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt deleted file mode 100644 index 90f8931..0000000 --- a/benchmarks/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -cmake_minimum_required(VERSION 3.0.2) - -project(Benchmarks LANGUAGES CXX) - -include_directories( . ) -include_directories( ${eedb_app_SOURCE_DIR} ) -include_directories( ../share ) -include_directories( ${benchmarks_SOURCE_DIR}/include) - - -set(TEST_EXECUTABLE_NAME eedb_benchmarks ) - -#add test files -file(GLOB_RECURSE TEST_FILES *.cpp ) -INCLUDE_DIRECTORIES(${PostgreSQL_INCLUDE_DIRS}) -add_executable( ${TEST_EXECUTABLE_NAME} ${TEST_FILES}) - -target_link_libraries( ${TEST_EXECUTABLE_NAME} benchmark wt wttest eedb_db auth ${Boost_LIBRARIES} ) - -add_test( ${TEST_EXECUTABLE_NAME} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TEST_EXECUTABLE_NAME}) diff --git a/benchmarks/bench_signal.cpp b/benchmarks/bench_signal.cpp deleted file mode 100644 index 74a6fc7..0000000 --- a/benchmarks/bench_signal.cpp +++ /dev/null @@ -1,62 +0,0 @@ -//#include - -//#include - -//class AuthWithDifferentSignals final : public eedb::AuthPage { -// // AuthPage interface -// public: -// void setParent(Wt::WContainerWidget * parent) override {} -// void detachFrom(Wt::WContainerWidget * parent) override {} -// void processEnvironment() override {} -// void registerNeedVerification(std::function< void() > f) override { -// _callbacks[0] = f; -// } -// void registerOnUserWeakLogin(std::function< void() > f) override { -// _callbacks[1] = f; -// } -// void registerOnUserStrongLogin(std::function< void() > f) override { -// _callbacks[2] = f; -// } -// void registerOnUserLogout(std::function< void() > f) override { -// _callbacks[3] = f; -// } - -// // protected: -// void notifyUserStrongLogin() const override { -// _callbacks[0](); -// } -// void notifyUserWeakLogin() const override { -// _callbacks[1](); -// } -// void notifyNeedEmailVerification() const override { -// _callbacks[0](); -// } -// void notifyUserLogout() const override { -// _callbacks[3](); -// } - -// private: -// std::array< std::function< void() >, 4 > _callbacks; -//}; - -//#include - -//static void BoostSignals(benchmark::State & state) { -// eedb::AuthPageImpl sut; -// auto callback = []() {}; -// sut.registerNeedVerification(callback); -// while(state.KeepRunning()) { -// sut.notifyNeedEmailVerification(); -// } -//} - -//static void TableBasedSignals(benchmark::State & state) { -// AuthWithDifferentSignals sut; -// auto callback = []() {}; -// sut.registerNeedVerification(callback); -// while(state.KeepRunning()) { -// sut.notifyNeedEmailVerification(); -// } -//} -//BENCHMARK(BoostSignals); -//BENCHMARK(TableBasedSignals); diff --git a/benchmarks/main.cpp b/benchmarks/main.cpp deleted file mode 100644 index 15e56f3..0000000 --- a/benchmarks/main.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include - -BENCHMARK_MAIN() diff --git a/share/dyno.hpp b/share/dyno.hpp deleted file mode 100644 index 88aa5af..0000000 --- a/share/dyno.hpp +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_HPP -#define DYNO_HPP - -#include -#include -#include -#include -#include -#include -#include - -#endif // DYNO_HPP diff --git a/share/dyno/builtin.hpp b/share/dyno/builtin.hpp deleted file mode 100644 index 1916647..0000000 --- a/share/dyno/builtin.hpp +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_BUILTIN_HPP -#define DYNO_BUILTIN_HPP - -#include -#include - -#include -#include -#include - - -namespace dyno { - -// Encapsulates the minimal amount of information required to allocate -// storage for an object of a given type. -// -// This should never be created explicitly; always use `dyno::storage_info_for`. -struct storage_info { - std::size_t size; - std::size_t alignment; -}; - -template -constexpr auto storage_info_for = storage_info{sizeof(T), alignof(T)}; - -struct Storable : decltype(dyno::requires( - "storage_info"_s = dyno::function -)) { }; - -template -auto const default_concept_map = dyno::make_concept_map( - "storage_info"_s = []() { return dyno::storage_info_for; } -); - - -struct TypeId : decltype(dyno::requires( - "typeid"_s = dyno::function -)) { }; - -template -auto const default_concept_map = dyno::make_concept_map( - "typeid"_s = []() -> std::type_info const& { return typeid(T); } -); - - -struct DefaultConstructible : decltype(dyno::requires( - "default-construct"_s = dyno::function -)) { }; - -template -auto const default_concept_map::value> -> = dyno::make_concept_map( - "default-construct"_s = [](void* p) { - new (p) T(); - } -); - - -struct MoveConstructible : decltype(dyno::requires( - "move-construct"_s = dyno::function -)) { }; - -template -auto const default_concept_map::value> -> = dyno::make_concept_map( - "move-construct"_s = [](void* p, T&& other) { - new (p) T(std::move(other)); - } -); - - -struct CopyConstructible : decltype(dyno::requires( - dyno::MoveConstructible{}, - "copy-construct"_s = dyno::function -)) { }; - -template -auto const default_concept_map::value> -> = dyno::make_concept_map( - "copy-construct"_s = [](void* p, T const& other) { - new (p) T(other); - } -); - - -struct MoveAssignable : decltype(dyno::requires( - // No virtual function required to support this so far -)) { }; - - -struct CopyAssignable : decltype(dyno::requires( - dyno::MoveAssignable{} - // No additional virtual functions required to support this so far -)) { }; - - -struct Swappable : decltype(dyno::requires( - // No virtual functions required to support this so far -)) { }; - - -struct EqualityComparable : decltype(dyno::requires( - "equal"_s = dyno::function -)) { }; - -template -auto const default_concept_map() == std::declval())) -> = dyno::make_concept_map( - "equal"_s = [](T const& a, T const& b) -> bool { return a == b; } -); - - -struct Destructible : decltype(dyno::requires( - "destruct"_s = dyno::function -)) { }; - -template -auto const default_concept_map::value> -> = dyno::make_concept_map( - "destruct"_s = [](T& self) { self.~T(); } -); - -} // end namespace dyno - -#endif // DYNO_BUILTIN_HPP diff --git a/share/dyno/concept.hpp b/share/dyno/concept.hpp deleted file mode 100644 index 1401353..0000000 --- a/share/dyno/concept.hpp +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_CONCEPT_HPP -#define DYNO_CONCEPT_HPP - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - - -namespace dyno { - -template -struct concept; - -namespace detail { - template - constexpr boost::hana::basic_tuple> - expand_clauses(boost::hana::pair const&) - { return {}; } - - template - constexpr auto expand_clauses(dyno::concept const&) { - return boost::hana::flatten( - boost::hana::make_basic_tuple(detail::expand_clauses(Clauses{})...) - ); - } - - struct concept_base { }; -} // end namespace detail - -// Returns a sequence containing all the clauses of the given concept and -// its derived concepts. -// -// In the returned sequence, each clause is a pair where the first element -// is the name of the clause and the second element is the clause itself -// (e.g. a `dyno::function`). The order of clauses is not specified. -template -constexpr auto clauses(dyno::concept const&) { - auto all = boost::hana::make_basic_tuple(detail::expand_clauses(Clauses{})...); - return boost::hana::flatten(all); -} - -// Returns a sequence containing the names associated to all the claused of -// the given concept, and its derived concepts. -// -// The order of the clause names is not specified. -template -constexpr auto clause_names(dyno::concept const& c) { - return boost::hana::transform(dyno::clauses(c), boost::hana::first); -} - -// Returns a sequence of the concepts refined by the given concept. -// -// Only the concepts that are refined directly by `c` are returned, i.e. we -// do not get the refined concepts of the refined concepts recursively. -template -constexpr auto refined_concepts(dyno::concept const&) { - return boost::hana::filter(boost::hana::make_basic_tuple(Clauses{}...), [](auto t) { - constexpr bool IsBase = std::is_base_of::value; - return boost::hana::bool_c; - }); -} - -namespace detail { - template - constexpr auto direct_clauses(dyno::concept const&) { - return boost::hana::filter(boost::hana::make_basic_tuple(Clauses{}...), [](auto t) { - constexpr bool IsBase = std::is_base_of::value; - return boost::hana::bool_c; - }); - } - - template - constexpr auto has_duplicate_clause(dyno::concept const& c) { - auto direct = detail::direct_clauses(c); - return detail::has_duplicates(boost::hana::transform(direct, boost::hana::first)); - } - - template - constexpr auto is_redefining_base_concept_clause(dyno::concept const& c) { - auto bases = dyno::refined_concepts(c); - auto base_clause_names = boost::hana::unpack(bases, [](auto ...bases) { - auto all = boost::hana::flatten(boost::hana::make_basic_tuple(dyno::clauses(bases)...)); - return boost::hana::transform(all, boost::hana::first); - }); - return boost::hana::any_of(detail::direct_clauses(c), [=](auto clause) { - return boost::hana::contains(base_clause_names, boost::hana::first(clause)); - }); - } -} // end namespace detail - -// A `concept` is a collection of clauses and refined concepts representing -// requirements for a type to model the concept. -// -// A concept is created by using `dyno::requires`. -// -// From a `concept`, one can generate a virtual function table by looking at -// the signatures of the functions defined in the concept. In the future, it -// would also be possible to do much more, like getting a predicate that checks -// whether a type satisfies the concept. -template -struct concept : detail::concept_base { - static_assert(!decltype(detail::has_duplicate_clause(std::declval())){}, - "dyno::concept: It looks like you have multiple clauses with the same " - "name in your concept definition. This is not allowed; each clause must " - "have a different name."); - - static_assert(!decltype(detail::is_redefining_base_concept_clause(std::declval())){}, - "dyno::concept: It looks like you are redefining a clause that is already " - "defined in a base concept. This is not allowed; clauses defined in a " - "concept must have a distinct name from clauses defined in base concepts " - "if there are any."); - - template - constexpr auto get_signature(Name name) const { - auto clauses = boost::hana::to_map(dyno::clauses(*this)); - return clauses[name]; - } -}; - -// Creates a `concept` with the given clauses. Note that a clause may be a -// concept itself, in which case the clauses of that concept are used, and -// that, recursively. For example: -// -// ``` -// template -// struct Iterator : decltype(dyno::requires( -// Incrementable{}, -// "dereference"_s = dyno::function -// ... -// )) { }; -// ``` -// -// It is recommended to make every concept its own structure (and not just an -// alias), as above, because that ensures the uniqueness of concepts that have -// the same clauses. -template -constexpr dyno::concept requires(Clauses ...) { - return {}; -} - -} // end namespace dyno - -#endif // DYNO_CONCEPT_HPP diff --git a/share/dyno/concept_map.hpp b/share/dyno/concept_map.hpp deleted file mode 100644 index 3e1cbf2..0000000 --- a/share/dyno/concept_map.hpp +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_CONCEPT_MAP_HPP -#define DYNO_CONCEPT_MAP_HPP - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - - -namespace dyno { - -namespace detail { - // We wrap all lambdas and function objects passed to the library using this - // hack, so that we can pretend stateless lambdas are default constructible - // in the rest of the library. - template - struct default_constructible_lambda; - - template - struct default_constructible_lambda { - constexpr R operator()(Args ...args) const { - auto lambda = detail::empty_object::get(); - return lambda(std::forward(args)...); - } - }; - - template - struct default_constructible_lambda { - constexpr void operator()(Args ...args) const { - auto lambda = detail::empty_object::get(); - lambda(std::forward(args)...); - } - }; -} // end namespace detail - -// A concept map is a statically-known mapping from functions implemented by -// a type `T` to functions defined by a concept. A concept map is what's being -// used to fill the vtable extracted from a concept definition. An instance of -// this type is never created as-is; `dyno::make_concept_map` must always be used. -// -// Note that everything in the concept map is known statically. Specifically, -// the types of the functions in the concept map are known statically, and -// e.g. lambdas will be stored as-is (not as function pointers). -template -struct concept_map_t; - -template -struct concept_map_t...> { - constexpr concept_map_t() = default; - - template - constexpr auto operator[](Name_ name) const { - constexpr bool is_known_function = boost::hana::contains(as_hana_map{}, name); - if constexpr (is_known_function) { - return boost::hana::at_key(as_hana_map{}, name); - } else { - static_assert(is_known_function, - "dyno::concept_map_t::operator[]: Request for the implementation of a " - "function that was not provided in the concept map. Make sure the " - "concept map contains the proper functions, and that you're requesting " - "the right function from the concept map. You can find the contents of " - "the concept map and the function you were trying to access in the " - "compiler error message, probably in the following format: " - "`concept_map_t::operator[]`"); - } - } - -private: - using as_hana_map = boost::hana::map< - boost::hana::pair< - Name, - detail::default_constructible_lambda< - Function, - typename detail::bind_signature< - typename decltype(Concept{}.get_signature(Name{}))::type, T - >::type - > - >... - >; -}; - -// Creates a concept map associating function names to function implementations. -// -// The exact contents of the map must be pairs where the first element is a -// function name (represented as a compile-time string), and the second element -// is the implementation of that function (as a stateless function object). -// -// Note that a concept map created with this function can be incomplete. Before -// being used, it must be completed using `dyno::complete_concept_map`. -template -constexpr auto make_concept_map(boost::hana::pair ...mappings) { - auto map = boost::hana::make_map(mappings...); - - static_assert(!decltype(detail::has_duplicates(boost::hana::keys(map)))::value, - "dyno::make_concept_map: It looks like you have multiple entries with the " - "same name in your concept map. This is not allowed; each entry must have " - "a different name."); - - return map; -} - -// Customization point for concept writers to provide default models of -// their concepts. -// -// This can be specialized by concept authors to provide a concept map that -// will be used when no custom concept map is specified. The third parameter -// can be used to define a default concept map for a family of type, by using -// `std::enable_if`. -template -auto const default_concept_map = dyno::make_concept_map(); - -// Customization point for users to define their models of concepts. -// -// This can be specialized by clients to provide concept maps for the concepts -// and types they wish. The third parameter can be used to define a concept -// map for a family of type, by using `std::enable_if`. -template -auto const concept_map = dyno::make_concept_map(); - -namespace detail { - // Takes a Hana map, and completes it by interpreting it as a concept map - // for fulfilling the given `Concept` for the given type `T`. - template - constexpr auto complete_concept_map_impl(Map map) { - // 1. Bring in the functions provided in the default concept map. - auto with_defaults = boost::hana::union_(dyno::default_concept_map, map); - - // 2. For each refined concept, recursively complete the concept map for - // that Concept and merge that into the current concept map. - auto refined = dyno::refined_concepts(Concept{}); - auto merged = boost::hana::fold_left(refined, with_defaults, [](auto m, auto c) { - using C = decltype(c); - auto completed = detail::complete_concept_map_impl(dyno::concept_map); - return boost::hana::union_(completed, m); - }); - - return merged; - } - - // Turns a Hana map into a concept map. - template - constexpr auto to_concept_map(Map map) { - return boost::hana::unpack(map, [](auto ...m) { - return dyno::concept_map_t{}; - }); - } - - // Returns whether a Hana map, when interpreted as a concept map for fulfilling - // the given `Concept`, is missing any functions. - template - struct concept_map_is_complete : decltype(boost::hana::is_subset( - dyno::clause_names(Concept{}), - boost::hana::keys(std::declval()) - )) { }; -} // end namespace detail - -// Returns whether the type `T` models the given `Concept`. -// -// Specifically, checks whether it is possible to complete the concept map of -// the given type for the given concept. Usage goes as follows: -// ``` -// static_assert(dyno::models); -// ``` -template -constexpr auto models = detail::concept_map_is_complete< - Concept, T, - decltype(detail::complete_concept_map_impl( - dyno::concept_map - )) ->{}; - -namespace diagnostic { - template struct ________________THE_CONCEPT_IS; - template struct ________________YOUR_MODEL_IS; - template struct ________________FUNCTIONS_MISSING_FROM_YOUR_CONCEPT_MAP; - template struct ________________FUNCTIONS_DECLARED_IN_YOUR_CONCEPT_MAP; - template struct ________________FUNCTIONS_REQUIRED_BY_THE_CONCEPT; - template struct ________________EXACT_TYPE_OF_YOUR_CONCEPT_MAP; - - template - constexpr void INCOMPLETE_CONCEPT_MAP() { - static_assert(concept_map_is_complete, - "dyno::concept_map: Incomplete definition of your concept map. Despite " - "looking at the default concept map for this concept and the concept " - "maps for all the concepts this concept refines, I can't find definitions " - "for all the functions that the concept requires. Please make sure you did " - "not forget to define a function in your concept map, and otherwise make " - "sure the proper default concept maps are kicking in. You can find information " - "to help you debug this error in the compiler error message, probably in " - "the instantiation of the INCOMPLETE_CONCEPT_MAP<.....> function. Good luck!"); - } -} // end namespace diagnostic - -// Turns a Hana map into a fully cooked concept map ready for consumption -// by a vtable. -// -// The concept maps for all the concepts that `Concept` refines are merged with -// the mappings provided explicitly. For example: -// ``` -// struct A : decltype(dyno::requires( -// "f"_s = dyno::function -// )) { }; -// -// struct B : decltype(dyno::requires( -// A{}, -// "g"_s = dyno::function -// )) { }; -// -// struct Foo { }; -// -// template <> -// auto const dyno::concept_map = dyno::make_concept_map( -// "f"_s = [](Foo&) { } -// ); -// -// template <> -// auto const dyno::concept_map = dyno::make_concept_map( -// "g"_s = [](Foo&) { return 0; } -// ); -// -// auto complete = dyno::complete_concept_map(dyno::concept_map); -// // `f` is automatically pulled from `concept` -// ``` -// -// Furthermore, if the same function is defined in more than one concept map -// in the full refinement tree, it is undefined which one is used. Therefore, -// all of the implementations better be the same! This is easy to enforce by -// never defining a function in a concept map where the concept does not -// require that function. -// -// Despite the above, which relates to functions defined in different concepts -// that have a refinement relation, if a function is provided both in the -// default concept map and in a customized concept map for the same concept, -// the function in the customized map is preferred. -// -// Also, after looking at the whole refinement tree, including the default -// concept maps, it is an error if any function required by the concept can't -// be resolved. -template -constexpr auto complete_concept_map(Map map) { - auto complete_map = detail::complete_concept_map_impl(map); - auto as_concept_map = detail::to_concept_map(complete_map); - constexpr auto is_complete = detail::concept_map_is_complete{}; - if constexpr (is_complete) { - return as_concept_map; - } else { - auto required = boost::hana::to_set(dyno::clause_names(Concept{})); - auto declared = boost::hana::to_set(boost::hana::keys(complete_map)); - auto missing = boost::hana::difference(required, declared); - diagnostic::INCOMPLETE_CONCEPT_MAP< - diagnostic::________________THE_CONCEPT_IS, - diagnostic::________________YOUR_MODEL_IS, - diagnostic::________________FUNCTIONS_MISSING_FROM_YOUR_CONCEPT_MAP, - diagnostic::________________FUNCTIONS_DECLARED_IN_YOUR_CONCEPT_MAP, - diagnostic::________________FUNCTIONS_REQUIRED_BY_THE_CONCEPT, - diagnostic::________________EXACT_TYPE_OF_YOUR_CONCEPT_MAP - >(); - } -} - -} // end namespace dyno - -#endif // DYNO_CONCEPT_MAP_HPP diff --git a/share/dyno/detail/bind_signature.hpp b/share/dyno/detail/bind_signature.hpp deleted file mode 100644 index 1ac0f41..0000000 --- a/share/dyno/detail/bind_signature.hpp +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_DETAIL_BIND_SIGNATURE_HPP -#define DYNO_DETAIL_BIND_SIGNATURE_HPP - -#include -#include - - -namespace dyno { namespace detail { - -template -struct replace_impl { using type = T; }; - -template -struct replace_impl { using type = New; }; -template -struct replace_impl { using type = New&; }; -template -struct replace_impl { using type = New&&; }; -template -struct replace_impl { using type = New*; }; - -template -struct replace_impl { using type = New const; }; -template -struct replace_impl { using type = New const&; }; -template -struct replace_impl { using type = New const&&; }; -template -struct replace_impl { using type = New const*; }; - -template -struct replace { - template - using apply = replace_impl; -}; - -// Takes a placeholder signature and replaces instances of `dyno::T` by the given -// type. -// -// Basically, this will turn stuff like `void (dyno::T const&, int, dyno::T*)` -// into `void (T const&, int, T*)`, where `T` is the type we are _binding_ -// the signature to. -// -// This is used to make sure that the functions provided in a concept map -// have the right signature. -template -using bind_signature = detail::transform_signature< - Signature, detail::replace::template apply ->; - -}} // end namespace dyno::detail - -#endif // DYNO_DETAIL_BIND_SIGNATURE_HPP diff --git a/share/dyno/detail/dsl.hpp b/share/dyno/detail/dsl.hpp deleted file mode 100644 index 664fa92..0000000 --- a/share/dyno/detail/dsl.hpp +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_DETAIL_DSL_HPP -#define DYNO_DETAIL_DSL_HPP - -#include -#include -#include -#include -#include -#include - -#include -#include - - -namespace dyno { - -template -struct function_t { using type = Signature; }; - -template -constexpr auto operator==(function_t, function_t) { - return boost::hana::bool_c::value>; -} - -template -constexpr auto operator!=(function_t m1, function_t m2) { - return !(m1 == m2); -} - -// Right-hand-side of a clause in a concept that signifies a function with the -// given signature. -template -constexpr function_t function{}; - -template -struct method_t; - -// Right-hand-side of a clause in a concept that signifies a method with the -// given signature. The first parameter of the resulting function is implicitly -// `dyno::T&` for a non-const method, and `dyno::T const&` for a const method. -template -constexpr method_t method{}; - -// Placeholder type representing the type of ref-unqualified `*this` when -// defining a clause in a concept. -struct T; - -template -struct method_t { using type = R (dyno::T&, Args...); }; -template -struct method_t { using type = R (dyno::T&, Args...); }; -template -struct method_t { using type = R (dyno::T&&, Args...); }; - -template -struct method_t { using type = R (dyno::T const&, Args...); }; -template -struct method_t { using type = R (dyno::T const&, Args...); }; -// const&& not supported because it's stupid - -template -constexpr auto operator==(method_t, method_t) { - return boost::hana::bool_c::value>; -} - -template -constexpr auto operator!=(method_t m1, method_t m2) { - return !(m1 == m2); -} - -namespace detail { - template - struct delayed_call { - boost::hana::tuple args; - - // All the constructors are private so that only `dyno::string` can - // construct an instance of this. The intent is that we can only - // manipulate temporaries of this type. - private: - template friend struct string; - - template - constexpr delayed_call(T&& ...t) : args{std::forward(t)...} { } - delayed_call(delayed_call const&) = default; - delayed_call(delayed_call&&) = default; - }; - - template - struct string : boost::hana::string { - template - constexpr boost::hana::pair - operator=(Function f) const { - static_assert(std::is_empty{}, - "Only stateless function objects can be used to define vtables"); - return {{}, f}; - } - - template - constexpr auto operator()(Args&& ...args) const { - return detail::delayed_call{std::forward(args)...}; - } - - using hana_tag = typename boost::hana::tag_of>::type; - }; - - template - constexpr detail::string prepare_string_impl(std::index_sequence) - { return {}; } - - template - constexpr auto prepare_string(S) { - return detail::prepare_string_impl(std::make_index_sequence{}); - } -} // end namespace detail - -inline namespace literals { - // Creates a compile-time string that can be used as the left-hand-side when - // defining clauses or filling concept maps. - template - constexpr auto operator""_s() { return detail::string{}; } -} // end namespace literals - -// Creates a Dyno compile-time string without requiring the use of a -// user-defined literal. -// -// The user-defined literal is non-standard as of C++17, and it requires -// brining the literal in scope (through a using declaration or such), -// which is not always convenient or possible. -#define DYNO_STRING(s) \ - (::dyno::detail::prepare_string([]{ \ - struct tmp { \ - /* exclude null terminator in size() */ \ - static constexpr std::size_t size() { return sizeof(s) - 1; } \ - static constexpr char const* get() { return s; } \ - }; \ - return tmp{}; \ - }())) \ -/**/ - -} // end namespace dyno - -#endif // DYNO_DETAIL_DSL_HPP diff --git a/share/dyno/detail/empty_object.hpp b/share/dyno/detail/empty_object.hpp deleted file mode 100644 index e2853cb..0000000 --- a/share/dyno/detail/empty_object.hpp +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_DETAIL_EMPTY_OBJECT_HPP -#define DYNO_DETAIL_EMPTY_OBJECT_HPP - -#include - - -namespace dyno { namespace detail { - -// Hack to get an instance of an empty type that is not default constructible, -// while still satisfying the C++ standard. None of this would be necessary if -// stateless lambdas were default constructible. -// -// The idea behind this trick is that we make two layout-compatible types `T1` -// and `T2`, while having `T2` inherit from the empty class `T` we're trying -// to bypass the construction of. -// -// We then create a union of these two types, and initialize `T1` inside that -// union. Since `T1` and `T2` are layout-compatible, we can legally access the -// `T2` member of the union, which we can then legally cast to its base class -// `T`. Et voilĂ , we've got a valid `T` object, yet we've never initialized it. -// -// For details on standard layout types, see: -// http://en.cppreference.com/w/cpp/language/data_members#Standard_layout -template -struct empty_object { - static_assert(std::is_standard_layout{}, - "This trick won't work if `T` is not standard layout, because that's " - "required for `T2` below to be standard layout."); - - static_assert(std::is_empty{}, - "This trick won't work if `T` is not empty, because that's required for " - "`T1` and `T2` below to be layout-compatible (and also to make sure `T` " - "is trivially destructible."); - - // `T1` and `T2` have `c` as a common initial sequence of non-static - // data members: - // Two standard-layout non-union class types may have a common initial - // sequence of non-static data members and bit-fields, for a sequence of - // one or more initial members (in order of declaration), if the members - // have layout-compatible types [...]. - - // `T1` and `T2` are layout-compatible: - // Two standard-layout non-union class types are called layout-compatible - // if [...] their common initial sequence consists of every non-static - // data member and bit field. - struct T1 { char c; }; - struct T2 : T { char c; }; - - union Storage { - constexpr Storage() : t1{} { } - T1 t1; - T2 t2; - }; - - static T get() { - // Initialize the union with `T1` active. - Storage storage{}; - - // Access the member `c` of `T2` in the union: - // In a standard-layout union with an active member of non-union class - // type `T1`, it is permitted to read a non-static data member `m` of - // another union member of non-union class type `T2` provided `m` is - // part of the common initial sequence of `T1` and `T2` [...]. - char const* c = &storage.t2.c; - - // From this pointer, get a pointer back to `T2`: - // A pointer to an object of standard-layout struct type can be - // `reinterpret_cast` to pointer to its first non-static data member - // (if it has non-static data members) [...], and vice versa. - // (padding is not allowed before the first data member). [...] - T2 const* t2 = reinterpret_cast(c); - - // Finally, get a pointer to the base class `T` from the `T2` pointer. - T const* t = static_cast(t2); - - return *t; - } -}; - -}} // end namespace dyno::detail - -#endif // DYNO_DETAIL_EMPTY_OBJECT_HPP diff --git a/share/dyno/detail/erase_function.hpp b/share/dyno/detail/erase_function.hpp deleted file mode 100644 index bd0c2cb..0000000 --- a/share/dyno/detail/erase_function.hpp +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_DETAIL_ERASE_FUNCTION_HPP -#define DYNO_DETAIL_ERASE_FUNCTION_HPP - -#include -#include - -#include - -#include - - -namespace dyno { namespace detail { - -template -struct thunk; - -template -struct thunk { - static constexpr auto - apply(typename detail::erase_placeholder::type ...args) - -> typename detail::erase_placeholder::type - { - return detail::erase::apply( - detail::empty_object::get()( - detail::unerase::apply( - std::forward::type>(args) - )... - ) - ); - } -}; - -template -struct thunk { - static constexpr auto - apply(typename detail::erase_placeholder::type ...args) - -> void - { - detail::empty_object::get()( - detail::unerase::apply( - std::forward::type>(args) - )... - ); - } -}; - -// Transform an actual (stateless) function object with statically typed -// parameters into a type-erased function suitable for storage in a vtable. -// -// The pointer returned by `erase_function` is what's called a thunk; it -// makes a few adjustments to the arguments (usually 0-overhead static -// casts) and forwards them to another function. -// -// TODO: -// - Would it be possible to erase a callable that's not a stateless function -// object? Would that necessarily require additional storage? -// - Should we be returning a lambda that erases its arguments? -template -constexpr auto erase_function(F const&) { - using ActualSignature = boost::callable_traits::function_type_t; - using Thunk = detail::thunk; - return &Thunk::apply; -} - -}} // end namespace dyno::detail - -#endif // DYNO_DETAIL_ERASE_FUNCTION_HPP diff --git a/share/dyno/detail/erase_signature.hpp b/share/dyno/detail/erase_signature.hpp deleted file mode 100644 index 8b567e1..0000000 --- a/share/dyno/detail/erase_signature.hpp +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_DETAIL_ERASE_SIGNATURE_HPP -#define DYNO_DETAIL_ERASE_SIGNATURE_HPP - -#include -#include - - -namespace dyno { namespace detail { - -template -struct apply_erase_placeholder { - template - using apply = detail::erase_placeholder; -}; - -// Transforms a signature potentially containing placeholders into a signature -// containing no placeholders, and which would be suitable for storing as a -// function pointer. -// -// Basically, this turns types like `dyno::T&` into `void*` (or what's specified -// by the given `Eraser`) at the top-level of the signature. This is used when -// we need to generate a vtable from a concept definition. The concept defines -// signatures with placeholders, and we need to generate a concrete function -// type that can be stored in a vtable. That concrete type is the result of -// `erase_signature`. -// -// Note that this returns a function type, not a function pointer type. -// For actually storing an object of this type, one needs to add a pointer -// qualifier to it. -template -using erase_signature = detail::transform_signature< - Signature, detail::apply_erase_placeholder::template apply ->; - -}} // end namespace dyno::detail - -#endif // DYNO_DETAIL_ERASE_SIGNATURE_HPP diff --git a/share/dyno/detail/eraser_traits.hpp b/share/dyno/detail/eraser_traits.hpp deleted file mode 100644 index 1a9f223..0000000 --- a/share/dyno/detail/eraser_traits.hpp +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_DETAIL_ERASER_TRAITS_HPP -#define DYNO_DETAIL_ERASER_TRAITS_HPP - -#include - -#include -#include - - -namespace dyno { namespace detail { - -// Traits for types that can be used to erase other types. The following traits -// should be provided: -// -// template -// struct erase_placeholder; -// -// Metafunction transforming the type of a possibly cv and ref-qualified -// placeholder (a `dyno::T`) into a representation suitable for passing -// around as a parameter to an erased function. Basically, this turns a -// type like `dyno::T&` into a `void*`, and similarly for other types of -// possibly, const or ref-qualified `dyno::T`s, but it can be customized -// for custom eraser types. -// -// template -// static constexpr erase_placeholder::type -// erase::apply(Actual); -// -// Function transforming an object to the generic representation for the -// given placeholder for that eraser. This is used to obtain a representation -// of the object that can be passed to an erased function stored in a vtable. -// For example, in the case of the `void` eraser, this function just takes a -// reference or a pointer to an actual type and passes it as a `void*`, with -// the proper cv qualifiers. Note that an eraser is not expected to support -// erasure of arbitrary types. For example, it is perfectly fine to give an -// error if one tries to erase an `int` as a `dyno::T&`, since that makes no -// sense. However, it is probably a good idea to support inexact casts that -// do make sense, such as erasing `int&` to `dyno::T const&` (even though the -// cv-qualifiers don't match). This is left to the implementation of the -// specific eraser. -// -// template -// static constexpr Actual -// unerase -// ::apply(erase_placeholder::type) -// -// This is the inverse operation to `erase`. It takes an object that was -// erased and interprets it as an object of the specified `Actual` type. -// The eraser can assume that the object that was erased is indeed of the -// requested type. This function is used to transform an object with an -// erased representation into an object that can be passed to a function -// stored in a concept map. - -template -struct erase_placeholder { - static_assert(!std::is_same{}, - "dyno::T may not be passed by value; it is only a placeholder"); - using type = Placeholder; -}; - -template -struct erase { - template - static constexpr decltype(auto) apply(Arg&& arg) { - return std::forward(arg); - } -}; - -template -struct unerase { - template - static constexpr decltype(auto) apply(Arg&& arg) - { return std::forward(arg); } -}; - -// Specialization for the `void` Eraser, which uses `void*` to erase types. -template <> struct erase_placeholder { using type = void const*; }; -template <> struct erase_placeholder { using type = void*; }; -template <> struct erase_placeholder { using type = void*; }; -template <> struct erase_placeholder { using type = void*; }; -template <> struct erase_placeholder { using type = void const*; }; - -template <> -struct erase { - template - static constexpr void const* apply(Arg const& arg) - { return &arg; } -}; -template <> -struct erase { - template - static constexpr void* apply(Arg& arg) - { return &arg; } -}; -template <> -struct erase { - template - static constexpr void* apply(Arg&& arg) { - static_assert(std::is_rvalue_reference::value, "will move from non-rvalue"); - return &arg; - } -}; -template <> -struct erase { - template - static constexpr void const* apply(Arg const* arg) - { return arg; } -}; -template <> -struct erase { - template - static constexpr void* apply(Arg* arg) - { return arg; } -}; - -template -struct unerase { - static constexpr Actual& apply(void* arg) - { return *static_cast(arg); } -}; -template -struct unerase { - static constexpr Actual const& apply(void const* arg) - { return *static_cast(arg); } -}; -template -struct unerase { - static constexpr Actual&& apply(void* arg) - { return std::move(*static_cast(arg)); } -}; -template -struct unerase { - static constexpr Actual* apply(void* arg) - { return static_cast(arg); } -}; -template -struct unerase { - static constexpr Actual const* apply(void const* arg) - { return static_cast(arg); } -}; - -}} // end namespace dyno::detail - -#endif // DYNO_DETAIL_ERASER_TRAITS_HPP diff --git a/share/dyno/detail/has_duplicates.hpp b/share/dyno/detail/has_duplicates.hpp deleted file mode 100644 index 760c48e..0000000 --- a/share/dyno/detail/has_duplicates.hpp +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_DETAIL_HAS_DUPLICATES_HPP -#define DYNO_DETAIL_HAS_DUPLICATES_HPP - -#include -#include -#include -#include - - -namespace dyno { namespace detail { - -// Returns whether a Foldable contains duplicate elements, i.e. elements -// that compare equal to each other. -// -// TODO: Lift this into the public interface of Hana. -template -constexpr auto has_duplicates(Foldable const& foldable) { - return boost::hana::not_equal( - boost::hana::length(boost::hana::to_set(foldable)), - boost::hana::length(foldable) - ); -} - -}} // end namespace dyno::detail - -#endif // DYNO_DETAIL_HAS_DUPLICATES_HPP diff --git a/share/dyno/detail/is_placeholder.hpp b/share/dyno/detail/is_placeholder.hpp deleted file mode 100644 index 560ee89..0000000 --- a/share/dyno/detail/is_placeholder.hpp +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_DETAIL_IS_PLACEHOLDER_HPP -#define DYNO_DETAIL_IS_PLACEHOLDER_HPP - -#include - -#include - - -namespace dyno { namespace detail { - -// Metafunction returning whether a type is a possibly const/ref-qualified -// placeholder, or a pointer to one. -template -struct is_placeholder : std::false_type { }; - -template <> struct is_placeholder : std::true_type { }; -template <> struct is_placeholder : std::true_type { }; -template <> struct is_placeholder : std::true_type { }; - -template <> struct is_placeholder : std::true_type { }; -template <> struct is_placeholder : std::true_type { }; -template <> struct is_placeholder : std::true_type { }; - -}} // end namespace dyno::detail - -#endif // DYNO_DETAIL_IS_PLACEHOLDER_HPP diff --git a/share/dyno/detail/macro.hpp.erb b/share/dyno/detail/macro.hpp.erb deleted file mode 100644 index 2d2971d..0000000 --- a/share/dyno/detail/macro.hpp.erb +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_MACRO_HPP -#define DYNO_MACRO_HPP - -////////////////////////////////////////////////////////////////////////////// -// THIS FILE WAS GENERATED; DO NOT EDIT DIRECTLY. -// -// -// This file is generated from the ERB[1] template -// file. The maximum number of methods that can be handled by the macros can -// be controlled with the 'MAX_NUMBER_OF_METHODS' variable, which can be set -// when calling ERB to generate the header: -// -// export MAX_NUMBER_OF_METHODS=55 -// erb include/dyno/detail/macro.hpp.erb > include/dyno/macro.hpp -// -// Due to the limits of some preprocessor macros we're using in the implementation, -// 'MAX_NUMBER_OF_METHODS' must be <= 62, otherwise an error is triggered. -// If 'MAX_NUMBER_OF_METHODS' is not specified, it defaults to 20. -// -// [1]: http://en.wikipedia.org/wiki/ERuby -////////////////////////////////////////////////////////////////////////////// - -<% - MAX_NUMBER_OF_METHODS = (ENV["MAX_NUMBER_OF_METHODS"] || 20).to_i - raise "MAX_NUMBER_OF_METHODS must be <= 62" if MAX_NUMBER_OF_METHODS > 62 -%> - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - - -// TODOS -// - Allow specifying custom base concepts and base interfaces. By default, a -// concept could provide a default interface (e.g. a copy constructor for -// CopyConstructible, etc..). -// - Handle const and non-const more gracefully -// - Try to get rid of commas in the method definition. Use a BOOST_PP_SEQ - -#define DYNO_INTERFACE(name, ...) \ - DYNO_PP_CONCAT(DYNO_PP_INTERFACE_IMPL_, DYNO_PP_NARG(__VA_ARGS__))(name, __VA_ARGS__) - -<% (0..MAX_NUMBER_OF_METHODS).each do |n| -args = (1..n).map { |i| "arg#{i}" } - -def dyno_string(arg) - "DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD #{arg}))" -end -%> - -#define DYNO_PP_INTERFACE_IMPL_<%= n %>(name<%= args.map { |arg| ", #{arg}" }.join %>)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - <% args.each_with_index do |arg, i| %> \ - <%= ',' if i > 0 %> \ - <%= dyno_string(arg) %> = ::dyno::method>\ - <% end %> \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - <% args.each_with_index do |arg, i| %> \ - <%= ',' if i > 0 %> \ - <%= dyno_string(arg) %> = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD <%= arg %> \ - (static_cast(args)...); \ - } \ - <% end %> \ - )} \ - { } \ - <% args.each_with_index do |arg, i| %> \ - template >>()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member>::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t>\ - DYNO_PP_VARIADIC_HEAD <%= arg %>(Args&& ...args) { \ - return poly_.virtual_(<%= dyno_string(arg) %>)(static_cast(args)...);\ - } \ - template >>()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member>::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t>\ - DYNO_PP_VARIADIC_HEAD <%= arg %>(Args&& ...args) const { \ - return poly_.virtual_(<%= dyno_string(arg) %>)(static_cast(args)...);\ - } \ - <% end %> \ - private: \ - ::dyno::poly poly_; \ - } - -<% end %> - -#endif // DYNO_MACRO_HPP diff --git a/share/dyno/detail/preprocessor.hpp b/share/dyno/detail/preprocessor.hpp deleted file mode 100644 index ee51eef..0000000 --- a/share/dyno/detail/preprocessor.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_DETAIL_PREPROCESSOR_HPP -#define DYNO_DETAIL_PREPROCESSOR_HPP - -// Macro expanding to the number of arguments it is passed. -// -// Specifically, `DYNO_PP_NARG(x1, ..., xn)` expands to `n`. -// The program is ill-formed if `n > 64` or if `n == 0`. -#define DYNO_PP_NARG(...) \ - DYNO_PP_NARG_IMPL(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,) - -#define DYNO_PP_NARG_IMPL(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63, N, ...) N - -// Expands to the concatenation of its two arguments. -#define DYNO_PP_CONCAT(x, y) DYNO_PP_CONCAT_PRIMITIVE(x, y) -#define DYNO_PP_CONCAT_PRIMITIVE(x, y) x ## y - -// Expands to the stringized version of its argument. -#define DYNO_PP_STRINGIZE(...) DYNO_PP_STRINGIZE_PRIMITIVE(__VA_ARGS__) -#define DYNO_PP_STRINGIZE_PRIMITIVE(...) #__VA_ARGS__ - -// Expands to its first argument. -#define DYNO_PP_VARIADIC_HEAD(head, ...) head - -// Expands to all the arguments beyond the first one. -#define DYNO_PP_VARIADIC_TAIL(head, ...) __VA_ARGS__ - -#endif // DYNO_DETAIL_PREPROCESSOR_HPP diff --git a/share/dyno/detail/transform_signature.hpp b/share/dyno/detail/transform_signature.hpp deleted file mode 100644 index 9db02fe..0000000 --- a/share/dyno/detail/transform_signature.hpp +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_DETAIL_TRANSFORM_SIGNATURE_HPP -#define DYNO_DETAIL_TRANSFORM_SIGNATURE_HPP - -namespace dyno { namespace detail { - -// Transforms a signature by applying a metafunction to the return type and -// all the arguments of a function signature. This returns a function type, -// not a pointer to a function. -template class F> -struct transform_signature; - -template class F> -struct transform_signature { - using Result = typename F::type; - using type = Result (typename F::type...); -}; - -template class F> -struct transform_signature { - using Result = typename F::type; - using type = Result (typename F::type..., ...); -}; - -}} // end namespace dyno::detail - -#endif // DYNO_DETAIL_TRANSFORM_SIGNATURE_HPP diff --git a/share/dyno/experimental/unrolled_vtable.hpp b/share/dyno/experimental/unrolled_vtable.hpp deleted file mode 100644 index 4317287..0000000 --- a/share/dyno/experimental/unrolled_vtable.hpp +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_EXPERIMENTAL_UNROLLED_VTABLE_HPP -#define DYNO_EXPERIMENTAL_UNROLLED_VTABLE_HPP - -#include -#include -#include - -#include -#include -#include -#include - - -namespace dyno { namespace experimental { - -namespace detail { - template - struct unrolled_vtable_impl; -} - -template -using unrolled_vtable = typename decltype( - boost::hana::unpack(dyno::clauses(Concept{}), - boost::hana::template_ ^boost::hana::on^ boost::hana::decltype_ - ) -)::type; - -/* -What follows is a script to generate the specializations of `unrolled_vtable_impl`. -Run the script as - - awk '/SCRIPTBEGIN/{flag=1;next}/SCRIPTEND/{flag=0}flag' ${thisfile} | erb - -SCRIPTBEGIN -<% (0..10).each do |n| %> -template < - <%= (0...n).map {|i| "typename Name#{i}, typename Sig#{i}" }.join(",\n ") %> -> struct unrolled_vtable_impl< - <%= (0...n).map {|i| "boost::hana::pair>" }.join(",\n ") %> -> { - template - constexpr explicit unrolled_vtable_impl(ConceptMap map) - <%= ": " unless n == 0 %><%= (0...n).map {|i| "fptr#{i}_(dyno::detail::erase_function(map[Name#{i}{}]))" }.join("\n , ") %> - { } - <%= (0...n).map {|i| "constexpr auto operator[](Name#{i}) const { return fptr#{i}_; };" }.join("\n ") %> - -private: - <%= (0...n).map {|i| "typename detail::erase_signature::type* fptr#{i}_;" }.join("\n ") %> -}; -<% end %> -SCRIPTEND */ - -namespace detail { - //////////////////////////////////////////////////////////////////////////// - // BEGIN GENERATED CODE - //////////////////////////////////////////////////////////////////////////// - - //////////////////////////////////////////////////////////////////////////// - // END GENERATED CODE - //////////////////////////////////////////////////////////////////////////// -} // end namespace detail - -}} // end namespace dyno::experimental - -#endif // DYNO_EXPERIMENTAL_UNROLLED_VTABLE_HPP diff --git a/share/dyno/experimental/vtable.hpp b/share/dyno/experimental/vtable.hpp deleted file mode 100644 index fe824ed..0000000 --- a/share/dyno/experimental/vtable.hpp +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_EXPERIMENTAL_VTABLE_HPP -#define DYNO_EXPERIMENTAL_VTABLE_HPP - -#include -#include - -#include -#include - - -namespace dyno { -namespace experimental { - -namespace detail { - template - struct vtable_base; - - template - struct vtable_impl; - - template - struct make_vtable_impl { - template - using apply = vtable_impl; - }; -} // end namespace detail - -// TODO: This vtable is currently broken since we have removed `unpack_vtable_layout`. -template -struct vtable { - #if 0 - template - constexpr explicit vtable(ConceptMap) { - using Derived = dyno::unpack_vtable_layout< - Concept, detail::make_vtable_impl::template apply - >; - new (&base_) Derived{}; - } - - template - constexpr auto operator[](Name) const { - Base const* base = static_cast(static_cast(&base_)); - return [base](auto&& ...args) -> decltype(auto) { - return base->apply(Name{}, std::forward(args)...); - }; - } - -private: - using Base = dyno::unpack_vtable_layout; - std::aligned_storage base_; - #endif -}; - -/* -What follows is a script to generate the specialization of `vtable_base` -and `vtable_impl`. Run the script as - - awk '/SCRIPTBEGIN/{flag=1;next}/SCRIPTEND/{flag=0}flag' ${thisfile} | erb - -SCRIPTBEGIN -<% (0..10).each do |n| %> -template < - <%= (0...n).map {|i| "typename Name#{i}, typename R#{i}, typename ...Args#{i}" }.join(",\n ") %> -> struct vtable_base< - <%= (0...n).map {|i| "std::pair" }.join(",\n ") %> -> { - <%= (0...n).map {|i| "virtual R#{i} apply(Name#{i}, Args#{i}...) const = 0;" }.join("\n ") %> -}; - -template -> -struct vtable_impl" }.join("\n ") %> -> final : vtable_base< - <%= (0...n).map {|i| "std::pair" }.join(",\n ") %> -> { - <%= (0...n).map {|i| - "virtual R#{i} apply(Name#{i} name, Args#{i} ...args) const override final" + - "{ return dyno::detail::erase_function(ConceptMap{}[name])(std::forward(args)...); }" - }.join("\n ") %> -}; -<% end %> -SCRIPTEND */ - -namespace detail { - //////////////////////////////////////////////////////////////////////////// - // BEGIN GENERATED CODE - //////////////////////////////////////////////////////////////////////////// - - //////////////////////////////////////////////////////////////////////////// - // END GENERATED CODE - //////////////////////////////////////////////////////////////////////////// -} // end namespace detail - -} // end namespace experimental -} // end namespace dyno - -#endif // DYNO_EXPERIMENTAL_VTABLE_HPP diff --git a/share/dyno/macro.hpp b/share/dyno/macro.hpp deleted file mode 100644 index 1d0baec..0000000 --- a/share/dyno/macro.hpp +++ /dev/null @@ -1,7552 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_MACRO_HPP -#define DYNO_MACRO_HPP - -////////////////////////////////////////////////////////////////////////////// -// THIS FILE WAS GENERATED; DO NOT EDIT DIRECTLY. -// -// -// This file is generated from the ERB[1] template -// file. The maximum number of methods that can be handled by the macros can -// be controlled with the 'MAX_NUMBER_OF_METHODS' variable, which can be set -// when calling ERB to generate the header: -// -// export MAX_NUMBER_OF_METHODS=55 -// erb include/dyno/detail/macro.hpp.erb > include/dyno/macro.hpp -// -// Due to the limits of some preprocessor macros we're using in the implementation, -// 'MAX_NUMBER_OF_METHODS' must be <= 62, otherwise an error is triggered. -// If 'MAX_NUMBER_OF_METHODS' is not specified, it defaults to 20. -// -// [1]: http://en.wikipedia.org/wiki/ERuby -////////////////////////////////////////////////////////////////////////////// - - - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - - -// TODOS -// - Allow specifying custom base concepts and base interfaces. By default, a -// concept could provide a default interface (e.g. a copy constructor for -// CopyConstructible, etc..). -// - Handle const and non-const more gracefully -// - Try to get rid of commas in the method definition. Use a BOOST_PP_SEQ - -#define DYNO_INTERFACE(name, ...) \ - DYNO_PP_CONCAT(DYNO_PP_INTERFACE_IMPL_, DYNO_PP_NARG(__VA_ARGS__))(name, __VA_ARGS__) - - - -#define DYNO_PP_INTERFACE_IMPL_0(name)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - )} \ - { } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_1(name, arg1)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_2(name, arg1, arg2)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_3(name, arg1, arg2, arg3)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_4(name, arg1, arg2, arg3, arg4)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_5(name, arg1, arg2, arg3, arg4, arg5)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_6(name, arg1, arg2, arg3, arg4, arg5, arg6)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg6 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_7(name, arg1, arg2, arg3, arg4, arg5, arg6, arg7)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg6 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg7 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_8(name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg6 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg7 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg8 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_9(name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg6 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg7 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg8 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg9 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_10(name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg6 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg7 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg8 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg9 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg10 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_11(name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg6 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg7 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg8 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg9 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg10 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg11 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_12(name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg6 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg7 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg8 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg9 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg10 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg11 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg12 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_13(name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg6 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg7 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg8 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg9 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg10 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg11 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg12 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg13 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_14(name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg6 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg7 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg8 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg9 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg10 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg11 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg12 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg13 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg14 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg14(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg14(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_15(name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg6 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg7 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg8 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg9 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg10 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg11 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg12 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg13 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg14 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg15 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg14(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg14(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg15(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg15(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_16(name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg6 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg7 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg8 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg9 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg10 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg11 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg12 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg13 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg14 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg15 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg16 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg14(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg14(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg15(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg15(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg16(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg16(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_17(name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg6 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg7 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg8 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg9 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg10 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg11 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg12 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg13 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg14 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg15 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg16 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg17 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg14(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg14(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg15(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg15(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg16(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg16(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg17(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg17(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_18(name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg18)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg6 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg7 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg8 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg9 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg10 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg11 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg12 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg13 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg14 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg15 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg16 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg17 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg18)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg18 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg14(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg14(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg15(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg15(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg16(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg16(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg17(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg17(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg18(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg18)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg18(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg18)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_19(name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg18)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg19)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg6 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg7 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg8 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg9 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg10 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg11 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg12 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg13 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg14 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg15 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg16 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg17 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg18)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg18 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg19)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg19 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg14(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg14(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg15(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg15(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg16(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg16(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg17(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg17(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg18(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg18)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg18(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg18)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg19(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg19)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg19(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg19)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#define DYNO_PP_INTERFACE_IMPL_20(name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20)\ - struct DYNO_PP_CONCAT(dyno_concept_for_, name) { \ - static auto make_type() { \ - return ::dyno::requires( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg18)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg19)) = ::dyno::method\ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg20)) = ::dyno::method\ - \ - ); \ - } \ - }; \ - \ - class name { \ - struct concept_t \ - : decltype(DYNO_PP_CONCAT(dyno_concept_for_, name)::make_type()) \ - { }; \ - public: \ - template \ - name(T&& x) \ - : poly_{static_cast(x), ::dyno::make_concept_map( \ - \ - \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg1 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg2 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg3 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg4 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg5 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg6 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg7 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg8 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg9 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg10 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg11 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg12 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg13 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg14 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg15 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg16 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg17 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg18)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg18 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg19)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg19 \ - (static_cast(args)...); \ - } \ - \ - , \ - DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg20)) = [](auto&& self, auto&& ...args) -> decltype(auto) {\ - return static_cast(self) \ - .DYNO_PP_VARIADIC_HEAD arg20 \ - (static_cast(args)...); \ - } \ - \ - )} \ - { } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg1(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg1)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg2(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg2)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg3(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg3)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg4(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg4)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg5(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg5)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg6(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg6)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg7(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg7)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg8(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg8)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg9(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg9)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg10(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg10)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg11(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg11)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg12(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg12)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg13(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg13)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg14(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg14(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg14)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg15(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg15(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg15)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg16(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg16(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg16)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg17(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg17(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg17)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg18(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg18)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg18(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg18)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg19(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg19)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg19(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg19)))(static_cast(args)...);\ - } \ - \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - !::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg20(Args&& ...args) { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg20)))(static_cast(args)...);\ - } \ - template >()\ - (::std::declval()...) \ - ), typename = ::std::enable_if_t< \ - ::boost::callable_traits::is_const_member::value,\ - char[sizeof...(Args)+1] /* make the enable_if dependent */ \ - >> \ - ::boost::callable_traits::return_type_t\ - DYNO_PP_VARIADIC_HEAD arg20(Args&& ...args) const { \ - return poly_.virtual_(DYNO_STRING(DYNO_PP_STRINGIZE(DYNO_PP_VARIADIC_HEAD arg20)))(static_cast(args)...);\ - } \ - \ - private: \ - ::dyno::poly poly_; \ - } - - - -#endif // DYNO_MACRO_HPP diff --git a/share/dyno/poly.hpp b/share/dyno/poly.hpp deleted file mode 100644 index ae8e7f1..0000000 --- a/share/dyno/poly.hpp +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_POLY_HPP -#define DYNO_POLY_HPP - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - - -namespace dyno { - -// A `dyno::poly` encapsulates an object of a polymorphic type that supports the -// interface of the given `Concept`. -// -// `dyno::poly` is meant to be used as a holder for a polymorphic object. It can -// manage the lifetime of that object and provide access to its dynamically- -// dispatched methods. However, it does not directly implement any specific -// interface beyond what's strictly necessary for managing the lifetime -// (constructor, destructor, assignment, swap, etc..). Instead, it provides -// a `virtual_` method that gives access to dynamically-dispatched methods of -// the object it manages. -// -// The intended use case is for users to create their very own type-erased -// wrappers on top of `dyno::poly`, defining their interface as they wish and -// using the dynamic dispatch provided by the library to implement runtime -// polymorphism. -// -// Different aspects of a `dyno::poly` can also be customized: -// `Concept` -// The concept satisfied by `dyno::poly`. This determines which methods will -// be available for dynamic dispatching. -// -// `Storage` -// The type used to provide the storage for the managed object. This must -// be a model of the `PolymorphicStorage` concept. -// -// `VTable` -// The policy specifying how to implement the dynamic dispatching mechanism -// for methods. This must be a specialization of `dyno::vtable`. -// See `dyno::vtable` for details. -// -// TODO: -// - How to combine the storage of the object with that of the vtable? -// For example, how would we allow storing the vtable inside the rest -// of the storage? -// - Is it actually OK to require Destructible and Storable all the time? -// - Test that we can't call e.g. a non-const method on a const poly. -template < - typename Concept, - typename Storage = dyno::remote_storage, - typename VTablePolicy = dyno::vtable> -> -struct poly { -private: - using ActualConcept = decltype(dyno::requires( - Concept{}, - dyno::Destructible{}, - dyno::Storable{} - )); - using VTable = typename VTablePolicy::template apply; - -public: - template , typename ConceptMap> - poly(T&& t, ConceptMap map) - : vtable_{dyno::complete_concept_map(map)} - , storage_{std::forward(t)} - { } - - template , - typename = std::enable_if_t::value>, - typename = std::enable_if_t> - > - poly(T&& t) - : poly{std::forward(t), dyno::concept_map} - { } - - poly(poly const& other) - : vtable_{other.vtable_} - , storage_{other.storage_, vtable_} - { } - - poly(poly&& other) - : vtable_{std::move(other.vtable_)} - , storage_{std::move(other.storage_), vtable_} - { } - - poly& operator=(poly const& other) { - poly(other).swap(*this); - return *this; - } - - poly& operator=(poly&& other) { - poly(std::move(other)).swap(*this); - return *this; - } - - void swap(poly& other) { - storage_.swap(vtable_, other.storage_, other.vtable_); - using std::swap; - swap(vtable_, other.vtable_); - } - - friend void swap(poly& a, poly& b) { a.swap(b); } - - ~poly() { storage_.destruct(vtable_); } - - template - decltype(auto) operator->*(dyno::detail::delayed_call&& delayed) { - auto f = virtual_(Name{}); - auto injected = [f,this](auto&& ...args) -> decltype(auto) { - return f(*this, static_cast(args)...); - }; - return boost::hana::unpack(std::move(delayed.args), injected); - } - - template * = nullptr - > - constexpr decltype(auto) virtual_(Function name) const& { - auto clauses = boost::hana::to_map(dyno::clauses(Concept{})); - return virtual_impl(clauses[name], name); - } - template * = nullptr - > - constexpr decltype(auto) virtual_(Function name) & { - auto clauses = boost::hana::to_map(dyno::clauses(Concept{})); - return virtual_impl(clauses[name], name); - } - template * = nullptr - > - constexpr decltype(auto) virtual_(Function name) && { - auto clauses = boost::hana::to_map(dyno::clauses(Concept{})); - return std::move(*this).virtual_impl(clauses[name], name); - } - - template * = nullptr - > - constexpr decltype(auto) virtual_(Function) const { - static_assert(HasClause, "dyno::poly::virtual_: Trying to access a function " - "that is not part of the Concept"); - } - - // Returns a pointer to the underlying storage. - // - // The pointer is potentially invalidated whenever the poly is modified; - // the specific storage policy should be consulted to know when pointers - // to the underlying storage are invalidated. - // - // The behavior is undefined if the requested type is not cv-qualified `void` - // and the underlying storage is not of the requested type. - template - T* unsafe_get() { return storage_.template get(); } - - template - T const* unsafe_get() const { return storage_.template get(); } - -private: - VTable vtable_; - Storage storage_; - - // Handle dyno::function - template - constexpr decltype(auto) virtual_impl(dyno::function_t, Function name) const { - auto fptr = vtable_[name]; - return [fptr](auto&& ...args) -> decltype(auto) { - return fptr(poly::unerase_poly(static_cast(args))...); - }; - } - - // Handle dyno::method - template - constexpr decltype(auto) virtual_impl(dyno::method_t, Function name) & { - auto fptr = vtable_[name]; - return [fptr, this](auto&& ...args) -> decltype(auto) { - return fptr(poly::unerase_poly(*this), - poly::unerase_poly(static_cast(args))...); - }; - } - template - constexpr decltype(auto) virtual_impl(dyno::method_t, Function name) & { - auto fptr = vtable_[name]; - return [fptr, this](auto&& ...args) -> decltype(auto) { - return fptr(poly::unerase_poly(*this), - poly::unerase_poly(static_cast(args))...); - }; - } - template - constexpr decltype(auto) virtual_impl(dyno::method_t, Function name) && { - auto fptr = vtable_[name]; - return [fptr, this](auto&& ...args) -> decltype(auto) { - return fptr(poly::unerase_poly(*this), - poly::unerase_poly(static_cast(args))...); - }; - } - template - constexpr decltype(auto) virtual_impl(dyno::method_t, Function name) const { - auto fptr = vtable_[name]; - return [fptr, this](auto&& ...args) -> decltype(auto) { - return fptr(poly::unerase_poly(*this), - poly::unerase_poly(static_cast(args))...); - }; - } - template - constexpr decltype(auto) virtual_impl(dyno::method_t, Function name) const { - auto fptr = vtable_[name]; - return [fptr, this](auto&& ...args) -> decltype(auto) { - return fptr(poly::unerase_poly(*this), - poly::unerase_poly(static_cast(args))...); - }; - } - - // unerase_poly helper - template ::value, int> = 0> - static constexpr decltype(auto) unerase_poly(Arg&& arg) - { return static_cast(arg); } - - template ::value, int> = 0> - static constexpr decltype(auto) unerase_poly(Arg&& arg) { - using RawArg = std::remove_cv_t>; - constexpr bool is_poly = std::is_same::value; - static_assert(is_poly, - "dyno::poly::virtual_: Passing a non-poly object as an argument to a virtual " - "function that specified a placeholder for that parameter."); - return static_cast(arg).storage_.get(); - } - template ::value, int> = 0> - static constexpr decltype(auto) unerase_poly(Arg* arg) { - using RawArg = std::remove_cv_t; - constexpr bool is_poly = std::is_same::value; - static_assert(is_poly, - "dyno::poly::virtual_: Passing a non-poly object as an argument to a virtual " - "function that specified a placeholder for that parameter."); - return arg->storage_.get(); - } -}; - -} // end namespace dyno - -#endif // DYNO_POLY_HPP diff --git a/share/dyno/storage.hpp b/share/dyno/storage.hpp deleted file mode 100644 index 26a8012..0000000 --- a/share/dyno/storage.hpp +++ /dev/null @@ -1,662 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_STORAGE_HPP -#define DYNO_STORAGE_HPP - -#include -#include - -#include -#include -#include -#include -#include -#include - - -namespace dyno { - -// concept PolymorphicStorage -// -// The PolymorphicStorage concept represents storage that can be used to store -// an object of an arbitrary type. In a sense, it is like a special-purpose -// allocator that could only ever allocate a single object. -// -// The nice thing about these PolymorphicStorage classes is that they have a -// single type and their ABI does not change even when the type of what they -// hold changes. However, they provide this functionality at the cost of -// "forgetting" the type information of what they hold, which is why they -// must be passed a vtable to perform most operations. -// -// A type `Storage` satisfying the `PolymorphicStorage` concept must provide -// the following functions as part of its interface: -// -// template explicit Storage(T&&); -// Semantics: Construct an object of type `std::decay_t` in the polymorphic -// storage, forward the argument to the constructor of the object -// being created. A particular `Storage` class is not expected to -// support being constructed from any such `T`; for example, `T` -// could be too large to fit in a predefined buffer size, in which -// case this call would not compile. -// -// template Storage(Storage const&, VTable const&); -// Semantics: Copy-construct the contents of the polymorphic storage, -// assuming the contents of the source storage can be -// manipulated using the provided vtable. -// -// template Storage(Storage&&, VTable const&); -// Semantics: Move-construct the contents of the polymorphic storage, -// assuming the contents of the source storage can be -// manipulated using the provided vtable. -// -// template -// void swap(MyVTable const&, Storage&, OtherVTable const&); -// Semantics: Swap the contents of the two polymorphic storages, assuming -// `*this` can be manipulated using `MyVTable` and the other -// storage can be manipulated using `OtherVTable`. -// -// template void destruct(VTable const&); -// Semantics: Destruct the object held inside the polymorphic storage, assuming -// that object can be manipulated using the provided vtable. This -// must also free any resource required for storing the object. -// However, this is not the same as destructing the polymorphic -// storage itself (the wrapper), for which the destructor must -// still be called. -// -// WARNING: Since this is not using the usual destructor mechanism, -// it is of utmost importance that users of these storage classes -// call the `destruct` method explicitly in their destructor. -// Furthermore, it should be noted that if an exception is thrown -// in the constructor of a class (say `any_iterator`) using a -// storage class defined here, the cleanup will NOT be done -// automatically because the destructor of `any_iterator` will -// not be called. -// -// template T* get(); -// Semantics: Return a pointer of type `T` to the object inside the polymorphic -// storage. If `T` is not the actual type of the object stored -// inside the polymorphic storage, the behavior is undefined. -// -// template T const* get() const; -// Semantics: Return a pointer of type `T` to the object inside the polymorphic -// storage. If `T` is not the actual type of the object stored -// inside the polymorphic storage, the behavior is undefined. -// -// static constexpr bool can_store(dyno::storage_info); -// Semantics: Return whether the polymorphic storage can store an object with -// the specified type information. - -// Class implementing the small buffer optimization (SBO). -// -// This class represents a value of an unknown type that is stored either on -// the heap, or on the stack if it fits in the specific small buffer size. -// -// TODO: - Consider having ptr_ always point to either sb_ or the heap. -// - Alternatively, if we had a way to access the vtable here, we could -// retrieve the size of the type from it and get rid of `uses_heap_`. -// - We could also use the low bits of the pointer to the vtable for -// `uses_heap_`. -template -class sbo_storage { - static constexpr std::size_t SBSize = Size < sizeof(void*) ? sizeof(void*) : Size; - static constexpr std::size_t SBAlign = Align == -1u ? alignof(std::aligned_storage_t) : Align; - using SBStorage = std::aligned_storage_t; - - union { - void* ptr_; - SBStorage sb_; - }; - // TODO: It might be possible to pack this bool inside the union somehow. - bool uses_heap_; - -public: - sbo_storage() = delete; - sbo_storage(sbo_storage const&) = delete; - sbo_storage(sbo_storage&&) = delete; - sbo_storage& operator=(sbo_storage&&) = delete; - sbo_storage& operator=(sbo_storage const&) = delete; - - static constexpr bool can_store(dyno::storage_info info) { - return info.size <= sizeof(SBStorage) && alignof(SBStorage) % info.alignment == 0; - } - - template > - explicit sbo_storage(T&& t) { - // TODO: We could also construct the object at an aligned address within - // the buffer, which would require computing the right address everytime - // we access the buffer as a T, but would allow more Ts to fit in the SBO. - if constexpr (can_store(dyno::storage_info_for)) { - uses_heap_ = false; - new (&sb_) RawT(std::forward(t)); - } else { - uses_heap_ = true; - ptr_ = std::malloc(sizeof(RawT)); - // TODO: Allocating and then calling the constructor is not - // exception-safe if the constructor throws. - // TODO: That's not a really nice way to handle this - assert(ptr_ != nullptr && "std::malloc failed, we're doomed"); - new (ptr_) RawT(std::forward(t)); - } - } - - template - sbo_storage(sbo_storage const& other, VTable const& vtable) { - if (other.uses_heap()) { - auto info = vtable["storage_info"_s](); - uses_heap_ = true; - ptr_ = std::malloc(info.size); - // TODO: That's not a really nice way to handle this - assert(ptr_ != nullptr && "std::malloc failed, we're doomed"); - vtable["copy-construct"_s](ptr_, other.get()); - } else { - uses_heap_ = false; - vtable["copy-construct"_s](&sb_, other.get()); - } - } - - template - sbo_storage(sbo_storage&& other, VTable const& vtable) - : uses_heap_{other.uses_heap()} - { - if (uses_heap()) { - this->ptr_ = other.ptr_; - other.ptr_ = nullptr; - } else { - vtable["move-construct"_s](this->get(), other.get()); - } - } - - template - void swap(MyVTable const& this_vtable, sbo_storage& other, OtherVTable const& other_vtable) { - if (this == &other) - return; - - if (this->uses_heap()) { - if (other.uses_heap()) { - std::swap(this->ptr_, other.ptr_); - - } else { - void *ptr = this->ptr_; - - // Bring `other`'s contents to `*this`, destructively - other_vtable["move-construct"_s](&this->sb_, &other.sb_); - other_vtable["destruct"_s](&other.sb_); - this->uses_heap_ = false; - - // Bring `*this`'s stuff to `other` - other.ptr_ = ptr; - other.uses_heap_ = true; - } - } else { - if (other.uses_heap()) { - void *ptr = other.ptr_; - - // Bring `*this`'s contents to `other`, destructively - this_vtable["move-construct"_s](&other.sb_, &this->sb_); - this_vtable["destruct"_s](&this->sb_); - other.uses_heap_ = false; - - // Bring `other`'s stuff to `*this` - this->ptr_ = ptr; - this->uses_heap_ = true; - - } else { - // Move `other` into temporary local storage, destructively. - SBStorage tmp; - other_vtable["move-construct"_s](&tmp, &other.sb_); - other_vtable["destruct"_s](&other.sb_); - - // Move `*this` into `other`, destructively. - this_vtable["move-construct"_s](&other.sb_, &this->sb_); - this_vtable["destruct"_s](&this->sb_); - - // Now, bring `tmp` into `*this`, destructively. - other_vtable["move-construct"_s](&this->sb_, &tmp); - other_vtable["destruct"_s](&tmp); - } - } - } - - template - void destruct(VTable const& vtable) { - if (uses_heap()) { - // If we've been moved from, don't do anything. - if (ptr_ == nullptr) - return; - - vtable["destruct"_s](ptr_); - std::free(ptr_); - } else { - vtable["destruct"_s](&sb_); - } - } - - template - T* get() { - return static_cast(uses_heap() ? ptr_ : &sb_); - } - - template - T const* get() const { - return static_cast(uses_heap() ? ptr_ : &sb_); - } - -private: - bool uses_heap() const { return uses_heap_; } -}; - -// Class implementing storage on the heap. Just like the `sbo_storage`, it -// only handles allocation and deallocation; construction and destruction -// must be handled externally. -struct remote_storage { - remote_storage() = delete; - remote_storage(remote_storage const&) = delete; - remote_storage(remote_storage&&) = delete; - remote_storage& operator=(remote_storage&&) = delete; - remote_storage& operator=(remote_storage const&) = delete; - - template > - explicit remote_storage(T&& t) - : ptr_{std::malloc(sizeof(RawT))} - { - // TODO: That's not a really nice way to handle this - assert(ptr_ != nullptr && "std::malloc failed, we're doomed"); - - new (ptr_) RawT(std::forward(t)); - } - - template - remote_storage(remote_storage const& other, VTable const& vtable) - : ptr_{std::malloc(vtable["storage_info"_s]().size)} - { - // TODO: That's not a really nice way to handle this - assert(ptr_ != nullptr && "std::malloc failed, we're doomed"); - - vtable["copy-construct"_s](this->get(), other.get()); - } - - template - remote_storage(remote_storage&& other, VTable const&) - : ptr_{other.ptr_} - { - other.ptr_ = nullptr; - } - - template - void swap(MyVTable const&, remote_storage& other, OtherVTable const&) { - std::swap(this->ptr_, other.ptr_); - } - - template - void destruct(VTable const& vtable) { - // If we've been moved from, don't do anything. - if (ptr_ == nullptr) - return; - - vtable["destruct"_s](ptr_); - std::free(ptr_); - } - - template - T* get() { - return static_cast(ptr_); - } - - template - T const* get() const { - return static_cast(ptr_); - } - - static constexpr bool can_store(dyno::storage_info) { - return true; - } - -private: - void* ptr_; -}; - -// Class implementing shared remote storage. -// -// This is basically the same as using a `std::shared_ptr` to store the -// polymorphic object. -// -// TODO: -// - Using `std::shared_ptr` in the implementation is suboptimal, because it -// reimplements type erasure for the deleter, but we could really reuse our -// vtable instead. -// - For remote storage policies, should it be possible to specify whether the -// pointed-to storage is const? -struct shared_remote_storage { - shared_remote_storage() = delete; - shared_remote_storage(shared_remote_storage const&) = delete; - shared_remote_storage(shared_remote_storage&&) = delete; - shared_remote_storage& operator=(shared_remote_storage&&) = delete; - shared_remote_storage& operator=(shared_remote_storage const&) = delete; - - template > - explicit shared_remote_storage(T&& t) - : ptr_{std::make_shared(std::forward(t))} - { } - - template - shared_remote_storage(shared_remote_storage const& other, VTable const&) - : ptr_{other.ptr_} - { } - - template - shared_remote_storage(shared_remote_storage&& other, VTable const&) - : ptr_{std::move(other.ptr_)} - { } - - template - void swap(MyVTable const&, shared_remote_storage& other, OtherVTable const&) { - using std::swap; - swap(this->ptr_, other.ptr_); - } - - template - void destruct(VTable const&) { - ptr_.reset(); - } - - template - T* get() { - return static_cast(ptr_.get()); - } - - template - T const* get() const { - return static_cast(ptr_.get()); - } - - static constexpr bool can_store(dyno::storage_info) { - return true; - } - -private: - std::shared_ptr ptr_; -}; - -// Class implementing unconditional storage in a local buffer. -// -// This is like a small buffer optimization, except the behavior is undefined -// when the object can't fit inside the buffer. Since we know the object always -// sits inside the local buffer, we can get rid of a branch when accessing the -// object. -template (-1)> -class local_storage { - static constexpr std::size_t SBAlign = Align == static_cast(-1) - ? alignof(std::aligned_storage_t) - : Align; - using SBStorage = std::aligned_storage_t; - SBStorage buffer_; - -public: - local_storage() = delete; - local_storage(local_storage const&) = delete; - local_storage(local_storage&&) = delete; - local_storage& operator=(local_storage&&) = delete; - local_storage& operator=(local_storage const&) = delete; - - static constexpr bool can_store(dyno::storage_info info) { - return info.size <= sizeof(SBStorage) && alignof(SBStorage) % info.alignment == 0; - } - - template > - explicit local_storage(T&& t) { - // TODO: We could also construct the object at an aligned address within - // the buffer, which would require computing the right address everytime - // we access the buffer as a T, but would allow more Ts to fit inside it. - static_assert(can_store(dyno::storage_info_for), - "dyno::local_storage: Trying to construct from an object that won't fit " - "in the local storage."); - - new (&buffer_) RawT(std::forward(t)); - } - - template - local_storage(local_storage const& other, VTable const& vtable) { - assert(can_store(vtable["storage_info"_s]()) && - "dyno::local_storage: Trying to copy-construct using a vtable that " - "describes an object that won't fit in the storage."); - - vtable["copy-construct"_s](this->get(), other.get()); - } - - template - local_storage(local_storage&& other, VTable const& vtable) { - assert(can_store(vtable["storage_info"_s]()) && - "dyno::local_storage: Trying to move-construct using a vtable that " - "describes an object that won't fit in the storage."); - - vtable["move-construct"_s](this->get(), other.get()); - } - - template - void swap(MyVTable const& this_vtable, local_storage& other, OtherVTable const& other_vtable) { - if (this == &other) - return; - - // Move `other` into temporary local storage, destructively. - SBStorage tmp; - other_vtable["move-construct"_s](&tmp, &other.buffer_); - other_vtable["destruct"_s](&other.buffer_); - - // Move `*this` into `other`, destructively. - this_vtable["move-construct"_s](&other.buffer_, &this->buffer_); - this_vtable["destruct"_s](&this->buffer_); - - // Now, bring `tmp` into `*this`, destructively. - other_vtable["move-construct"_s](&this->buffer_, &tmp); - other_vtable["destruct"_s](&tmp); - } - - template - void destruct(VTable const& vtable) { - vtable["destruct"_s](&buffer_); - } - - template - T* get() { - return static_cast(static_cast(&buffer_)); - } - - template - T const* get() const { - return static_cast(static_cast(&buffer_)); - } -}; - -// Class implementing a non-owning polymorphic reference. Unlike the other -// storage classes, this one does not own the object it holds, and hence it -// does not construct or destruct it. The referenced object must outlive the -// polymorphic storage that references it, otherwise the behavior is undefined. -struct non_owning_storage { - non_owning_storage() = delete; - non_owning_storage(non_owning_storage const&) = delete; - non_owning_storage(non_owning_storage&&) = delete; - non_owning_storage& operator=(non_owning_storage&&) = delete; - non_owning_storage& operator=(non_owning_storage const&) = delete; - - template - explicit non_owning_storage(T& t) - : ptr_{&t} - { } - - template - non_owning_storage(non_owning_storage const& other, VTable const&) - : ptr_{other.ptr_} - { } - - template - non_owning_storage(non_owning_storage&& other, VTable const&) - : ptr_{other.ptr_} - { } - - template - void swap(MyVTable const&, non_owning_storage& other, OtherVTable const&) { - std::swap(this->ptr_, other.ptr_); - } - - template - void destruct(VTable const&) { } - - template - T* get() { - return static_cast(ptr_); - } - - template - T const* get() const { - return static_cast(ptr_); - } - - static constexpr bool can_store(dyno::storage_info) { - return true; - } - -private: - void* ptr_; -}; - -// Class implementing polymorphic storage with a primary storage and a -// fallback one. -// -// When the primary storage can be used to store a type, it is used. When it -// can't, however, the secondary storage is used instead. This can be used -// to implement a small buffer optimization, by using `dyno::local_storage` as -// the primary storage, and `dyno::remote_storage` as the secondary. -// -// TODO: -// - Consider implementing this by storing a pointer to the active object. -// - Alternatively, if we had a way to access the vtable here, we could -// retrieve the size of the type from it and know whether we are in the -// primary or the secondary storage like that. -// - If we were to store the vtable inside storage classes, we could also -// encode which storage is active using the low bits of the pointer. -// - Technically, this could be used to implement `sbo_storage`. However, -// benchmarks show that `sbo_storage` is significantly more efficient. -// We should try to optimize `fallback_storage` so that it can replace sbo. -template -class fallback_storage { - union { First first_; Second second_; }; - bool in_first_; - - bool in_first() const { return in_first_; } - -public: - fallback_storage() = delete; - fallback_storage(fallback_storage const&) = delete; - fallback_storage(fallback_storage&&) = delete; - fallback_storage& operator=(fallback_storage&&) = delete; - fallback_storage& operator=(fallback_storage const&) = delete; - - template , - typename = std::enable_if_t)>> - explicit fallback_storage(T&& t) : in_first_{true} - { new (&first_) First{std::forward(t)}; } - - template , typename = void, - typename = std::enable_if_t)>> - explicit fallback_storage(T&& t) : in_first_{false} { - static_assert(can_store(dyno::storage_info_for), - "dyno::fallback_storage: Trying to construct from a type " - "that can neither be stored in the primary nor in the secondary storage."); - - new (&second_) Second{std::forward(t)}; - } - - template - fallback_storage(fallback_storage const& other, VTable const& vtable) - : in_first_{other.in_first_} - { - if (in_first()) - new (&first_) First{other.first_, vtable}; - else - new (&second_) Second{other.second_, vtable}; - } - - template - fallback_storage(fallback_storage&& other, VTable const& vtable) - : in_first_{other.in_first_} - { - if (in_first()) - new (&first_) First{std::move(other.first_), vtable}; - else - new (&second_) Second{std::move(other.second_), vtable}; - } - - // TODO: With a destructive move, we could avoid all the calls to `destruct` below. - template - void swap(MyVTable const& this_vtable, fallback_storage& other, OtherVTable const& other_vtable) { - if (this->in_first()) { - if (other.in_first()) { - this->first_.swap(this_vtable, other.first_, other_vtable); - } else { - // Move `this->first` into a temporary, destructively. - First tmp{std::move(this->first_), this_vtable}; - this->first_.destruct(this_vtable); - this->first_.~First(); - - // Move `other.second` into `this->second`, destructively. - new (&this->second_) Second{std::move(other.second_), other_vtable}; - this->in_first_ = false; - other.second_.destruct(other_vtable); - other.second_.~Second(); - - // Move `tmp` into `other.first`. - new (&other.first_) First{std::move(tmp), this_vtable}; - other.in_first_ = true; - } - } else { - if (other.in_first()) { - // Move `this->second` into a temporary, destructively. - Second tmp{std::move(this->second_), this_vtable}; - this->second_.destruct(this_vtable); - this->second_.~Second(); - - // Move `other.first` into `this->first`, destructively. - new (&this->first_) First{std::move(other.first_), other_vtable}; - this->in_first_ = true; - other.first_.destruct(other_vtable); - other.first_.~First(); - - // Move `tmp` into `other.second`. - new (&other.second_) Second{std::move(tmp), this_vtable}; - other.in_first_ = false; - } else { - this->second_.swap(this_vtable, other.second_, other_vtable); - } - } - } - - template - void destruct(VTable const& vtable) { - if (in_first()) - first_.destruct(vtable); - else - second_.destruct(vtable); - } - - template - T* get() { - return static_cast(in_first() ? first_.template get() - : second_.template get()); - } - - template - T const* get() const { - return static_cast(in_first() ? first_.template get() - : second_.template get()); - } - - static constexpr bool can_store(dyno::storage_info info) { - return First::can_store(info) || Second::can_store(info); - } -}; - -} // end namespace dyno - -#endif // DYNO_STORAGE_HPP diff --git a/share/dyno/vtable.hpp b/share/dyno/vtable.hpp deleted file mode 100644 index 2d6951f..0000000 --- a/share/dyno/vtable.hpp +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright Louis Dionne 2017 -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) - -#ifndef DYNO_VTABLE_HPP -#define DYNO_VTABLE_HPP - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - - -namespace dyno { - -// concept VTable -// -// A VTable is a mapping from statically-known function names to -// dynamically-known function pointers. In some sense, a vtable is -// a type-erased concept map. -// -// In addition to being `Swappable`, a type `Table` satisfying the `VTable` -// concept must provide the following functions as part of its interface: -// -// template explicit Table(ConceptMap); -// Semantics: Construct a vtable with the functions from a concept map. -// Note that the actual instance of the concept map being passed -// as a parameter is not required to be used; if that is enough -// for the purpose of the vtable, any instance of that concept -// map sharing the same type may be used. -// -// Note: Concept maps have unique types, so this wording is only -// a way of ensuring we can statically construct a vtable -// from just the type of that concept map. -// -// template constexpr auto contains(Name) const; -// Semantics: Return whether the vtable contains a function with the given -// name, which must be a compile-time string. -// -// template constexpr auto operator[](Name) const; -// Semantics: Return the function with the given name in the vtable if there -// is one. The behavior when no such function exists in the vtable -// is implementation defined (in most cases that's a compile-time -// error). - - -////////////////////////////////////////////////////////////////////////////// -// Vtable implementations - -// Class implementing a local vtable, i.e. a vtable whose storage is held -// right where the `local_vtable` is instantiated. -template -struct local_vtable; - -template -struct local_vtable...> { - template - constexpr explicit local_vtable(ConceptMap map) - : vtbl_{boost::hana::make_map( - boost::hana::make_pair(Name{}, detail::erase_function(map[Name{}]))... - )} { - // suppress "unused" warnings for empty parameter packs - (void) map; - } - - template - constexpr auto contains(Name_ name) const { - return boost::hana::contains(vtbl_, name); - } - - template - constexpr auto operator[](Name_ name) const { - constexpr bool contains_function = decltype(contains(name))::value; - if constexpr (contains_function) { - return vtbl_[name]; - } else { - static_assert(contains_function, - "dyno::local_vtable::operator[]: Request for a virtual function that is " - "not in the vtable. Was this function specified in the concept that " - "was used to instantiate this vtable? You can find the contents of the " - "vtable and the function you were trying to access in the compiler " - "error message, probably in the following format: " - "`local_vtable::operator[]`"); - } - } - - friend void swap(local_vtable& a, local_vtable& b) { - boost::hana::for_each(boost::hana::keys(a.vtbl_), [&](auto key) { - using std::swap; - swap(a.vtbl_[key], b.vtbl_[key]); - }); - } - -private: - boost::hana::map< - boost::hana::pair::type*>... - > vtbl_; -}; - -namespace detail { - template - static VTable const static_vtable{ConceptMap{}}; -} - -// Class implementing a vtable whose storage is held remotely. This is -// basically a pointer to a static instance of the specified `VTable`. -template -struct remote_vtable { - template - constexpr explicit remote_vtable(ConceptMap) - : vptr_{&detail::static_vtable} - { } - - template - constexpr auto operator[](Name name) const { - return (*vptr_)[name]; - } - - template - constexpr auto contains(Name name) const { - return vptr_->contains(name); - } - - friend void swap(remote_vtable& a, remote_vtable& b) { - using std::swap; - swap(a.vptr_, b.vptr_); - } - -private: - VTable const* vptr_; -}; - -// Class implementing a vtable that joins two other vtables. -// -// A function is first looked up in the first vtable, and in the second -// vtable if it can't be found in the first one. It is an error if a -// function is contained in both vtables, since this is most likely a -// programming error. -template -struct joined_vtable { - template - constexpr explicit joined_vtable(ConceptMap map) - : first_{map}, second_{map} - { } - - template - constexpr auto contains(Name name) const { - return first_.contains(name) || second_.contains(name); - } - - template - constexpr auto operator[](Name name) const { - auto first_contains_function = first_.contains(name); - auto second_contains_function = second_.contains(name); - - if constexpr (first_contains_function && second_contains_function) { - static_assert(!first_contains_function || !second_contains_function, - "dyno::joined_vtable::operator[]: Request for a virtual function that is " - "contained in both vtables of a joined vtable. Since this is most likely " - "a programming error, this is not allowed. You can find the contents of " - "the vtable and the function you were trying to access in the compiler " - "error message, probably in the following format: " - "`joined_vtable::operator[]`"); - - } else if constexpr (!first_contains_function && !second_contains_function) { - static_assert(first_contains_function || second_contains_function, - "dyno::joined_vtable::operator[]: Request for a virtual function that is " - "not present in any of the joined vtables. Make sure you meant to look " - "this function up, and otherwise check whether the two sub-vtables look " - "as expected. You can find the contents of the joined vtables and the " - "function you were trying to access in the compiler error message, " - "probably in the following format: " - "`joined_vtable::operator[]`"); - - } else if constexpr (first_contains_function) { - return first_[name]; - - } else { - return second_[name]; - } - } - -private: - First first_; - Second second_; -}; - -////////////////////////////////////////////////////////////////////////////// -// Selectors -template -struct only { - template - constexpr auto operator()(All all) const { - auto matched = boost::hana::make_set(Functions{}...); - static_assert(decltype(boost::hana::is_subset(matched, all))::value, - "dyno::only: Some functions specified in this selector are not part of " - "the concept to which the selector was applied."); - return boost::hana::make_pair( - boost::hana::difference(all, matched), - matched - ); - } -}; - -template -struct except { - template - constexpr auto operator()(All all) const { - auto not_matched = boost::hana::make_set(Functions{}...); - static_assert(decltype(boost::hana::is_subset(not_matched, all))::value, - "dyno::except: Some functions specified in this selector are not part of " - "the concept to which the selector was applied."); - return boost::hana::make_pair( - not_matched, - boost::hana::difference(all, not_matched) - ); - } -}; - -struct everything { - template - constexpr auto operator()(All all) const { - return boost::hana::make_pair(boost::hana::make_set(), all); - } -}; - -using everything_else = everything; - -namespace detail { - template - struct is_valid_selector : boost::hana::false_ { }; - - template - struct is_valid_selector> - : boost::hana::true_ - { }; - - template - struct is_valid_selector> - : boost::hana::true_ - { }; - - template <> - struct is_valid_selector - : boost::hana::true_ - { }; -} // end namespace detail - -////////////////////////////////////////////////////////////////////////////// -// Vtable policies -template -struct local { - static_assert(detail::is_valid_selector::value, - "dyno::local: Provided invalid selector. Valid selectors are " - "'dyno::only', 'dyno::except', " - "'dyno::everything', and 'dyno::everything_else'."); - - template - static constexpr auto create(Concept, Functions functions) { - return boost::hana::unpack(functions, [](auto ...f) { - using VTable = dyno::local_vtable< - boost::hana::pair... - >; - return boost::hana::basic_type{}; - }); - } - - Selector selector; -}; - -template -struct remote { - static_assert(detail::is_valid_selector::value, - "dyno::remote: Provided invalid selector. Valid selectors are " - "'dyno::only', 'dyno::except', " - "'dyno::everything', and 'dyno::everything_else'."); - - template - static constexpr auto create(Concept, Functions functions) { - return boost::hana::template_( - dyno::local::create(Concept{}, functions) - ); - } - - Selector selector; -}; - -namespace detail { - // Returns whether a vtable is empty, such that we can completely skip it - // when composing policies below. - template - struct is_empty_vtable : boost::hana::false_ { }; - - template <> - struct is_empty_vtable> : boost::hana::true_ { }; -} // end namespace detail - -template -constexpr auto generate_vtable(Policies policies) { - auto functions = boost::hana::to_set(dyno::clause_names(Concept{})); - auto state = boost::hana::make_pair(functions, boost::hana::basic_type>{}); - auto result = boost::hana::fold_left(policies, state, [](auto state, auto policy) { - auto functions = boost::hana::first(state); - auto vtable = boost::hana::second(state); - - auto selector_split = policy.selector(functions); - auto remaining = boost::hana::first(selector_split); - auto matched = boost::hana::second(selector_split); - - if constexpr (detail::is_empty_vtable{}) { - auto new_vtable = decltype(policy.create(Concept{}, matched)){}; - return boost::hana::make_pair(remaining, new_vtable); - } else { - auto new_vtable = boost::hana::basic_type< - dyno::joined_vtable< - typename decltype(vtable)::type, - typename decltype(policy.create(Concept{}, matched))::type - > - >{}; - return boost::hana::make_pair(remaining, new_vtable); - } - }); - - constexpr bool all_functions_were_taken = decltype(boost::hana::length(boost::hana::first(result)))::value == 0; - static_assert(all_functions_were_taken, - "dyno::vtable: The policies specified in the vtable did not fully cover all " - "the functions provided by the concept. Some functions were not mapped to " - "any vtable, which is an error"); - return boost::hana::second(result); -} - -// Policy-based interface for defining vtables. -// -// This type does not model the `VTable` concept itself; instead, it is used -// to generate a type that models that concept. -// -// A `vtable` is parameterized on one or more policies, which specify how -// the vtable is implemented under the hood. Some policies can be further -// parameterized using a `Selector`, in which case the functions specified -// by the `Selector` are the ones to which the policy applies. Policies -// provided by the library are: -// -// dyno::remote -// All functions selected by `Selector` will be stored in a remote vtable. -// The vtable object is just a pointer to an actual vtable, and each access -// to the vtable requires one indirection. In vanilla C++, this is the usual -// vtable implementation. -// -// dyno::local -// All functions selected by `Selector` will be stored in a local vtable. -// The vtable object will actually contain function pointers for all the -// selected functions. When accessing a virtual function, no additional -// indirection is required (compared to a vtable stored remotely), at the -// cost of space inside the vtable object. -// -// -// A selector is a type that selects a subset of functions defined by a concept. -// Selectors are used to pick which policy applies to which functions when -// defining a `vtable`. For example, one might want to define a vtable where -// all the functions except one (say `"f"`) are stored remotely, with `"f"` -// being stored locally. This can be achieved by using the `dyno::remote` policy -// with a selector that picks all functions except `"f"`, and the `dyno::local` -// policy with a selector that picks everything (all that remains). Note that -// when multiple selectors are specified, functions picked by earlier selectors -// will effectively be removed from the concept for later selectors, which -// supports this use case. Otherwise, one would have to specify that the -// `dyno::local` contains everything except the `"f"` function, which is -// cumbersome. Selectors provided by the library are: -// -// dyno::only -// Picks only the specified functions from a concept. `functions` must be -// compile-time strings, such as `dyno::only`. -// -// dyno::except -// Picks all but the specified functions from a concept. `functions` must -// be compile-time strings, such as `dyno::except`. -// -// dyno::everything -// Picks all the functions from a concept. -// -// dyno::everything_else -// Equivalent to `dyno::everything`, but prettier to read when other -// policies are used before it. -template -struct vtable { - template - using apply = typename decltype( - dyno::generate_vtable(boost::hana::basic_tuple{}) - )::type; -}; - -} // end namespace dyno - -#endif // DYNO_VTABLE_HPP diff --git a/sql/schema.sql b/sql/schema.sql index 6dab547..6b5a048 100644 --- a/sql/schema.sql +++ b/sql/schema.sql @@ -358,7 +358,7 @@ create unique index "uk_parameter_name" on "parameter"("name"); create trigger update_parameter_last_update before update on "parameter" for each row execute procedure last_update_column(); comment on table "parameter" is 'Parameter data'; -comment on table "parameter"."name" +comment on column "parameter"."name" is 'name of parameter e.g. Max power'; comment on column "parameter"."unit_id" is 'id of assigned unit (for range types, unit/list types indicated type of single value)'; diff --git a/src/libs/db/postgresql_connector/include/eedb/db/pg/PgItemsRepository.hpp b/src/libs/db/postgresql_connector/include/eedb/db/pg/PgItemsRepository.hpp index ba57203..e3f0d9a 100644 --- a/src/libs/db/postgresql_connector/include/eedb/db/pg/PgItemsRepository.hpp +++ b/src/libs/db/postgresql_connector/include/eedb/db/pg/PgItemsRepository.hpp @@ -18,7 +18,7 @@ class PgItemsRepository : public ItemsRepository { public: PgItemsRepository(db::PgConnection & db, User * owner); - std::unique_ptr< Item > create(item::Identyfier id, Values values, std::optional< item::Foto >) const override; + void create(item::Identyfier id, Values values, std::optional< item::Foto >) const override; std::unique_ptr< Items > search(const ItemQueryFilters & filer) const override; diff --git a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/all.hpp b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/all.hpp index 71593f8..07ed160 100644 --- a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/all.hpp +++ b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/all.hpp @@ -11,13 +11,13 @@ #include #include -static constexpr eedb::auth_identity t_auth_identity; -static constexpr eedb::auth_info t_auth_info; -static constexpr eedb::auth_token t_auth_token; -static constexpr eedb::category t_category; -static constexpr eedb::group t_group; -static constexpr eedb::parameter t_parameter; -static constexpr eedb::stat t_stat; -static constexpr eedb::system_info t_system_info; -static constexpr eedb::unit t_unit; -static constexpr eedb::user_audit t_user_audit; +static constexpr eedb::db::auth_identity t_auth_identity; +static constexpr eedb::db::auth_info t_auth_info; +static constexpr eedb::db::auth_token t_auth_token; +static constexpr eedb::db::category t_category; +static constexpr eedb::db::group t_group; +static constexpr eedb::db::parameter t_parameter; +static constexpr eedb::db::stat t_stat; +static constexpr eedb::db::system_info t_system_info; +static constexpr eedb::db::unit t_unit; +static constexpr eedb::db::user_audit t_user_audit; diff --git a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/auth_identity.h b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/auth_identity.h index 3805d0f..734e169 100644 --- a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/auth_identity.h +++ b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/auth_identity.h @@ -1,11 +1,10 @@ -#ifndef EEDB_AUTH_IDENTITY_H -#define EEDB_AUTH_IDENTITY_H +#pragma once #include #include #include -namespace eedb { +namespace eedb::db { namespace auth_identity_ { @@ -88,5 +87,3 @@ namespace eedb { }; }; } - -#endif diff --git a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/auth_info.h b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/auth_info.h index 26b2a6f..1f79d17 100644 --- a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/auth_info.h +++ b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/auth_info.h @@ -1,11 +1,10 @@ -#ifndef EEDB_AUTH_INFO_H -#define EEDB_AUTH_INFO_H +#pragma once #include #include #include -namespace eedb { +namespace eedb::db { namespace auth_info_ { @@ -184,5 +183,3 @@ namespace eedb { }; }; } - -#endif diff --git a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/auth_token.h b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/auth_token.h index 49e0e55..cbce842 100644 --- a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/auth_token.h +++ b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/auth_token.h @@ -1,11 +1,10 @@ -#ifndef EEDB_AUTH_TOKEN_H -#define EEDB_AUTH_TOKEN_H +#pragma once #include #include #include -namespace eedb { +namespace eedb::db { namespace auth_token_ { @@ -105,4 +104,3 @@ namespace eedb { }; } -#endif diff --git a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/category.h b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/category.h index b546e28..1e05b62 100644 --- a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/category.h +++ b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/category.h @@ -1,11 +1,10 @@ -#ifndef EEDB_CATEGORY_H -#define EEDB_CATEGORY_H +#pragma once #include #include #include -namespace eedb { +namespace eedb::db { namespace category_ { @@ -217,4 +216,3 @@ namespace eedb { }; } -#endif diff --git a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/category_items.h b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/category_items.h index d5c841d..10043e4 100644 --- a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/category_items.h +++ b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/category_items.h @@ -1,11 +1,11 @@ -#ifndef EEDB_CATEGORY_ITEMS_H -#define EEDB_CATEGORY_ITEMS_H +#ifndef EEDB::DB_CATEGORY_ITEMS_H +#define EEDB::DB_CATEGORY_ITEMS_H #include #include #include -namespace eedb { +namespace eedb::db { namespace category_items_ { diff --git a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/group.h b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/group.h index 85d9c3d..fc02a2b 100644 --- a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/group.h +++ b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/group.h @@ -1,11 +1,9 @@ -#ifndef EEDB_GROUP_H -#define EEDB_GROUP_H - +#pragma once #include #include #include -namespace eedb { +namespace eedb::db { namespace group_ { @@ -104,5 +102,3 @@ namespace eedb { }; }; } - -#endif diff --git a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/item.h b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/item.h index ba36c42..a963ad3 100644 --- a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/item.h +++ b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/item.h @@ -1,11 +1,11 @@ -#ifndef EEDB_ITEM_H -#define EEDB_ITEM_H +#ifndef EEDB::DB_ITEM_H +#define EEDB::DB_ITEM_H #include #include #include -namespace eedb { +namespace eedb::db { namespace item_ { diff --git a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/parameter.h b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/parameter.h index 8192645..5a221f5 100644 --- a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/parameter.h +++ b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/parameter.h @@ -1,11 +1,10 @@ -#ifndef EEDB_PARAMETER_H -#define EEDB_PARAMETER_H +#pragma once #include #include #include -namespace eedb { +namespace eedb::db { namespace parameter_ { @@ -184,5 +183,3 @@ namespace eedb { }; }; } - -#endif diff --git a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/stat.h b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/stat.h index ce889ca..e26e495 100644 --- a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/stat.h +++ b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/stat.h @@ -1,11 +1,10 @@ -#ifndef EEDB_STAT_H -#define EEDB_STAT_H +#pragma once #include #include #include -namespace eedb { +namespace eedb::db { namespace stat_ { @@ -153,4 +152,3 @@ namespace eedb { }; } -#endif diff --git a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/system_info.h b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/system_info.h index 4abab6f..596f4af 100644 --- a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/system_info.h +++ b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/system_info.h @@ -1,11 +1,10 @@ -#ifndef EEDB_SYSTEM_INFO_H -#define EEDB_SYSTEM_INFO_H +#pragma once #include #include #include -namespace eedb { +namespace eedb::db { namespace system_info_ { @@ -88,5 +87,3 @@ namespace eedb { }; }; } - -#endif diff --git a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/unit.h b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/unit.h index 3a0b4f2..33c8e77 100644 --- a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/unit.h +++ b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/unit.h @@ -1,204 +1,249 @@ -#ifndef EEDB_UNIT_H -#define EEDB_UNIT_H +#pragma once -#include #include #include +#include -namespace eedb { +namespace eedb::db { - namespace unit_ { +namespace unit_ { - struct Id { - struct _alias_t { - static constexpr const char _literal[] = R"("id")"; - using _name_t = sqlpp::make_char_sequence; - template - struct _member_t { - T id; - T &operator()() { return id; } - const T &operator()() const { return id; } - }; - }; + struct Id { + struct _alias_t { + static constexpr const char _literal[] = R"("id")"; + using _name_t = sqlpp::make_char_sequence< sizeof(_literal), _literal >; + template < typename T > + struct _member_t { + T id; + T & operator()() { + return id; + } + const T & operator()() const { + return id; + } + }; + }; - using _traits = ::sqlpp::make_traits<::sqlpp::integer>; - }; + using _traits = ::sqlpp::make_traits<::sqlpp::integer >; + }; - struct Owner { - struct _alias_t { - static constexpr const char _literal[] = R"("owner")"; - using _name_t = sqlpp::make_char_sequence; - template - struct _member_t { - T owner; - T &operator()() { return owner; } - const T &operator()() const { return owner; } - }; - }; + struct Owner { + struct _alias_t { + static constexpr const char _literal[] = R"("owner")"; + using _name_t = sqlpp::make_char_sequence< sizeof(_literal), _literal >; + template < typename T > + struct _member_t { + T owner; + T & operator()() { + return owner; + } + const T & operator()() const { + return owner; + } + }; + }; - using _traits = ::sqlpp::make_traits<::sqlpp::integer>; - }; + using _traits = ::sqlpp::make_traits<::sqlpp::integer >; + }; - struct Group { - struct _alias_t { - static constexpr const char _literal[] = R"("group")"; - using _name_t = sqlpp::make_char_sequence; - template - struct _member_t { - T group; - T &operator()() { return group; } - const T &operator()() const { return group; } - }; - }; + struct Group { + struct _alias_t { + static constexpr const char _literal[] = R"("group")"; + using _name_t = sqlpp::make_char_sequence< sizeof(_literal), _literal >; + template < typename T > + struct _member_t { + T group; + T & operator()() { + return group; + } + const T & operator()() const { + return group; + } + }; + }; - using _traits = ::sqlpp::make_traits<::sqlpp::integer>; - }; + using _traits = ::sqlpp::make_traits<::sqlpp::integer >; + }; - struct Unixperms { - struct _alias_t { - static constexpr const char _literal[] = R"("unixperms")"; - using _name_t = sqlpp::make_char_sequence; - template - struct _member_t { - T unixperms; - T &operator()() { return unixperms; } - const T &operator()() const { return unixperms; } - }; - }; + struct Unixperms { + struct _alias_t { + static constexpr const char _literal[] = R"("unixperms")"; + using _name_t = sqlpp::make_char_sequence< sizeof(_literal), _literal >; + template < typename T > + struct _member_t { + T unixperms; + T & operator()() { + return unixperms; + } + const T & operator()() const { + return unixperms; + } + }; + }; - using _traits = ::sqlpp::make_traits<::sqlpp::integer>; - }; + using _traits = ::sqlpp::make_traits<::sqlpp::integer >; + }; - struct Status { - struct _alias_t { - static constexpr const char _literal[] = R"("status")"; - using _name_t = sqlpp::make_char_sequence; - template - struct _member_t { - T status; - T &operator()() { return status; } - const T &operator()() const { return status; } - }; - }; + struct Status { + struct _alias_t { + static constexpr const char _literal[] = R"("status")"; + using _name_t = sqlpp::make_char_sequence< sizeof(_literal), _literal >; + template < typename T > + struct _member_t { + T status; + T & operator()() { + return status; + } + const T & operator()() const { + return status; + } + }; + }; - using _traits = ::sqlpp::make_traits<::sqlpp::integer>; - }; + using _traits = ::sqlpp::make_traits<::sqlpp::integer >; + }; - struct Name { - struct _alias_t { - static constexpr const char _literal[] = R"("name")"; - using _name_t = sqlpp::make_char_sequence; - template - struct _member_t { - T name; - T &operator()() { return name; } - const T &operator()() const { return name; } - }; - }; + struct Name { + struct _alias_t { + static constexpr const char _literal[] = R"("name")"; + using _name_t = sqlpp::make_char_sequence< sizeof(_literal), _literal >; + template < typename T > + struct _member_t { + T name; + T & operator()() { + return name; + } + const T & operator()() const { + return name; + } + }; + }; - using _traits = ::sqlpp::make_traits<::sqlpp::text, sqlpp::tag::require_insert>; - }; + using _traits = ::sqlpp::make_traits<::sqlpp::text, sqlpp::tag::require_insert >; + }; - struct Created { - struct _alias_t { - static constexpr const char _literal[] = R"("created")"; - using _name_t = sqlpp::make_char_sequence; - template - struct _member_t { - T created; - T &operator()() { return created; } - const T &operator()() const { return created; } - }; - }; + struct Created { + struct _alias_t { + static constexpr const char _literal[] = R"("created")"; + using _name_t = sqlpp::make_char_sequence< sizeof(_literal), _literal >; + template < typename T > + struct _member_t { + T created; + T & operator()() { + return created; + } + const T & operator()() const { + return created; + } + }; + }; - using _traits = ::sqlpp::make_traits<::sqlpp::time_point>; - }; + using _traits = ::sqlpp::make_traits<::sqlpp::time_point >; + }; - struct Updated { - struct _alias_t { - static constexpr const char _literal[] = R"("updated")"; - using _name_t = sqlpp::make_char_sequence; - template - struct _member_t { - T updated; - T &operator()() { return updated; } - const T &operator()() const { return updated; } - }; - }; + struct Updated { + struct _alias_t { + static constexpr const char _literal[] = R"("updated")"; + using _name_t = sqlpp::make_char_sequence< sizeof(_literal), _literal >; + template < typename T > + struct _member_t { + T updated; + T & operator()() { + return updated; + } + const T & operator()() const { + return updated; + } + }; + }; - using _traits = ::sqlpp::make_traits<::sqlpp::time_point, sqlpp::tag::can_be_null>; - }; + using _traits = ::sqlpp::make_traits<::sqlpp::time_point, sqlpp::tag::can_be_null >; + }; - struct Symbol { - struct _alias_t { - static constexpr const char _literal[] = R"("symbol")"; - using _name_t = sqlpp::make_char_sequence; - template - struct _member_t { - T symbol; - T &operator()() { return symbol; } - const T &operator()() const { return symbol; } - }; - }; + struct Symbol { + struct _alias_t { + static constexpr const char _literal[] = R"("symbol")"; + using _name_t = sqlpp::make_char_sequence< sizeof(_literal), _literal >; + template < typename T > + struct _member_t { + T symbol; + T & operator()() { + return symbol; + } + const T & operator()() const { + return symbol; + } + }; + }; - using _traits = ::sqlpp::make_traits<::sqlpp::text, sqlpp::tag::require_insert>; - }; + using _traits = ::sqlpp::make_traits<::sqlpp::text, sqlpp::tag::require_insert >; + }; - struct Description { - struct _alias_t { - static constexpr const char _literal[] = R"("description")"; - using _name_t = sqlpp::make_char_sequence; - template - struct _member_t { - T description; - T &operator()() { return description; } - const T &operator()() const { return description; } - }; - }; + struct Description { + struct _alias_t { + static constexpr const char _literal[] = R"("description")"; + using _name_t = sqlpp::make_char_sequence< sizeof(_literal), _literal >; + template < typename T > + struct _member_t { + T description; + T & operator()() { + return description; + } + const T & operator()() const { + return description; + } + }; + }; - using _traits = ::sqlpp::make_traits<::sqlpp::text, sqlpp::tag::can_be_null>; - }; + using _traits = ::sqlpp::make_traits<::sqlpp::text, sqlpp::tag::can_be_null >; + }; - struct Dimension_symbol { - struct _alias_t { - static constexpr const char _literal[] = R"("dimension_symbol")"; - using _name_t = sqlpp::make_char_sequence; - template - struct _member_t { - T dimension_symbol; - T &operator()() { return dimension_symbol; } - const T &operator()() const { return dimension_symbol; } - }; - }; + struct Dimension_symbol { + struct _alias_t { + static constexpr const char _literal[] = R"("dimension_symbol")"; + using _name_t = sqlpp::make_char_sequence< sizeof(_literal), _literal >; + template < typename T > + struct _member_t { + T dimension_symbol; + T & operator()() { + return dimension_symbol; + } + const T & operator()() const { + return dimension_symbol; + } + }; + }; - using _traits = ::sqlpp::make_traits<::sqlpp::text, sqlpp::tag::can_be_null>; - }; - } + using _traits = ::sqlpp::make_traits<::sqlpp::text, sqlpp::tag::can_be_null >; + }; +} // namespace unit_ - struct unit : sqlpp::table_t { - using _value_type = sqlpp::no_value_t; - struct _alias_t { - static constexpr const char _literal[] = R"("unit")"; - using _name_t = sqlpp::make_char_sequence; - template - struct _member_t { - T unit; - T &operator()() { return unit; } - const T &operator()() const { return unit; } - }; - }; - }; -} - -#endif +struct unit : sqlpp::table_t< unit, + unit_::Id, + unit_::Owner, + unit_::Group, + unit_::Unixperms, + unit_::Status, + unit_::Name, + unit_::Created, + unit_::Updated, + unit_::Symbol, + unit_::Description, + unit_::Dimension_symbol > { + using _value_type = sqlpp::no_value_t; + struct _alias_t { + static constexpr const char _literal[] = R"("unit")"; + using _name_t = sqlpp::make_char_sequence< sizeof(_literal), _literal >; + template < typename T > + struct _member_t { + T unit; + T & operator()() { + return unit; + } + const T & operator()() const { + return unit; + } + }; + }; +}; +} // namespace eedb::db diff --git a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/user_audit.h b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/user_audit.h index 8aa78a6..ff5a3c0 100644 --- a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/user_audit.h +++ b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/user_audit.h @@ -1,11 +1,10 @@ -#ifndef EEDB_USER_AUDIT_H -#define EEDB_USER_AUDIT_H +#pragma once #include #include #include -namespace eedb { +namespace eedb::db { namespace user_audit_ { @@ -105,4 +104,3 @@ namespace eedb { }; } -#endif diff --git a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/user_audit_action.h b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/user_audit_action.h index ade24dc..b1b9f3d 100644 --- a/src/libs/db/postgresql_connector/include/eedb/db/pg/model/user_audit_action.h +++ b/src/libs/db/postgresql_connector/include/eedb/db/pg/model/user_audit_action.h @@ -1,11 +1,11 @@ -#ifndef EEDB_USER_AUDIT_ACTION_H -#define EEDB_USER_AUDIT_ACTION_H +#ifndef EEDB::DB_USER_AUDIT_ACTION_H +#define EEDB::DB_USER_AUDIT_ACTION_H #include #include #include -namespace eedb { +namespace eedb::db { namespace user_audit_action_ { diff --git a/src/libs/db/postgresql_connector/mock/include/eedb/mock/db/pg/CategoryMock.hpp b/src/libs/db/postgresql_connector/mock/include/eedb/mock/db/pg/CategoryMock.hpp index db21227..42819e0 100644 --- a/src/libs/db/postgresql_connector/mock/include/eedb/mock/db/pg/CategoryMock.hpp +++ b/src/libs/db/postgresql_connector/mock/include/eedb/mock/db/pg/CategoryMock.hpp @@ -10,6 +10,8 @@ #include #include +#include + namespace eedb::db::pg { class CategoryMock : public ::eedb::CategoryMock { @@ -27,7 +29,7 @@ class CategoryMock : public ::eedb::CategoryMock { } public: - CategoryMock(PgConnection & db) : _db{db} {} + CategoryMock(PgConnection & db, User *u) : _db{db}, _u{u} {} void _init_simple(std::string name) { _root_guard(); @@ -37,7 +39,9 @@ class CategoryMock : public ::eedb::CategoryMock { void _initRoot() { using namespace testing; _root_id = _db(sqlpp::postgresql::insert_into(t_category) // - .set(t_category.name = "root", t_category.parent_id = sqlpp::null) + .set(t_category.name = "root", // + t_category.parent_id = sqlpp::null, + t_category.owner = _u->uid()) .returning(t_category.id)) .front() .id; @@ -45,6 +49,7 @@ class CategoryMock : public ::eedb::CategoryMock { private: PgConnection & _db; + User * _u{nullptr}; int64_t _root_id{0}; }; diff --git a/src/libs/db/postgresql_connector/src/data/PgAuthIdentity.cpp b/src/libs/db/postgresql_connector/src/data/PgAuthIdentity.cpp index aa040a9..30ac4d2 100644 --- a/src/libs/db/postgresql_connector/src/data/PgAuthIdentity.cpp +++ b/src/libs/db/postgresql_connector/src/data/PgAuthIdentity.cpp @@ -7,7 +7,7 @@ #include #include -constexpr eedb::auth_identity t_auth_identity; +constexpr eedb::db::auth_identity t_auth_identity; namespace eedb { diff --git a/src/libs/db/postgresql_connector/src/data/PgAuthToken.cpp b/src/libs/db/postgresql_connector/src/data/PgAuthToken.cpp index c73b8b8..8e04d82 100644 --- a/src/libs/db/postgresql_connector/src/data/PgAuthToken.cpp +++ b/src/libs/db/postgresql_connector/src/data/PgAuthToken.cpp @@ -11,7 +11,7 @@ #include -constexpr eedb::auth_token t_auth_token; +constexpr eedb::db::auth_token t_auth_token; namespace eedb { diff --git a/src/libs/db/postgresql_connector/src/data/PgItemsRepository.cpp b/src/libs/db/postgresql_connector/src/data/PgItemsRepository.cpp index 327c566..5032406 100644 --- a/src/libs/db/postgresql_connector/src/data/PgItemsRepository.cpp +++ b/src/libs/db/postgresql_connector/src/data/PgItemsRepository.cpp @@ -12,14 +12,10 @@ struct PgItemsRepository::PgItemsRepositoryPriv {}; PgItemsRepository::PgItemsRepository(db::PgConnection & db, User * owner) : _priv{spimpl::make_unique_impl< PgItemsRepositoryPriv >()} {} -std::unique_ptr< Item > PgItemsRepository::create(item::Identyfier id, Values values, std::optional< item::Foto >) const { +void PgItemsRepository::create(item::Identyfier id, Values values, std::optional< item::Foto >) const { auto attributes = nlohmann::json(); values.serialize(attributes); - - std::cout< PgItemsRepository::search(const ItemQueryFilters & filer) const { diff --git a/src/libs/db/postgresql_connector/src/data/PgUsers.cpp b/src/libs/db/postgresql_connector/src/data/PgUsers.cpp index c6e9511..2724d70 100644 --- a/src/libs/db/postgresql_connector/src/data/PgUsers.cpp +++ b/src/libs/db/postgresql_connector/src/data/PgUsers.cpp @@ -14,9 +14,9 @@ #include -constexpr eedb::auth_identity t_auth_identity; -constexpr eedb::auth_info t_auth_info; -constexpr eedb::auth_token t_auth_token; +constexpr eedb::db::auth_identity t_auth_identity; +constexpr eedb::db::auth_info t_auth_info; +constexpr eedb::db::auth_token t_auth_token; namespace eedb { diff --git a/src/libs/db/postgresql_connector/test/test_eedb_data_PgItemsRepository.cpp b/src/libs/db/postgresql_connector/test/test_eedb_data_PgItemsRepository.cpp index cbef3c2..9ccfa19 100644 --- a/src/libs/db/postgresql_connector/test/test_eedb_data_PgItemsRepository.cpp +++ b/src/libs/db/postgresql_connector/test/test_eedb_data_PgItemsRepository.cpp @@ -14,13 +14,15 @@ class PgItemsRepositoryTest : public DbTestBase< PgItemsRepositoryTest > { public: - PgItemsRepositoryTest() : user{db()}, category{db()}, numericParameter{db()}, textParameter{db()} { + PgItemsRepositoryTest() : user{db()}, category{db(), &user}, numericParameter{db()}, textParameter{db()}, listParameter{db()} { using namespace testing; db().native()->start_transaction(); user._init(); // create fake user + user._expect_call_uid(); category._init_simple("main"); numericParameter._init("numeric"); textParameter._init("text"); + listParameter._init("list"); sut = std::make_unique< eedb::PgItemsRepository >(db(), &user); } @@ -30,7 +32,14 @@ class PgItemsRepositoryTest : public DbTestBase< PgItemsRepositoryTest > { } auto some_val() { using namespace std::string_literals; - return eedb::Values(eedb::Value{5, &numericParameter}, eedb::Value{"some text"s, &textParameter}); + using namespace testing; + EXPECT_CALL(numericParameter, name()).WillRepeatedly(Return("numeric parameter"s)); + EXPECT_CALL(textParameter, name()).WillRepeatedly(Return("text parameter"s)); + EXPECT_CALL(listParameter, name()).WillRepeatedly(Return("list parameter"s)); + + return eedb::Values(eedb::Value{5, &numericParameter}, + eedb::Value{"some text"s, &textParameter}, + eedb::Value{std::vector{1.2, 3.4, 5.6, 7.8}, &listParameter}); } ~PgItemsRepositoryTest() { @@ -40,7 +49,7 @@ class PgItemsRepositoryTest : public DbTestBase< PgItemsRepositoryTest > { protected: eedb::db::pg::UserMock user; eedb::db::pg::CategoryMock category; - eedb::db::pg::ParameterMock numericParameter, textParameter; + eedb::db::pg::ParameterMock numericParameter, textParameter, listParameter; int64_t sutId; std::unique_ptr< eedb::PgItemsRepository > sut; @@ -49,13 +58,13 @@ class PgItemsRepositoryTest : public DbTestBase< PgItemsRepositoryTest > { template <> std::unique_ptr< PgTestDatabasePrepare > DbTestBase< PgItemsRepositoryTest >::_test_db = {}; -TEST_F(PgItemsRepositoryTest, createParameterDontfail) { - EXPECT_TRUE(sut->create(some_id(), some_val(), {})); +TEST_F(PgItemsRepositoryTest, createItemDontFail) { + EXPECT_NO_THROW(sut->create(some_id(), some_val(), {})); } -TEST_F(PgItemsRepositoryTest, createReturnsValidParameter) { - auto item = sut->create(some_id(), some_val(), {}); - ASSERT_TRUE(item); - EXPECT_EQ(item->displayName(), "AM2DM-2415SH60"); - // EXPECT_EQ(item->values()) -} +// TEST_F(PgItemsRepositoryTest, createReturnsValidParameter) { +// auto item = sut->create(some_id(), some_val(), {}); +// ASSERT_TRUE(item); +// EXPECT_EQ(item->displayName(), "AM2DM-2415SH60"); +// // EXPECT_EQ(item->values()) +//} diff --git a/src/libs/eedb/include/eedb/Value.hpp b/src/libs/eedb/include/eedb/Value.hpp index 93c360e..0914b94 100644 --- a/src/libs/eedb/include/eedb/Value.hpp +++ b/src/libs/eedb/include/eedb/Value.hpp @@ -98,10 +98,7 @@ class Value { Value & operator=(Value &&) = default; void serialize(nlohmann::json & json) const { - json["value"] = _value->serializeValue(); - - if(_parameter) - json["parameter"] = std::string{_parameter->name()}; + json[std::string{_parameter->name()}] = _value->serializeValue(); } nlohmann::json serialize() const { @@ -151,10 +148,8 @@ class Values { } bool serialize(nlohmann::json & json) const { - json["values"] = nlohmann::json::array(); - for(const auto & value : *this) { - value.serialize(json); - } + std::transform( + begin(), end(), std::back_inserter(json["values"]), [](const auto & value) { return value.serialize(); }); return true; } diff --git a/src/libs/eedb/include/eedb/db/Item.hpp b/src/libs/eedb/include/eedb/db/Item.hpp index e4506ea..bbf31cd 100644 --- a/src/libs/eedb/include/eedb/db/Item.hpp +++ b/src/libs/eedb/include/eedb/db/Item.hpp @@ -74,9 +74,8 @@ class ItemsRepository { * @brief create * @param id * @param values - * @return */ - virtual std::unique_ptr< Item > create(item::Identyfier id, Values values, std::optional< item::Foto >) const = 0; + virtual void create(item::Identyfier id, Values values, std::optional< item::Foto >) const = 0; /** * @brief search diff --git a/src/libs/eedb/test/test_Value.cpp b/src/libs/eedb/test/test_Value.cpp index bf9655b..fa00988 100644 --- a/src/libs/eedb/test/test_Value.cpp +++ b/src/libs/eedb/test/test_Value.cpp @@ -24,7 +24,7 @@ TEST_F(ValueTest, serializeInt) { auto json = nlohmann::json{}; _int.serialize(json); - EXPECT_EQ(json, (nlohmann::json{{"value", 4.0}, {"parameter", "parameter name"}})); + EXPECT_EQ(json, (nlohmann::json{{"parameter name", 4.0}})); } TEST_F(ValueTest, serializeDouble) { @@ -34,7 +34,7 @@ TEST_F(ValueTest, serializeDouble) { auto json = nlohmann::json{}; _double.serialize(json); - EXPECT_EQ(json, (nlohmann::json{{"value", 4.0}, {"parameter", "parameter name"}})); + EXPECT_EQ(json, (nlohmann::json{{"parameter name", 4.0}})); } TEST_F(ValueTest, serializeString) { @@ -44,7 +44,7 @@ TEST_F(ValueTest, serializeString) { auto json = nlohmann::json{}; _string.serialize(json); - EXPECT_EQ(json, (nlohmann::json{{"value", "asdfghjkl"}, {"parameter", "parameter name"}})); + EXPECT_EQ(json, (nlohmann::json{{"parameter name", "asdfghjkl"}})); } TEST_F(ValueTest, serializeListOfInts) { @@ -52,7 +52,7 @@ TEST_F(ValueTest, serializeListOfInts) { eedb::Value _intList{std::vector{1, 2, 3, 4, 5, 6}, ¶meter}; - EXPECT_EQ(_intList.serialize(), (nlohmann::json{{"value", {1, 2, 3, 4, 5, 6}}, {"parameter", "parameter name"}})); + EXPECT_EQ(_intList.serialize(), (nlohmann::json{{"parameter name", {1, 2, 3, 4, 5, 6}}})); } TEST_F(ValueTest, serializeListOfStrings) { @@ -63,7 +63,7 @@ TEST_F(ValueTest, serializeListOfStrings) { auto json = nlohmann::json{}; _stringList.serialize(json); - EXPECT_EQ(json, (nlohmann::json{{"value", {"a"s, "b"s, "c"s}}, {"parameter", "parameter name"}})); + EXPECT_EQ(json, (nlohmann::json{{"parameter name", {"a"s, "b"s, "c"s}}})); } TEST_F(ValueTest, serializeListOfRange) { @@ -73,6 +73,6 @@ TEST_F(ValueTest, serializeListOfRange) { auto json = nlohmann::json{}; _range.serialize(json); - EXPECT_EQ(json, (nlohmann::json{{"value", {{"min", 0.001}, {"max", 1000.0}}}, {"parameter", "parameter name"}})); + EXPECT_EQ(json, (nlohmann::json{{"parameter name", {{"min", 0.001}, {"max", 1000.0}}}})); } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt deleted file mode 100644 index 5275af8..0000000 --- a/tests/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -project(eedb_tests) - -add_subdirectory(utils) -add_subdirectory(unit) diff --git a/tests/mocks/SessionMock.hpp b/tests/mocks/SessionMock.hpp deleted file mode 100644 index 47fb651..0000000 --- a/tests/mocks/SessionMock.hpp +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once -#include - -#include - -#include - -#include -#include - -namespace eedb { -class SessionMock final : public Session { - // Session interface - public: - MOCK_METHOD0(db, eedb::db::PgConnection &()); - MOCK_CONST_METHOD0(enviroment, const Wt::WEnvironment &()); - MOCK_METHOD0(login, Wt::Auth::Login &()); -}; -} diff --git a/tests/mocks/db/UserDatabaseMock.hpp b/tests/mocks/db/UserDatabaseMock.hpp deleted file mode 100644 index 0f2c4cb..0000000 --- a/tests/mocks/db/UserDatabaseMock.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#include - -class AbstracUserDatabaseMock : public Wt::Auth::AbstractUserDatabase { - // AbstractUserDatabase interface - public: - Wt::Auth::User findWithId(const std::string & id) const {} - Wt::Auth::User findWithIdentity(const std::string & provider, const Wt::WString & identity) const {} - void addIdentity(const Wt::Auth::User & user, const std::string & provider, const Wt::WString & id) {} - Wt::WString identity(const Wt::Auth::User & user, const std::string & provider) const {} - void removeIdentity(const Wt::Auth::User & user, const std::string & provider) {} -}; diff --git a/tests/mocks/widgets/AuthPageMock.hpp b/tests/mocks/widgets/AuthPageMock.hpp deleted file mode 100644 index f78226b..0000000 --- a/tests/mocks/widgets/AuthPageMock.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once -#include - -#include - -#include - -namespace eedb { -class AuthPageMock final : public AuthPage { - public: - AuthPageMock() {} - - public: - MOCK_METHOD0(detachWidget, std::unique_ptr< Wt::Auth::AuthWidget >()); - - MOCK_METHOD1(registerOnNeedVerification, void(std::function< void() > f)); - MOCK_METHOD1(registerOnUserWeakLogin, void(std::function< void() > f)); - MOCK_METHOD1(registerOnUserStrongLogin, void(std::function< void() > f)); - MOCK_METHOD1(registerOnUserLogout, void(std::function< void() > f)); -}; -} // namespace eedb diff --git a/tests/mocks/widgets/MainPageMock.hpp b/tests/mocks/widgets/MainPageMock.hpp deleted file mode 100644 index 9476fcf..0000000 --- a/tests/mocks/widgets/MainPageMock.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include - -#include - -namespace eedb { -class HomePageMock final : public HomePage { - // HomePage interface - public: - MOCK_METHOD1(attachTo, void(Wt::WContainerWidget * parent)); -}; -} diff --git a/tests/mocks/widgets/NavigationBarMock.hpp b/tests/mocks/widgets/NavigationBarMock.hpp deleted file mode 100644 index fd5cd5f..0000000 --- a/tests/mocks/widgets/NavigationBarMock.hpp +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -#include - -#include - -namespace eedb { -class NavigationBarMock final : public NavigationBar { - public: - NavigationBarMock() {} - - public: - MOCK_METHOD1(attachTo, void(Wt::WContainerWidget * parent)); - MOCK_METHOD0(detach, void()); - - MOCK_METHOD1(registerLogoutAction, void(std::function< void() > f)); -}; -} diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt deleted file mode 100644 index 47fc51e..0000000 --- a/tests/unit/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -cmake_minimum_required(VERSION 3.0.2) - -project(Tests LANGUAGES CXX) - -include_directories( ../ ) - -include_directories( ${eedb_app_SOURCE_DIR} ) -include_directories( ${gtest_SOURCE_DIR}/include) -include_directories( ${gmock_SOURCE_DIR}/include) - -#if(enable_tests) - set(TEST_EXECUTABLE_NAME eedb_test ) - - #add test files - file(GLOB_RECURSE TEST_FILES test_*.cpp ) - file(GLOB_RECURSE MOCK_FILES ../mocks/* ) - - INCLUDE_DIRECTORIES(${PostgreSQL_INCLUDE_DIRS}) - add_executable( ${TEST_EXECUTABLE_NAME} ${TEST_FILES} ${MOCK_FILES} ) - - target_link_libraries( ${TEST_EXECUTABLE_NAME} GMock::main wt wttest eedb_db eedb_auth eedb_app ${Boost_LIBRARIES} stdc++fs) - - add_test( ${TEST_EXECUTABLE_NAME} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TEST_EXECUTABLE_NAME}) -#endif() - -if(enable_benchmarks) - add_subdirectory(benchmarks) -endif() diff --git a/tests/unit/WidgetTest.hpp b/tests/unit/WidgetTest.hpp deleted file mode 100644 index 9ad49ca..0000000 --- a/tests/unit/WidgetTest.hpp +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once -#include - -#include -#include - -class WidgetTest : public testing::Test { - public: - WidgetTest() : app(env) {} - - template < typename T > - T * ut_find(std::string && id) { - T * item = dynamic_cast< T * >(app.findWidget(id)); - _assert_nut_null(item); - return item; - } - - protected: - Wt::Test::WTestEnvironment env; - Wt::WApplication app; - - private: - template < typename T > - void _assert_nut_null(T * t) { - ASSERT_TRUE(t != nullptr); - } -}; diff --git a/tests/unit/main.cpp b/tests/unit/main.cpp deleted file mode 100644 index cf3c757..0000000 --- a/tests/unit/main.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include - -int main(int argc, char * argv[]) { - // Init gtest. - testing::InitGoogleTest(&argc, argv); - - // Run all tests. - int result = RUN_ALL_TESTS(); - - return result; -} diff --git a/tests/unit/test_eedb_CategoriesTree.cpp b/tests/unit/test_eedb_CategoriesTree.cpp deleted file mode 100644 index 24a1268..0000000 --- a/tests/unit/test_eedb_CategoriesTree.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "WidgetTest.hpp" - -#include - -#include - -class CategoriesTreeTest : public WidgetTest { - public: - CategoriesTreeTest() : WidgetTest(), sut(std::make_unique< eedb::DefaultCategoriesTree >()) { - sut->attachTo(app.root()); - } - auto find_tree() { - return ut_find< Wt::WTreeView >("home.categories"); - } - - protected: - std::unique_ptr< eedb::DefaultCategoriesTree > sut; -}; - -TEST_F(CategoriesTreeTest, hasElements) { - find_tree(); -} diff --git a/tests/unit/test_eedb_DefaultAuthPage.cpp b/tests/unit/test_eedb_DefaultAuthPage.cpp deleted file mode 100644 index c617a99..0000000 --- a/tests/unit/test_eedb_DefaultAuthPage.cpp +++ /dev/null @@ -1,83 +0,0 @@ -#include - -#include "utils/UniquePtrMockWrapper.hpp" - -#include "mocks/SessionMock.hpp" -#include "mocks/db/UserDatabaseMock.hpp" -#include "mocks/widgets/MainPageMock.hpp" - -#include -#include -#include - -///TODO change to mocked version -#include - -#include - -using namespace testing; - -class DefaultAuthPageTest : public Test { - public: - DefaultAuthPageTest() : app(env) { - createApp(); - } - - void createApp() { - auto services = eedb::auth::Services(); - // auto session = std::make_unique< eedb::SessionMock >(); - - // const eedb::auth::Services & baseAuth, - // std::unique_ptr< Wt::Auth::AbstractUserDatabase > userDatabase, - // Wt::Auth::Login & session - - // EXPECT_CALL(*session, login()).WillOnce(ReturnRef(login)); - - // homePage = std::make_unique< eedb::Home >(*session); - // sut = dynamic_cast< eedb::Home * >(homePage.get()); - - // EXPECT_CALL(*session, enviroment()).WillOnce(ReturnRef(env)); -// sut = new eedb::AuthPageImpl(services, session.login()); - sut = std::make_unique< eedb::DefaultAuthPage >(services, std::move(usedDatabaseMock), login); - } - - protected: - Wt::Test::WTestEnvironment env; - Wt::Auth::Login login; - - std::unique_ptr usedDatabaseMock; - - std::function< void() > strongLoginCallback; - Wt::WApplication app; - std::unique_ptr< eedb::DefaultAuthPage > sut; -}; - -TEST_F(DefaultAuthPageTest, createApp) { - auto menu = dynamic_cast< Wt::WPopupMenu * >(app.findWidget("home.navigation.session_menu_popup")); - auto menuItem = dynamic_cast< Wt::WMenuItem * >(app.findWidget("home.navigation.session_menu.logout")); - // menu->triggered().emit(menuItem); -} - -// TEST(a, b) { -// auto session = std::make_unique< eedb::SessionMock >(); -// EXPECT_CALL(*session, enviroment()).WillOnce(ReturnRef(env)); - -// sut = new eedb::EEDB(std::move(session), [this]() { return authPageFactory(); }, [this]() { return homePageFactory(); }); - -// // Wt::WPushButton * b = dynamic_cast< Wt::WPushButton * >(app.findWidget("startbutton")); - -// // Wt::WProgressBar * bar = dynamic_cast< Wt::WProgressBar * >(app.findWidget("progress")); - -// // b->clicked().emit(Wt::WMouseEvent()); - -// // environment.endRequest(); - -// // for(;;) { -// // boost::this_thread::sleep(boost::posix_time::milliseconds(50)); -// // std::cerr << "Progress: " << bar->value() << std::endl; -// // if(b->isEnabled()) -// // break; -// // } - -// // environment.startRequest(); -//} diff --git a/tests/unit/test_eedb_DefaultHomePage.cpp b/tests/unit/test_eedb_DefaultHomePage.cpp deleted file mode 100644 index 3897a78..0000000 --- a/tests/unit/test_eedb_DefaultHomePage.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "WidgetTest.hpp" - -#include "utils/UniquePtrMockWrapper.hpp" - -#include "mocks/SessionMock.hpp" -#include "mocks/widgets/NavigationBarMock.hpp" - -#include -#include - -#include - -class DefaultHomePageTests : public WidgetTest { - public: - DefaultHomePageTests() : WidgetTest(), sut(std::make_unique< eedb::DefaultHomePage >(session, navigationBar.getPtr())) { - sut->attachTo(app.root()); - } - - protected: - eedb::SessionMock session; - - UniquePtrMockWrapper< eedb::NavigationBarMock > navigationBar; - - std::unique_ptr< eedb::DefaultHomePage > sut; -}; - -// TEST_F(HomePageTests, ctor) {} diff --git a/tests/unit/test_eedb_DefaultNavigationBar.cpp b/tests/unit/test_eedb_DefaultNavigationBar.cpp deleted file mode 100644 index 5114f88..0000000 --- a/tests/unit/test_eedb_DefaultNavigationBar.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include "WidgetTest.hpp" - -#include - -#include -#include - -struct SimpleCallback { - MOCK_METHOD0(callback, void()); -}; - -class DefaultNavigationBarTests : public WidgetTest { - public: - DefaultNavigationBarTests() : WidgetTest(), sut(std::make_unique< eedb::DefaultNavigationBar >()) { - sut->attachTo(app.root()); - } - - auto find_logoutItem() { - return ut_find< Wt::WMenuItem >("navigation_bar.session_menu.logout"); - } - - auto find_homeItem() { - return ut_find< Wt::WMenuItem >("navigation_bar.home_menu"); - } - - auto find_navigationBar() { - return ut_find< Wt::WNavigationBar >("navigation_bar"); - } - - protected: - std::unique_ptr< eedb::DefaultNavigationBar > sut; -}; - -TEST_F(DefaultNavigationBarTests, hasAllNeededElements) { - find_logoutItem(); - find_homeItem(); - find_navigationBar(); -} - -TEST_F(DefaultNavigationBarTests, loginAction) { - SimpleCallback cb; - EXPECT_CALL(cb, callback()); - sut->registerLogoutAction([&]() { cb.callback(); }); - - auto logoutItem = find_logoutItem(); - logoutItem->triggered().emit(logoutItem); -} diff --git a/tests/unit/test_eedb_Item.cpp b/tests/unit/test_eedb_Item.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit/test_eedb_Items.cpp b/tests/unit/test_eedb_Items.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit/test_eedb_application.cpp b/tests/unit/test_eedb_application.cpp deleted file mode 100644 index 68dd2a1..0000000 --- a/tests/unit/test_eedb_application.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include - -#include "mocks/SessionMock.hpp" -#include "mocks/widgets/AuthPageMock.hpp" -#include "mocks/widgets/MainPageMock.hpp" - -#include "utils/UniquePtrMockWrapper.hpp" -#include -#include - -#include -#include -#include -#include - - -#include - -class AuthPageFactory { - public: - MOCK_METHOD0(impl, std::unique_ptr< eedb::AuthPage >()); - auto operator()() { - return impl(); - } -}; - -class HomePageFactory { - public: - MOCK_METHOD0(impl, std::unique_ptr< eedb::HomePage >()); - auto operator()() { - return impl(); - } -}; - -using namespace testing; - -class EedbApplicationTest : public Test { - public: - EedbApplicationTest() { - createApp(); - } - - void createApp() { - expectCreateAuthPage(); - - auto session = std::make_unique< eedb::SessionMock >(); - EXPECT_CALL(*session, enviroment()).WillOnce(ReturnRef(env)); - -// sut = new eedb::EEDB(std::move(session), [this]() { return authPageFactory(); }, [this]() { return homePageFactory(); }); - } - void expectCreateAuthPage() { - EXPECT_CALL(authPageFactory, impl()).WillOnce(Return(ByMove(authPage.getPtr()))); - - EXPECT_CALL(*authPage, registerOnNeedVerification(_)).WillOnce(SaveArg< 0 >(&_needVerificationCB)); - EXPECT_CALL(*authPage, registerOnUserWeakLogin(_)).WillOnce(SaveArg< 0 >(&_weakLoginCB)); - EXPECT_CALL(*authPage, registerOnUserStrongLogin(_)).WillOnce(SaveArg< 0 >(&_stringLoginCB)); - EXPECT_CALL(*authPage, registerOnUserLogout(_)).WillOnce(SaveArg< 0 >(&_userLogoutCB)); - } - - void expectCreateHomePage() { - EXPECT_CALL(homePageFactory, impl()).WillOnce(Return(ByMove(homePage.getPtr()))); -// EXPECT_CALL(*authPage, detach()); - EXPECT_CALL(*homePage, attachTo(_)); - } - - protected: - Wt::Test::WTestEnvironment env; - - std::function< void() > _stringLoginCB; - std::function< void() > _weakLoginCB; - std::function< void() > _userLogoutCB; - std::function< void() > _needVerificationCB; - - UniquePtrMockWrapper< eedb::AuthPageMock > authPage; - AuthPageFactory authPageFactory; - - UniquePtrMockWrapper< eedb::HomePageMock > homePage; - HomePageFactory homePageFactory; - - eedb::EEDB * sut; -}; - -//TEST_F(EedbApplicationTest, createApp) {} - -//TEST_F(EedbApplicationTest, strongLoginCreatesMainPage) { -// expectCreateHomePage(); -//// _stringLoginCB(); -//} - -//TEST_F(EedbApplicationTest, weakLoginCreatesMainPage) { -// expectCreateHomePage(); -//// _weakLoginCB(); -//} diff --git a/tests/utils/CMakeLists.txt b/tests/utils/CMakeLists.txt deleted file mode 100644 index e139f43..0000000 --- a/tests/utils/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -include_directories( . )