Runtime Logging Abstraction

#include <iostream>
using namespace std;

class OutputStream {
public:
    virtual void write(const char* msg) = 0;
    virtual ~OutputStream() = default;
};

class UartStream: public OutputStream{
    public:
        void write(const char*msg)override{
            cout << "UART:" << msg << endl;
        }
};

class SpiStream: public OutputStream{
    public:
        void write(const char *msg)override{
            cout << "SPI:" << msg << endl;
        }
};

OutputStream* selectStream(int type);

OutputStream* selectStream(int type){
    if(type == 2){
        static SpiStream spi;
        return &spi;
    }
    else if(type == 1){
        static UartStream uart;
        return &uart;
    }
}

void logMessage(OutputStream *stream, const char *msg){
    if(stream){
        stream->write(msg);
    }
}

int main() {
    int transport;
    cin >> transport;

    int n;
    cin >> n;

    OutputStream* stream = selectStream(transport);

    for (int i = 0; i < n; ++i) {
        char msg[33];
        cin >> msg;
        logMessage(stream, msg);
    }

    return 0;
}

Solving Approach

 

 

 

 

Upvote
Downvote
Loading...

Input

1 2 Hello World

Expected Output

UART:Hello UART:World