GKD.RoboCtrl
载入中...
搜索中...
未找到
multiton.hpp
浏览该文件的文档.
1
17#pragma once
18
19#include <concepts>
20#include <initializer_list>
21#include <stdexcept>
22#include <string>
23#include <unordered_map>
24#include <memory>
25#include <mutex>
26#include <format>
27#include <utility>
28
29#include "utils/concepts.hpp"
30#include "utils/singleton.hpp"
31
32namespace roboctrl{
33
46namespace multiton{
51template <typename T>
52concept descable = requires (const T& t) {
53 { t.desc() } -> std::same_as<std::string>;
54};
55
61template<typename T>
62concept multiton_info = requires(T info){
63 typename T::key_type;
64 typename T::owner_type;
65 {info.key()} -> std::same_as<typename T::key_type>;
66};
67
71template<typename T>
73
82template<typename T>
83concept owner = requires(T owner){
84 typename T::info_type;
85 {T(std::declval<typename T::info_type>())};
86};
87
89template<multiton_info T>
90using key_type_t = typename T::key_type;
91
92
94template<multiton_info T>
95using owner_type_t = typename T::owner_type;
96
98namespace details{
99
100template <typename owner_type>
104
105 using key_type = typename owner_type::info_type::key_type;
106
107 static std::mutex mutex_;
108 static std::unordered_map<key_type, std::unique_ptr<owner_type>> instances;
109
110 using info_type = typename owner_type::info_type;
111
112 static void init(const info_type& info){
113 std::lock_guard<std::mutex> lock{mutex_};
114
115 auto instance = std::make_unique<owner_type>(info);
116 owner_type& ret = *instance;
117 instances.emplace(info.key(), std::move(instance));
118 }
119
120 [[nodiscard]]
121 static bool contains(const key_type& key){
122 return instances.contains(key);
123 }
124
125 [[nodiscard]]
126 static auto get(const key_type& key) -> owner_type& {
127 std::lock_guard<std::mutex> lock { mutex_ };
128 auto it = instances.find(key);
129 if (it != instances.end()) {
130 return *it->second;
131 }
132
133 throw std::runtime_error(std::format("uninitialized multiton {}",key)); //TODO:add detailed desc.
134 };
135};
136
137template<multiton_info info_type>
139
140template <typename owner_type>
142
143template <typename owner_type>
144std::unordered_map<
145 typename multiton_impl<owner_type>::key_type,
146 std::unique_ptr<owner_type>
147> multiton_impl<owner_type>::instances {};
148}
149
163template<owner owner_type>
164[[nodiscard]]
165inline auto get(const typename details::multiton_impl<owner_type>::key_type& key) -> owner_type&{
167}
168
181template<typename T>
182 requires(!owner<T> && utils::singleton<T>)
183inline auto get() -> T&{
184 return T::instance();
185}
186
204template<info info_type>
205inline auto init(const info_type& info) -> bool{
206 if constexpr (multiton_info<info_type>){
208 return true;
209 }
210 else return get<typename info_type::owner_type>().init(info);
211}
212
213template<info info_type>
214inline auto init(std::initializer_list<info_type> infos) -> bool{
215 for(auto info:infos)
216 if(!init(info))
218
219 return true;
220}
221
229template<info... info_types>
230inline auto init(const info auto& info,const info_types&... infos) -> bool{
231 if(init(info))
232 return init(infos...);
233 return false;
234}
235
243template<multiton_info info_type>
244[[nodiscard]]
245inline auto get(const info_type& info) -> owner_type_t<info_type>&{
246 using owner_type = owner_type_t<info_type>;
247 auto key = info.key();
250
252}
253
261[[nodiscard]]
262inline auto desc(const descable auto& owner) -> std::string{
263 return owner.desc();
264}
265
266template<owner owner_type>
267auto instances(){
269}
270
271}
272
273using namespace multiton;
274}
拥有描述信息的类。
Definition multiton.hpp:52
通用的info concept,主要用于统一单例和多例的info概念。这个concept的主要目的是让单例和多例都可以被roboctrl::get获取。
Definition multiton.hpp:72
多例类的info_type concept
Definition multiton.hpp:62
描述多例类的concept
Definition multiton.hpp:83
公共Concept与元类型工具。
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:42
auto get() -> T &
获取单例实例
Definition multiton.hpp:183
auto desc(const descable auto &owner) -> std::string
获取一个可描述对象的描述信息
Definition multiton.hpp:262
auto init(const info_type &info) -> bool
初始化多例实例或单例实例
Definition multiton.hpp:205
快速继承获得“不可移动”约束的基类。
Definition concepts.hpp:59
快速继承获得“不可复制”约束的基类。
Definition concepts.hpp:68