lintel 0.2.0
Loading...
Searching...
No Matches
Features.h
Go to the documentation of this file.
1#ifndef LINTEL_FEATURES_H
2#define LINTEL_FEATURES_H
3
4#include <cstdint>
5#include <functional>
6#include <magic_enum/magic_enum.hpp>
7#include <map>
8#include <memory>
9#include <string>
10#include <utility>
11#include <vector>
12
13// The DI container is only needed as an incomplete type here: ContainerBuilder
14// is passed by reference and Container travels inside a shared_ptr. Forward
15// declaring both keeps the container - and its heavier template machinery - out
16// of every translation unit that only talks to Features.
17namespace lintel {
18namespace di {
19 class Container;
20 class ContainerBuilder;
21}// namespace di
22}// namespace lintel
23
24namespace lintel {
34{
35public:
39 using InitializeFunc = std::function<void(std::shared_ptr<lintel::di::Container>)>;
40
46 template<typename T, std::enable_if_t<std::is_enum_v<T>> * = nullptr>
48 {
49 std::string name = std::string(magic_enum::enum_name(x));
50 m_features.push_back(name);
51 m_registerTypeMap.insert({ name, registerTypeFunc });
52 m_initializeMap.insert({ name, initializeFunc });
53 };
54
57 {
58 auto names = magic_enum::enum_names<Value>();
59 for (const auto &iter : names) { m_features.emplace_back(iter); }
60 }
61
65 void initializeOf(const std::string &featureName, std::shared_ptr<lintel::di::Container> container)
66 {
67 auto found = m_initializeMap.find(featureName);
68 if (found == m_initializeMap.end()) { return; }
69 found->second(std::move(container));
70 }
71
76 {
77 auto found = m_registerTypeMap.find(featureName);
78 if (found == m_registerTypeMap.end()) { return; }
79 found->second(builder);
80 }
81
84 std::vector<std::string> allOf() { return m_features; }
85
87 enum Value : std::uint8_t {
91 Cli
92 };
93
94private:
96 std::vector<std::string> m_features{};
98 std::map<std::string, RegisterTypeFunc> m_registerTypeMap;
100 std::map<std::string, InitializeFunc> m_initializeMap;
101};
102
103}// namespace lintel
104#endif// LINTEL_FEATURES_H
Definition Features.h:34
void initializeOf(const std::string &featureName, std::shared_ptr< lintel::di::Container > container)
Definition Features.h:65
std::vector< std::string > allOf()
Definition Features.h:84
Value
Definition Features.h:87
@ Base
Definition Features.h:88
@ Http
Definition Features.h:89
@ Property
Definition Features.h:90
@ Cli
Definition Features.h:91
void registerType(const std::string &featureName, lintel::di::ContainerBuilder &builder)
Definition Features.h:75
Features()
Definition Features.h:56
std::function< void(std::shared_ptr< lintel::di::Container >)> InitializeFunc
Definition Features.h:39
void registerFeature(T x, const RegisterTypeFunc &registerTypeFunc, const InitializeFunc &initializeFunc)
Definition Features.h:47
std::function< void(lintel::di::ContainerBuilder &)> RegisterTypeFunc
Definition Features.h:37
Definition Container.h:282
Definition BaseFeature.h:6
constexpr std::string_view type_name()
Definition TypeName.h:9