Container System 0.1.0
High-performance C++20 type-safe container framework with SIMD-accelerated serialization
Loading...
Searching...
No Matches
real_world_scenarios.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
25#include <iostream>
26#include <memory>
27#include <vector>
28#include <thread>
29#include <chrono>
30#include <random>
31#include <atomic>
32#include <queue>
33#include <mutex>
34#include <condition_variable>
35#include <map>
36#include <algorithm>
37#include <sstream>
38#include <iomanip>
39
40#include "container.h"
41
42using namespace kcenon::container;
43
44namespace scenarios {
45
53private:
55 std::string device_id;
56 std::string sensor_type;
57 double value;
58 std::chrono::system_clock::time_point timestamp;
59 };
60
61 std::atomic<int> readings_collected_{0};
62 std::atomic<int> batches_sent_{0};
63
64public:
66 std::cout << "\n=== IoT Data Collection Scenario ===" << std::endl;
67
68 const int num_devices = 5;
69 const int readings_per_device = 20;
70 const int batch_size = 10;
71
72 std::vector<std::string> device_types = {"temperature", "humidity", "pressure"};
73 std::vector<std::thread> device_threads;
74
75 std::queue<SensorReading> sensor_queue;
76 std::mutex queue_mutex;
77 std::condition_variable queue_cv;
78 std::atomic<bool> collection_active{true};
79
80 // Data aggregator thread
81 std::thread aggregator_thread([&]() {
82 std::vector<SensorReading> batch;
83 batch.reserve(batch_size);
84
85 while (collection_active || !sensor_queue.empty()) {
86 std::unique_lock<std::mutex> lock(queue_mutex);
87 queue_cv.wait(lock, [&]() { return !sensor_queue.empty() || !collection_active; });
88
89 while (!sensor_queue.empty() && batch.size() < static_cast<size_t>(batch_size)) {
90 batch.push_back(sensor_queue.front());
91 sensor_queue.pop();
92 }
93
94 if (!batch.empty()) {
95 lock.unlock();
96 send_iot_batch(batch);
97 batch.clear();
99 }
100 }
101 });
102
103 // Device simulation threads
104 std::random_device rd;
105 for (int device_id = 0; device_id < num_devices; ++device_id) {
106 device_threads.emplace_back([&, device_id]() {
107 std::mt19937 gen(rd());
108 std::uniform_real_distribution<> temp_dist(18.0, 35.0);
109 std::uniform_real_distribution<> humidity_dist(30.0, 80.0);
110 std::uniform_real_distribution<> pressure_dist(990.0, 1030.0);
111
112 for (int reading = 0; reading < readings_per_device; ++reading) {
113 for (const auto& sensor_type : device_types) {
114 SensorReading sensor_reading;
115 sensor_reading.device_id = "device_" + std::to_string(device_id);
116 sensor_reading.sensor_type = sensor_type;
117 sensor_reading.timestamp = std::chrono::system_clock::now();
118
119 if (sensor_type == "temperature") {
120 sensor_reading.value = temp_dist(gen);
121 } else if (sensor_type == "humidity") {
122 sensor_reading.value = humidity_dist(gen);
123 } else {
124 sensor_reading.value = pressure_dist(gen);
125 }
126
127 {
128 std::lock_guard<std::mutex> lock(queue_mutex);
129 sensor_queue.push(sensor_reading);
130 }
131 queue_cv.notify_one();
133
134 std::this_thread::sleep_for(std::chrono::milliseconds(5));
135 }
136 }
137 });
138 }
139
140 for (auto& thread : device_threads) {
141 thread.join();
142 }
143
144 collection_active = false;
145 queue_cv.notify_all();
146 aggregator_thread.join();
147
148 std::cout << "IoT simulation completed:" << std::endl;
149 std::cout << " Readings collected: " << readings_collected_.load() << std::endl;
150 std::cout << " Batches sent: " << batches_sent_.load() << std::endl;
151 }
152
153private:
154 void send_iot_batch(const std::vector<SensorReading>& batch) {
155 auto container = std::make_shared<value_container>();
156 container->set_source("iot_aggregator", "batch_processor");
157 container->set_target("iot_analytics_service", "data_processor");
158 container->set_message_type("sensor_data_batch");
159
160 container->set("batch_size", static_cast<int32_t>(batch.size()));
161 container->set("batch_timestamp", static_cast<int64_t>(
162 std::chrono::duration_cast<std::chrono::milliseconds>(
163 std::chrono::system_clock::now().time_since_epoch()).count()));
164
165 for (size_t i = 0; i < batch.size(); ++i) {
166 const auto& reading = batch[i];
167 std::string prefix = "reading_" + std::to_string(i) + "_";
168
169 container->set(prefix + "device_id", reading.device_id);
170 container->set(prefix + "sensor_type", reading.sensor_type);
171 container->set(prefix + "value", reading.value);
172 container->set(prefix + "timestamp", static_cast<int64_t>(
173 std::chrono::duration_cast<std::chrono::milliseconds>(
174 reading.timestamp.time_since_epoch()).count()));
175 }
176
177 std::string serialized = container->serialize_string(value_container::serialization_format::binary).value();
178 std::cout << " Sent IoT batch: " << batch.size() << " readings, "
179 << serialized.size() << " bytes" << std::endl;
180 }
181};
182
187private:
188 struct Transaction {
189 std::string transaction_id;
190 std::string account_from;
191 std::string account_to;
192 double amount;
193 std::string currency;
194 std::string transaction_type;
195 std::chrono::system_clock::time_point timestamp;
196 };
197
198 std::atomic<int> transactions_processed_{0};
199 std::atomic<int> fraud_alerts_{0};
200 double total_amount_{0.0};
201 std::mutex amount_mutex_;
202
203public:
205 std::cout << "\n=== Financial Transaction Processing Scenario ===" << std::endl;
206
207 const int num_transactions = 100;
208
209 std::queue<Transaction> transaction_queue;
210 std::mutex transaction_mutex;
211 std::condition_variable transaction_cv;
212 std::atomic<bool> processing_active{true};
213
214 std::thread fraud_detector([&]() {
215 while (processing_active || !transaction_queue.empty()) {
216 std::unique_lock<std::mutex> lock(transaction_mutex);
217 transaction_cv.wait(lock, [&]() { return !transaction_queue.empty() || !processing_active; });
218
219 if (!transaction_queue.empty()) {
220 Transaction transaction = transaction_queue.front();
221 transaction_queue.pop();
222 lock.unlock();
223
224 process_transaction(transaction);
226 }
227 }
228 });
229
230 std::random_device rd;
231 std::mt19937 gen(rd());
232 std::uniform_real_distribution<> amount_dist(10.0, 10000.0);
233 std::uniform_int_distribution<> account_dist(1000, 9999);
234 std::vector<std::string> currencies = {"USD", "EUR", "GBP"};
235 std::vector<std::string> types = {"transfer", "payment", "withdrawal"};
236
237 for (int i = 0; i < num_transactions; ++i) {
238 Transaction transaction;
239 transaction.transaction_id = "TXN" + std::to_string(1000000 + i);
240 transaction.account_from = "ACC" + std::to_string(account_dist(gen));
241 transaction.account_to = "ACC" + std::to_string(account_dist(gen));
242 transaction.amount = amount_dist(gen);
243 transaction.currency = currencies[i % currencies.size()];
244 transaction.transaction_type = types[i % types.size()];
245 transaction.timestamp = std::chrono::system_clock::now();
246
247 {
248 std::lock_guard<std::mutex> lock(transaction_mutex);
249 transaction_queue.push(transaction);
250 }
251 transaction_cv.notify_one();
252
253 std::this_thread::sleep_for(std::chrono::milliseconds(5));
254 }
255
256 processing_active = false;
257 transaction_cv.notify_all();
258 fraud_detector.join();
259
260 std::cout << "Financial processing completed:" << std::endl;
261 std::cout << " Transactions processed: " << transactions_processed_.load() << std::endl;
262 std::cout << " Fraud alerts generated: " << fraud_alerts_.load() << std::endl;
263 double total;
264 {
265 std::lock_guard<std::mutex> lock(amount_mutex_);
266 total = total_amount_;
267 }
268 std::cout << " Total amount processed: $" << std::fixed << std::setprecision(2) << total << std::endl;
269 }
270
271private:
272 void process_transaction(const Transaction& transaction) {
273 bool is_suspicious = (transaction.amount > 5000.0) ||
274 (transaction.account_from == transaction.account_to);
275
276 {
277 std::lock_guard<std::mutex> lock(amount_mutex_);
278 total_amount_ += transaction.amount;
279 }
280
281 auto container = std::make_shared<value_container>();
282 container->set_source("transaction_processor", "fraud_detection");
283 container->set_target("compliance_service", "transaction_monitor");
284 container->set_message_type(is_suspicious ? "suspicious_transaction" : "normal_transaction");
285
286 container->set("transaction_id", transaction.transaction_id);
287 container->set("account_from", transaction.account_from);
288 container->set("account_to", transaction.account_to);
289 container->set("amount", transaction.amount);
290 container->set("currency", transaction.currency);
291 container->set("transaction_type", transaction.transaction_type);
292 container->set("timestamp", static_cast<int64_t>(
293 std::chrono::duration_cast<std::chrono::milliseconds>(
294 transaction.timestamp.time_since_epoch()).count()));
295 container->set("risk_score", is_suspicious ? 85.0 : 15.0);
296
297 if (is_suspicious) {
299 container->set("alert_reason",
300 std::string(transaction.amount > 5000.0 ? "high_amount" : "same_account"));
301 container->set("requires_manual_review", true);
302
303 std::cout << " FRAUD ALERT: " << transaction.transaction_id
304 << " Amount: $" << transaction.amount << std::endl;
305 }
306
307 container->serialize_string(value_container::serialization_format::binary).value();
308 }
309};
310
315private:
316 struct GameEvent {
317 std::string player_id;
318 std::string event_type;
319 std::map<std::string, std::string> event_data;
320 std::chrono::system_clock::time_point timestamp;
321 };
322
323 std::atomic<int> events_processed_{0};
324 std::atomic<int> achievements_unlocked_{0};
325 std::map<std::string, int> player_scores_;
326 std::mutex scores_mutex_;
327
328public:
330 std::cout << "\n=== Gaming Event System Scenario ===" << std::endl;
331
332 const int num_players = 10;
333 const int events_per_player = 50;
334 std::vector<std::thread> player_threads;
335
336 std::queue<GameEvent> event_queue;
337 std::mutex event_mutex;
338 std::condition_variable event_cv;
339 std::atomic<bool> game_active{true};
340
341 std::thread event_processor([&]() {
342 while (game_active || !event_queue.empty()) {
343 std::unique_lock<std::mutex> lock(event_mutex);
344 event_cv.wait(lock, [&]() { return !event_queue.empty() || !game_active; });
345
346 if (!event_queue.empty()) {
347 GameEvent event = event_queue.front();
348 event_queue.pop();
349 lock.unlock();
350
351 process_game_event(event);
353 }
354 }
355 });
356
357 std::random_device rd;
358 for (int player_id = 0; player_id < num_players; ++player_id) {
359 player_threads.emplace_back([&, player_id]() {
360 std::mt19937 gen(rd());
361 std::uniform_int_distribution<> action_dist(0, 4);
362 std::uniform_int_distribution<> score_dist(10, 500);
363 std::uniform_int_distribution<> level_dist(1, 50);
364
365 std::vector<std::string> actions = {"kill", "death", "level_up", "item_collected", "quest_completed"};
366
367 for (int event_count = 0; event_count < events_per_player; ++event_count) {
368 GameEvent event;
369 event.player_id = "player_" + std::to_string(player_id);
370 event.event_type = actions[action_dist(gen)];
371 event.timestamp = std::chrono::system_clock::now();
372
373 if (event.event_type == "kill") {
374 event.event_data["target"] = "player_" + std::to_string((player_id + 1) % num_players);
375 event.event_data["score"] = std::to_string(score_dist(gen));
376 } else if (event.event_type == "level_up") {
377 event.event_data["new_level"] = std::to_string(level_dist(gen));
378 }
379
380 {
381 std::lock_guard<std::mutex> lock(event_mutex);
382 event_queue.push(event);
383 }
384 event_cv.notify_one();
385
386 std::this_thread::sleep_for(std::chrono::milliseconds(20));
387 }
388 });
389 }
390
391 for (auto& thread : player_threads) {
392 thread.join();
393 }
394
395 game_active = false;
396 event_cv.notify_all();
397 event_processor.join();
398
400
401 std::cout << "Gaming simulation completed:" << std::endl;
402 std::cout << " Events processed: " << events_processed_.load() << std::endl;
403 std::cout << " Achievements unlocked: " << achievements_unlocked_.load() << std::endl;
404 }
405
406private:
407 void process_game_event(const GameEvent& event) {
408 auto container = std::make_shared<value_container>();
409 container->set_source("game_client", event.player_id);
410 container->set_target("game_server", "event_processor");
411 container->set_message_type("game_event");
412
413 container->set("player_id", event.player_id);
414 container->set("event_type", event.event_type);
415 container->set("timestamp", static_cast<int64_t>(
416 std::chrono::duration_cast<std::chrono::milliseconds>(
417 event.timestamp.time_since_epoch()).count()));
418
419 for (const auto& data_pair : event.event_data) {
420 container->set(data_pair.first, data_pair.second);
421 }
422
423 if (event.event_data.find("score") != event.event_data.end()) {
424 int score = std::stoi(event.event_data.at("score"));
425 {
426 std::lock_guard<std::mutex> lock(scores_mutex_);
427 player_scores_[event.player_id] += score;
428 }
429 }
430
431 if (event.event_type == "level_up" && event.event_data.find("new_level") != event.event_data.end()) {
432 int level = std::stoi(event.event_data.at("new_level"));
433 if (level >= 25) {
435 send_achievement_notification(event.player_id, "High Level Achiever");
436 }
437 }
438
439 container->serialize_string(value_container::serialization_format::binary).value();
440 }
441
442 void send_achievement_notification(const std::string& player_id, const std::string& achievement) {
443 auto notification = std::make_shared<value_container>();
444 notification->set_source("achievement_system", "unlock_processor");
445 notification->set_target("notification_service", "player_notifier");
446 notification->set_message_type("achievement_unlocked");
447
448 notification->set("player_id", player_id);
449 notification->set("achievement_name", achievement);
450 notification->set("timestamp", static_cast<int64_t>(
451 std::chrono::duration_cast<std::chrono::milliseconds>(
452 std::chrono::system_clock::now().time_since_epoch()).count()));
453
454 std::cout << " ACHIEVEMENT: " << player_id << " unlocked '" << achievement << "'" << std::endl;
455 }
456
458 std::cout << "\n === Leaderboard ===" << std::endl;
459
460 std::vector<std::pair<std::string, int>> leaderboard;
461 {
462 std::lock_guard<std::mutex> lock(scores_mutex_);
463 for (const auto& entry : player_scores_) {
464 leaderboard.emplace_back(entry.first, entry.second);
465 }
466 }
467
468 std::sort(leaderboard.begin(), leaderboard.end(),
469 [](const auto& a, const auto& b) { return a.second > b.second; });
470
471 for (size_t i = 0; i < std::min(size_t(5), leaderboard.size()); ++i) {
472 std::cout << " " << (i + 1) << ". " << leaderboard[i].first
473 << ": " << leaderboard[i].second << " points" << std::endl;
474 }
475 std::cout << " ===================" << std::endl;
476 }
477};
478
483private:
484 struct Document {
485 std::string document_id;
486 std::string title;
487 std::string content;
488 std::string author;
489 std::string category;
490 std::vector<std::string> tags;
491 std::chrono::system_clock::time_point upload_time;
492 };
493
494 std::atomic<int> documents_processed_{0};
495 std::atomic<int> documents_indexed_{0};
496
497public:
499 std::cout << "\n=== Content Management System Scenario ===" << std::endl;
500
501 const int num_documents = 50;
502
503 std::queue<Document> document_queue;
504 std::mutex document_mutex;
505 std::condition_variable document_cv;
506 std::atomic<bool> uploading_active{true};
507
508 std::thread document_processor([&]() {
509 while (uploading_active || !document_queue.empty()) {
510 std::unique_lock<std::mutex> lock(document_mutex);
511 document_cv.wait(lock, [&]() { return !document_queue.empty() || !uploading_active; });
512
513 if (!document_queue.empty()) {
514 Document document = document_queue.front();
515 document_queue.pop();
516 lock.unlock();
517
518 process_document(document);
520 }
521 }
522 });
523
524 std::vector<std::string> categories = {"article", "report", "manual"};
525 std::vector<std::string> authors = {"john_smith", "jane_doe", "bob_wilson"};
526 std::vector<std::vector<std::string>> tag_sets = {
527 {"programming", "cpp", "tutorial"},
528 {"business", "report", "analysis"},
529 {"technical", "manual", "guide"}
530 };
531
532 for (int i = 0; i < num_documents; ++i) {
533 Document document;
534 document.document_id = "DOC" + std::to_string(10000 + i);
535 document.title = "Document Title " + std::to_string(i);
536 document.content = generate_sample_content(i);
537 document.author = authors[i % authors.size()];
538 document.category = categories[i % categories.size()];
539 document.tags = tag_sets[i % tag_sets.size()];
540 document.upload_time = std::chrono::system_clock::now();
541
542 {
543 std::lock_guard<std::mutex> lock(document_mutex);
544 document_queue.push(document);
545 }
546 document_cv.notify_one();
547
548 std::this_thread::sleep_for(std::chrono::milliseconds(10));
549 }
550
551 uploading_active = false;
552 document_cv.notify_all();
553 document_processor.join();
554
555 std::cout << "CMS simulation completed:" << std::endl;
556 std::cout << " Documents processed: " << documents_processed_.load() << std::endl;
557 std::cout << " Documents indexed: " << documents_indexed_.load() << std::endl;
558 }
559
560private:
561 std::string generate_sample_content(int index) {
562 std::stringstream content;
563 content << "This is sample content for document " << index << ". ";
564 content << "It contains important information for demonstration purposes.";
565 return content.str();
566 }
567
568 void process_document(const Document& document) {
569 auto container = std::make_shared<value_container>();
570 container->set_source("cms_upload_service", "document_processor");
571 container->set_target("search_indexer", "text_analyzer");
572 container->set_message_type("document_processing");
573
574 container->set("document_id", document.document_id);
575 container->set("title", document.title);
576 container->set("author", document.author);
577 container->set("category", document.category);
578 container->set("content_length", static_cast<int32_t>(document.content.length()));
579 container->set("upload_timestamp", static_cast<int64_t>(
580 std::chrono::duration_cast<std::chrono::milliseconds>(
581 document.upload_time.time_since_epoch()).count()));
582 container->set("tag_count", static_cast<int32_t>(document.tags.size()));
583 container->set("content", document.content);
584
585 for (size_t i = 0; i < document.tags.size(); ++i) {
586 container->set("tag_" + std::to_string(i), document.tags[i]);
587 }
588
589 container->serialize_string(value_container::serialization_format::binary).value();
592
593 if (documents_processed_ % 20 == 0) {
594 std::cout << " Processed " << documents_processed_.load() << " documents..." << std::endl;
595 }
596 }
597
598 void create_search_index_entry(const Document& document) {
599 auto index_container = std::make_shared<value_container>();
600 index_container->set_source("text_analyzer", "indexing_service");
601 index_container->set_target("search_service", "index_updater");
602 index_container->set_message_type("search_index_update");
603
604 index_container->set("document_id", document.document_id);
605 index_container->set("indexed_title", document.title);
606 index_container->set("indexed_category", document.category);
607 index_container->set("word_count", static_cast<int32_t>(count_words(document.content)));
608 index_container->set("index_timestamp", static_cast<int64_t>(
609 std::chrono::duration_cast<std::chrono::milliseconds>(
610 std::chrono::system_clock::now().time_since_epoch()).count()));
611
612 index_container->serialize_string(value_container::serialization_format::binary).value();
613 }
614
615 size_t count_words(const std::string& text) {
616 std::istringstream iss(text);
617 std::string word;
618 size_t count = 0;
619 while (iss >> word) {
620 count++;
621 }
622 return count;
623 }
624};
625
626} // namespace scenarios
627
628int main() {
629 try {
630 std::cout << "=== Real-World Container System Scenarios ===" << std::endl;
631 std::cout << "Demonstrating practical applications using variant-based API" << std::endl;
632
634 iot_system.simulate_iot_scenario();
635
637 financial_system.simulate_financial_scenario();
638
639 scenarios::GamingEventSystem gaming_system;
640 gaming_system.simulate_gaming_scenario();
641
643 cms_system.simulate_cms_scenario();
644
645 std::cout << "\n=== All Real-World Scenarios Completed Successfully ===" << std::endl;
646 std::cout << "The container system demonstrated versatility across:" << std::endl;
647 std::cout << " - IoT data aggregation and processing" << std::endl;
648 std::cout << " - Financial transaction processing with fraud detection" << std::endl;
649 std::cout << " - Gaming event systems with real-time processing" << std::endl;
650 std::cout << " - Content management with search indexing" << std::endl;
651
652 return 0;
653
654 } catch (const std::exception& e) {
655 std::cerr << "Fatal error in real-world scenarios: " << e.what() << std::endl;
656 return 1;
657 }
658}
void process_document(const Document &document)
size_t count_words(const std::string &text)
void create_search_index_entry(const Document &document)
Financial Transaction Processing System.
void process_transaction(const Transaction &transaction)
void process_game_event(const GameEvent &event)
void send_achievement_notification(const std::string &player_id, const std::string &achievement)
std::map< std::string, int > player_scores_
void send_iot_batch(const std::vector< SensorReading > &batch)
std::chrono::system_clock::time_point upload_time
std::map< std::string, std::string > event_data
std::chrono::system_clock::time_point timestamp
std::chrono::system_clock::time_point timestamp