35 std::cout <<
"=== Basic Container Usage ===" << std::endl;
38 auto container = std::make_shared<value_container>();
41 container->set_source(
"example_client",
"session_001");
42 container->set_target(
"example_server",
"main_handler");
43 container->set_message_type(
"user_data");
45 std::cout <<
"Container created with:" << std::endl;
46 std::cout <<
" Source: " << container->source_id() <<
"/" << container->source_sub_id() << std::endl;
47 std::cout <<
" Target: " << container->target_id() <<
"/" << container->target_sub_id() << std::endl;
48 std::cout <<
" Type: " << container->message_type() << std::endl;
52 std::cout <<
"\n=== Value Types Demonstration ===" << std::endl;
54 auto container = std::make_shared<value_container>();
55 container->set_message_type(
"value_types_demo");
58 container->set(
"username", std::string(
"john_doe"));
59 std::cout <<
"Added string value: username = john_doe" << std::endl;
62 container->set(
"user_id",
static_cast<int32_t
>(12345));
63 std::cout <<
"Added int value: user_id = 12345" << std::endl;
66 auto timestamp = std::chrono::duration_cast<std::chrono::seconds>(
67 std::chrono::system_clock::now().time_since_epoch()).count();
68 container->set(
"timestamp",
static_cast<int64_t
>(timestamp));
69 std::cout <<
"Added long value: timestamp = " << timestamp << std::endl;
72 container->set(
"score", 98.5f);
73 std::cout <<
"Added float value: score = 98.5" << std::endl;
76 container->set(
"account_balance", 1500.75);
77 std::cout <<
"Added double value: account_balance = 1500.75" << std::endl;
80 container->set(
"is_active",
true);
81 std::cout <<
"Added bool value: is_active = true" << std::endl;
83 std::cout <<
"Total values added: 6" << std::endl;
87 std::cout <<
"\n=== Serialization Demonstration ===" << std::endl;
90 auto container = std::make_shared<value_container>();
91 container->set_source(
"serialize_test",
"test_session");
92 container->set_target(
"deserialize_test",
"test_handler");
93 container->set_message_type(
"serialization_test");
95 container->set(
"message", std::string(
"Hello, Serialization!"));
96 container->set(
"count",
static_cast<int32_t
>(42));
97 container->set(
"pi", 3.14159);
98 container->set(
"success",
true);
101 std::cout <<
"Serializing container..." << std::endl;
102 std::string serialized_data = container->serialize_string(value_container::serialization_format::binary).value();
103 std::cout <<
"Serialized size: " << serialized_data.size() <<
" bytes" << std::endl;
106 std::cout <<
"Deserializing container..." << std::endl;
107 auto new_container = std::make_shared<value_container>(serialized_data);
109 std::cout <<
"Deserialization successful!" << std::endl;
110 std::cout <<
"Deserialized container:" << std::endl;
111 std::cout <<
" Source: " << new_container->source_id() <<
"/" << new_container->source_sub_id() << std::endl;
112 std::cout <<
" Target: " << new_container->target_id() <<
"/" << new_container->target_sub_id() << std::endl;
113 std::cout <<
" Type: " << new_container->message_type() << std::endl;
116 if (
auto message_value = new_container->get(
"message")) {
117 if (
auto* str = std::get_if<std::string>(&message_value->data)) {
118 std::cout <<
" Message: " << *str << std::endl;
122 if (
auto count_value = new_container->get(
"count")) {
123 if (
auto* val = std::get_if<int32_t>(&count_value->data)) {
124 std::cout <<
" Count: " << *val << std::endl;
130 std::cout <<
"\n=== Value Access Demonstration ===" << std::endl;
132 auto container = std::make_shared<value_container>();
133 container->set_message_type(
"value_access_test");
136 container->set(
"product_name", std::string(
"Super Widget"));
137 container->set(
"price", 29.99);
138 container->set(
"quantity",
static_cast<int32_t
>(100));
139 container->set(
"in_stock",
true);
141 std::cout <<
"Container contains 4 values" << std::endl;
144 std::cout <<
"\nAccessing values by key:" << std::endl;
146 if (
auto product_name = container->get(
"product_name")) {
147 if (
auto* str = std::get_if<std::string>(&product_name->data)) {
148 std::cout <<
" Product: " << *str << std::endl;
152 if (
auto price = container->get(
"price")) {
153 if (
auto* val = std::get_if<double>(&price->data)) {
154 std::cout <<
" Price: $" << *val << std::endl;
158 if (
auto quantity = container->get(
"quantity")) {
159 if (
auto* val = std::get_if<int32_t>(&quantity->data)) {
160 std::cout <<
" Quantity: " << *val << std::endl;
164 if (
auto in_stock = container->get(
"in_stock")) {
165 if (
auto* val = std::get_if<bool>(&in_stock->data)) {
166 std::cout <<
" In Stock: " << (*val ?
"yes" :
"no") << std::endl;
192 std::cout <<
"\n=== Basic Performance Demonstration ===" << std::endl;
194 const int num_operations = 1000;
197 auto start_time = std::chrono::high_resolution_clock::now();
199 std::vector<std::shared_ptr<value_container>> containers;
200 containers.reserve(num_operations);
202 for (
int i = 0; i < num_operations; ++i) {
203 auto container = std::make_shared<value_container>();
204 container->set_source(
"perf_client",
"session_" + std::to_string(i));
205 container->set_target(
"perf_server",
"handler");
206 container->set_message_type(
"performance_test");
208 container->set(
"index",
static_cast<int32_t
>(i));
209 container->set(
"data", std::string(
"test_data_" + std::to_string(i)));
211 containers.push_back(container);
214 auto end_time = std::chrono::high_resolution_clock::now();
215 auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time);
217 double containers_per_second = (num_operations * 1000000.0) / duration.count();
219 std::cout <<
"Performance results:" << std::endl;
220 std::cout <<
" Created " << num_operations <<
" containers in "
221 << duration.count() <<
" microseconds" << std::endl;
222 std::cout <<
" Rate: " << std::fixed << std::setprecision(2)
223 << containers_per_second <<
" containers/second" << std::endl;
226 start_time = std::chrono::high_resolution_clock::now();
228 std::vector<std::string> serialized_data;
229 serialized_data.reserve(num_operations);
231 for (
const auto& container : containers) {
232 serialized_data.push_back(container->serialize_string(value_container::serialization_format::binary).value());
235 end_time = std::chrono::high_resolution_clock::now();
236 duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time);
238 double serializations_per_second = (num_operations * 1000000.0) / duration.count();
240 std::cout <<
" Serialized " << num_operations <<
" containers in "
241 << duration.count() <<
" microseconds" << std::endl;
242 std::cout <<
" Rate: " << std::fixed << std::setprecision(2)
243 << serializations_per_second <<
" serializations/second" << std::endl;
246 size_t total_size = 0;
247 for (
const auto& data : serialized_data) {
248 total_size += data.size();
251 std::cout <<
" Total serialized data: " << total_size <<
" bytes" << std::endl;
252 std::cout <<
" Average per container: " << (total_size / num_operations) <<
" bytes" << std::endl;