Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include "Utilities/TMPL.hpp"
7 :
8 : namespace Options {
9 : namespace detail {
10 : template <typename FactoryClasses, typename... NewClasses>
11 : struct add_factory_classes;
12 :
13 : template <typename FactoryClasses, typename BaseClass, typename NewClasses,
14 : typename... RestNewClasses>
15 : struct add_factory_classes<FactoryClasses, tmpl::pair<BaseClass, NewClasses>,
16 : RestNewClasses...>
17 : : add_factory_classes<
18 : tmpl::insert<
19 : tmpl::erase<FactoryClasses, BaseClass>,
20 : tmpl::pair<
21 : BaseClass,
22 : tmpl::remove_duplicates<tmpl::append<
23 : tmpl::conditional_t<
24 : tmpl::has_key<FactoryClasses, BaseClass>::value,
25 : tmpl::at<FactoryClasses, BaseClass>, tmpl::list<>>,
26 : NewClasses>>>>,
27 : RestNewClasses...> {};
28 :
29 : template <typename FactoryClasses>
30 : struct add_factory_classes<FactoryClasses> {
31 : using type = FactoryClasses;
32 : };
33 : } // namespace detail
34 :
35 : /// Add new factory-creatable classes to the list in a
36 : /// `factory_creation` struct.
37 : ///
38 : /// For each `tmpl::pair<Base, DerivedList>` in the `NewClasses`
39 : /// parameter pack, append the classes in `DerivedList` to the list
40 : /// for `Base` in `FactoryClasses`. The `FactoryClasses` map need not
41 : /// have a preexisting entry for `Base`.
42 : ///
43 : /// This example adds three new derived classes, two for one base
44 : /// class and one for another.
45 : ///
46 : /// \snippet Test_FactoryHelpers.cpp add_factory_classes
47 : ///
48 : /// \see Options::protocols::FactoryCreation
49 : template <typename FactoryClasses, typename... NewClasses>
50 1 : using add_factory_classes =
51 : typename detail::add_factory_classes<FactoryClasses, NewClasses...>::type;
52 : } // namespace Options
|