Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
container_integration.cpp
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
15
17#include <unordered_map>
18#include <mutex>
19#include <cstring>
20
22
23#if KCENON_WITH_CONTAINER_SYSTEM
24// container_system_adapter implementation
25container_system_adapter::container_system_adapter(
26 std::shared_ptr<container_module::value_container> container
27) : container_(container) {
28}
29
30std::vector<uint8_t> container_system_adapter::serialize(const std::any& data) const {
31 if (!container_) {
32 return {};
33 }
34
35 // Convert std::any to container format and serialize
36 // This is a simplified implementation - actual implementation would
37 // depend on container_system's API
38 try {
39 if (data.type() == typeid(std::string)) {
40 auto str = std::any_cast<std::string>(data);
41 return std::vector<uint8_t>(str.begin(), str.end());
42 }
43 // Add more type conversions as needed
44 } catch (const std::bad_any_cast&) {
45 // Handle conversion error
46 }
47
48 return {};
49}
50
51std::any container_system_adapter::deserialize(const std::vector<uint8_t>& bytes) const {
52 if (!container_ || bytes.empty()) {
53 return std::any{};
54 }
55
56 // Deserialize bytes to container format and convert to std::any
57 // This is a simplified implementation
58 std::string str(bytes.begin(), bytes.end());
59 return std::any(str);
60}
61
62std::string container_system_adapter::type_name() const {
63 return "container_system_adapter";
64}
65
66bool container_system_adapter::is_valid() const {
67 return container_ != nullptr;
68}
69
70std::shared_ptr<container_module::value_container>
71container_system_adapter::get_container() const {
72 return container_;
73}
74#endif
75
76// basic_container implementation
78public:
79 impl() = default;
80
81 std::vector<uint8_t> serialize(const std::any& data) const {
82 if (custom_serializer_) {
83 return custom_serializer_(data);
84 }
85
86 // Default serialization for common types
87 try {
88 if (data.type() == typeid(std::string)) {
89 auto str = std::any_cast<std::string>(data);
90 return std::vector<uint8_t>(str.begin(), str.end());
91 } else if (data.type() == typeid(int)) {
92 auto val = std::any_cast<int>(data);
93 std::vector<uint8_t> bytes(sizeof(int));
94 std::memcpy(bytes.data(), &val, sizeof(int));
95 return bytes;
96 } else if (data.type() == typeid(double)) {
97 auto val = std::any_cast<double>(data);
98 std::vector<uint8_t> bytes(sizeof(double));
99 std::memcpy(bytes.data(), &val, sizeof(double));
100 return bytes;
101 } else if (data.type() == typeid(bool)) {
102 auto val = std::any_cast<bool>(data);
103 return {static_cast<uint8_t>(val ? 1 : 0)};
104 }
105 } catch (const std::bad_any_cast&) {
106 // Return empty vector on error
107 }
108
109 return {};
110 }
111
112 std::any deserialize(const std::vector<uint8_t>& bytes) const {
113 if (custom_deserializer_) {
114 return custom_deserializer_(bytes);
115 }
116
117 // Default deserialization - assume string for simplicity
118 if (!bytes.empty()) {
119 return std::any(std::string(bytes.begin(), bytes.end()));
120 }
121
122 return std::any{};
123 }
124
126 std::function<std::vector<uint8_t>(const std::any&)> serializer
127 ) {
128 custom_serializer_ = serializer;
129 }
130
132 std::function<std::any(const std::vector<uint8_t>&)> deserializer
133 ) {
134 custom_deserializer_ = deserializer;
135 }
136
137private:
138 std::function<std::vector<uint8_t>(const std::any&)> custom_serializer_;
139 std::function<std::any(const std::vector<uint8_t>&)> custom_deserializer_;
140};
141
142basic_container::basic_container()
143 : pimpl_(std::make_unique<impl>()) {
144}
145
147
148std::vector<uint8_t> basic_container::serialize(const std::any& data) const {
149 return pimpl_->serialize(data);
150}
151
152std::any basic_container::deserialize(const std::vector<uint8_t>& bytes) const {
153 return pimpl_->deserialize(bytes);
154}
155
156std::string basic_container::type_name() const {
157 return "basic_container";
158}
159
161 return true;
162}
163
165 std::function<std::vector<uint8_t>(const std::any&)> serializer
166) {
167 pimpl_->set_serializer(serializer);
168}
169
171 std::function<std::any(const std::vector<uint8_t>&)> deserializer
172) {
173 pimpl_->set_deserializer(deserializer);
174}
175
176// container_manager implementation
178public:
179 impl() = default;
180
182 const std::string& name,
183 std::shared_ptr<container_interface> container
184 ) {
185 std::unique_lock<std::mutex> lock(mutex_);
186 containers_[name] = container;
187 }
188
189 std::shared_ptr<container_interface> get_container(
190 const std::string& name
191 ) const {
192 std::unique_lock<std::mutex> lock(mutex_);
193 auto it = containers_.find(name);
194 if (it != containers_.end()) {
195 return it->second;
196 }
197 return nullptr;
198 }
199
201 std::shared_ptr<container_interface> container
202 ) {
203 std::unique_lock<std::mutex> lock(mutex_);
204 default_container_ = container;
205 }
206
207 std::shared_ptr<container_interface> get_default_container() {
208 std::unique_lock<std::mutex> lock(mutex_);
209 if (!default_container_) {
210 default_container_ = std::make_shared<basic_container>();
211 }
212 return default_container_;
213 }
214
215 std::vector<uint8_t> serialize(const std::any& data) {
216 return get_default_container()->serialize(data);
217 }
218
219 std::any deserialize(const std::vector<uint8_t>& bytes) {
220 return get_default_container()->deserialize(bytes);
221 }
222
223 std::vector<std::string> list_containers() const {
224 std::unique_lock<std::mutex> lock(mutex_);
225 std::vector<std::string> names;
226 names.reserve(containers_.size());
227 for (const auto& [name, _] : containers_) {
228 names.push_back(name);
229 }
230 return names;
231 }
232
233private:
234 mutable std::mutex mutex_;
235 std::unordered_map<std::string, std::shared_ptr<container_interface>> containers_;
236 std::shared_ptr<container_interface> default_container_;
237};
238
243
245 : pimpl_(std::make_unique<impl>()) {
246}
247
249
251 const std::string& name,
252 std::shared_ptr<container_interface> container
253) {
254 pimpl_->register_container(name, container);
255}
256
257std::shared_ptr<container_interface> container_manager::get_container(
258 const std::string& name
259) const {
260 return pimpl_->get_container(name);
261}
262
264 std::shared_ptr<container_interface> container
265) {
266 pimpl_->set_default_container(container);
267}
268
269std::shared_ptr<container_interface> container_manager::get_default_container() {
271}
272
273std::vector<uint8_t> container_manager::serialize(const std::any& data) {
274 return pimpl_->serialize(data);
275}
276
277std::any container_manager::deserialize(const std::vector<uint8_t>& bytes) {
278 return pimpl_->deserialize(bytes);
279}
280
281std::vector<std::string> container_manager::list_containers() const {
282 return pimpl_->list_containers();
283}
284
285} // namespace kcenon::network::integration
std::any deserialize(const std::vector< uint8_t > &bytes) const
void set_deserializer(std::function< std::any(const std::vector< uint8_t > &)> deserializer)
std::vector< uint8_t > serialize(const std::any &data) const
std::function< std::vector< uint8_t >(const std::any &)> custom_serializer_
void set_serializer(std::function< std::vector< uint8_t >(const std::any &)> serializer)
std::function< std::any(const std::vector< uint8_t > &)> custom_deserializer_
bool is_valid() const override
Check if container is valid.
void set_deserializer(std::function< std::any(const std::vector< uint8_t > &)> deserializer)
Set custom deserializer.
std::vector< uint8_t > serialize(const std::any &data) const override
Serialize data to bytes.
std::any deserialize(const std::vector< uint8_t > &bytes) const override
Deserialize bytes to data.
void set_serializer(std::function< std::vector< uint8_t >(const std::any &)> serializer)
Set custom serializer.
std::string type_name() const override
Get container type name.
void set_default_container(std::shared_ptr< container_interface > container)
std::shared_ptr< container_interface > default_container_
std::unordered_map< std::string, std::shared_ptr< container_interface > > containers_
void register_container(const std::string &name, std::shared_ptr< container_interface > container)
std::vector< uint8_t > serialize(const std::any &data)
std::shared_ptr< container_interface > get_container(const std::string &name) const
std::any deserialize(const std::vector< uint8_t > &bytes)
std::shared_ptr< container_interface > get_default_container()
Manager for container system integration.
void register_container(const std::string &name, std::shared_ptr< container_interface > container)
Register a container implementation.
static container_manager & instance()
Get the singleton instance.
std::shared_ptr< container_interface > get_container(const std::string &name) const
Get a registered container.
std::shared_ptr< container_interface > get_default_container()
Get default container.
std::any deserialize(const std::vector< uint8_t > &bytes)
Deserialize using default container.
std::vector< uint8_t > serialize(const std::any &data)
Serialize using default container.
void set_default_container(std::shared_ptr< container_interface > container)
Set default container.
std::vector< std::string > list_containers() const
Get list of registered container names.
Container system integration interface for network_system.
Feature flags for network_system.