This file demonstrates how the adapter pattern would replace conditional compilation in logger_system. This is NOT production code, but a conceptual example to validate the approach.
#include <iostream>
#include <memory>
#include <string>
#include <chrono>
#ifdef USE_EXAMPLE_MODE
#include "external_interface.h"
public:
void log(
const std::string& message) {
#ifdef MODE_A
std::cout << "[Mode A] " << message << std::endl;
#elif MODE_B
std::cout << "[Mode B] " << message << std::endl;
#else
std::cout << "[Default] " << message << std::endl;
#endif
}
};
#else
public:
void log(
const std::string& message) {
std::cout << "[Standalone] " << message << std::endl;
}
};
#endif
public:
std::cout << "[CORE] " << message << std::endl;
}
}
private:
};
public:
:
core_(std::move(core)) {}
void log(
const std::string& message) {
}
}
protected:
std::shared_ptr<logger_core>
core_;
};
public:
std::cout << "[Standalone Mode] ";
}
};
public:
};
public:
std::cout << "[Thread System Integration] ";
}
return "thread_system::logger_interface";
}
};
public:
};
public:
std::cout << "[Common System Integration] ";
}
}
private:
};
public:
std::cout << "[Full Integration - External] ";
}
return "full_integration";
}
std::cout << "[Full Integration - Monitored] ";
}
}
};
};
public:
auto core = std::make_shared<logger_core>();
switch (mode) {
return std::make_unique<standalone_adapter>(core);
return std::make_unique<thread_system_adapter>(core);
return std::make_unique<common_system_adapter>(core);
return std::make_unique<full_integration_adapter>(core);
default:
throw std::invalid_argument("Unknown integration mode");
}
}
};
std::cout << "\n=== Adapter Pattern Proof of Concept ===\n" << std::endl;
{
std::cout << "Test 1: Standalone Mode" << std::endl;
logger->log(
"Hello from standalone mode");
std::cout <<
"Messages logged: " <<
logger->message_count() <<
"\n" << std::endl;
}
{
std::cout << "Test 2: Thread System Integration" << std::endl;
logger->log(
"Hello as adapter");
if (external) {
external->external_log("Hello via external interface");
std::cout << "Interface: " << external->get_interface_name() << std::endl;
}
std::cout << std::endl;
}
{
std::cout << "Test 3: Common System Integration" << std::endl;
if (monitored) {
monitored->monitored_log("Message 1");
monitored->monitored_log("Message 2");
std::cout << "Metrics collected: " << monitored->get_metric_count() << std::endl;
}
std::cout << std::endl;
}
{
std::cout << "Test 4: Full Integration" << std::endl;
if (external && monitored) {
external->external_log("Via external interface");
monitored->monitored_log("Via monitoring interface");
std::cout << "Total messages: " << monitored->get_metric_count() << std::endl;
}
std::cout << std::endl;
}
{
std::cout << "Test 5: Runtime Mode Switching" << std::endl;
std::cout << "All modes tested with SINGLE BINARY" << std::endl;
std::cout << "No recompilation needed!" << std::endl;
}
}
std::cout << "\n=== Performance Comparison ===\n" << std::endl;
const int iterations = 1000000;
auto core = std::make_shared<logger_core>();
{
auto start = std::chrono::high_resolution_clock::now();
for (int i = 0; i < iterations; ++i) {
core->log_internal("test");
}
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start);
std::cout << "Direct call: " << duration.count() / iterations << " ns/call" << std::endl;
}
{
auto adapter = std::make_unique<standalone_adapter>(core);
auto start = std::chrono::high_resolution_clock::now();
for (int i = 0; i < iterations; ++i) {
adapter->log("test");
}
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start);
std::cout << "Virtual call: " << duration.count() / iterations << " ns/call" << std::endl;
std::cout << "Overhead: ~1-2ns (negligible for I/O operations)" << std::endl;
}
}
std::cout << "\n=== Benefits Summary ===" << std::endl;
std::cout << "✅ Single binary for all modes" << std::endl;
std::cout << "✅ Runtime mode selection" << std::endl;
std::cout << "✅ Easier testing (no recompilation)" << std::endl;
std::cout << "✅ Clear code structure" << std::endl;
std::cout << "✅ Minimal performance overhead" << std::endl;
std::cout << "✅ Better maintainability" << std::endl;
return 0;
}
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