30#ifdef USE_EXAMPLE_MODE
32#include "external_interface.h"
36 void log(
const std::string& message) {
38 std::cout <<
"[Mode A] " << message << std::endl;
40 std::cout <<
"[Mode B] " << message << std::endl;
42 std::cout <<
"[Default] " << message << std::endl;
51 void log(
const std::string& message) {
52 std::cout <<
"[Standalone] " << message << std::endl;
76 std::cout <<
"[CORE] " << message << std::endl;
92 :
core_(std::move(core)) {}
97 void log(
const std::string& message) {
117 std::cout <<
"[Standalone Mode] ";
139 std::cout <<
"[Thread System Integration] ";
144 return "thread_system::logger_interface";
163 std::cout <<
"[Common System Integration] ";
185 std::cout <<
"[Full Integration - External] ";
190 return "full_integration";
194 std::cout <<
"[Full Integration - Monitored] ";
214 auto core = std::make_shared<logger_core>();
218 return std::make_unique<standalone_adapter>(core);
221 return std::make_unique<thread_system_adapter>(core);
224 return std::make_unique<common_system_adapter>(core);
227 return std::make_unique<full_integration_adapter>(core);
230 throw std::invalid_argument(
"Unknown integration mode");
240 std::cout <<
"\n=== Adapter Pattern Proof of Concept ===\n" << std::endl;
244 std::cout <<
"Test 1: Standalone Mode" << std::endl;
246 logger->log(
"Hello from standalone mode");
247 std::cout <<
"Messages logged: " <<
logger->message_count() <<
"\n" << std::endl;
252 std::cout <<
"Test 2: Thread System Integration" << std::endl;
256 logger->log(
"Hello as adapter");
261 external->external_log(
"Hello via external interface");
262 std::cout <<
"Interface: " << external->get_interface_name() << std::endl;
264 std::cout << std::endl;
269 std::cout <<
"Test 3: Common System Integration" << std::endl;
274 monitored->monitored_log(
"Message 1");
275 monitored->monitored_log(
"Message 2");
276 std::cout <<
"Metrics collected: " << monitored->get_metric_count() << std::endl;
278 std::cout << std::endl;
283 std::cout <<
"Test 4: Full Integration" << std::endl;
290 if (external && monitored) {
291 external->external_log(
"Via external interface");
292 monitored->monitored_log(
"Via monitoring interface");
293 std::cout <<
"Total messages: " << monitored->get_metric_count() << std::endl;
295 std::cout << std::endl;
300 std::cout <<
"Test 5: Runtime Mode Switching" << std::endl;
301 std::cout <<
"All modes tested with SINGLE BINARY" << std::endl;
302 std::cout <<
"No recompilation needed!" << std::endl;
308 std::cout <<
"\n=== Performance Comparison ===\n" << std::endl;
310 const int iterations = 1000000;
311 auto core = std::make_shared<logger_core>();
315 auto start = std::chrono::high_resolution_clock::now();
316 for (
int i = 0; i < iterations; ++i) {
317 core->log_internal(
"test");
319 auto end = std::chrono::high_resolution_clock::now();
320 auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start);
321 std::cout <<
"Direct call: " << duration.count() / iterations <<
" ns/call" << std::endl;
326 auto adapter = std::make_unique<standalone_adapter>(core);
327 auto start = std::chrono::high_resolution_clock::now();
328 for (
int i = 0; i < iterations; ++i) {
329 adapter->log(
"test");
331 auto end = std::chrono::high_resolution_clock::now();
332 auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start);
333 std::cout <<
"Virtual call: " << duration.count() / iterations <<
" ns/call" << std::endl;
334 std::cout <<
"Overhead: ~1-2ns (negligible for I/O operations)" << std::endl;
342 std::cout <<
"\n=== Benefits Summary ===" << std::endl;
343 std::cout <<
"✅ Single binary for all modes" << std::endl;
344 std::cout <<
"✅ Runtime mode selection" << std::endl;
345 std::cout <<
"✅ Easier testing (no recompilation)" << std::endl;
346 std::cout <<
"✅ Clear code structure" << std::endl;
347 std::cout <<
"✅ Minimal performance overhead" << std::endl;
348 std::cout <<
"✅ Better maintainability" << std::endl;
void benchmark_overhead()
void demonstrate_adapters()
void monitored_log(const std::string &message) override
size_t get_metric_count() const override
virtual ~common_system_interface()=default
virtual size_t get_metric_count() const =0
virtual void monitored_log(const std::string &message)=0
virtual std::string get_interface_name() const =0
virtual void external_log(const std::string &message)=0
virtual ~external_system_interface()=default
void external_log(const std::string &message) override
size_t get_metric_count() const override
void monitored_log(const std::string &message) override
std::string get_interface_name() const override
virtual ~logger_adapter()=default
void log(const std::string &message)
std::shared_ptr< logger_core > core_
size_t message_count() const
logger_adapter(std::shared_ptr< logger_core > core)
void log_internal(const std::string &message)
std::vector< std::string > messages_
std::chrono::system_clock::time_point timestamp_
size_t message_count() const
static std::unique_ptr< logger_adapter > create(integration_mode mode)
void log(const std::string &message)
void log_standalone(const std::string &message)
std::string get_interface_name() const override
void external_log(const std::string &message) override