#include <iostream>
using namespace std;
/*
Select exactly ONE hardware board at build time.
*/
// #define BOARD_TYPE_A
#define BOARD_TYPE_B
// Abstract interface used by application code
class StatusIndicator {
public:
virtual void toggle() = 0;
virtual bool isOn() const = 0;
virtual ~StatusIndicator() = default;
};
/*
TASK FOR LEARNER:
- Create TWO board-specific implementations of StatusIndicator
- Select exactly one using conditional compilation...meaning #if #endif
- Enforce compile-time errors for invalid selections...#if defined()
- Implement the factory function below
DO NOT modify main()
*/
#if defined(BOARD_TYPE_A) && defined(BOARD_TYPE_B)
#error "Only one board can be defined";
#endif
#if !defined(BOARD_TYPE_A) && !defined(BOARD_TYPE_B)
#error "Atleast one board must be defined";
#endif
#if defined(BOARD_TYPE_A)
class BoardAIndicator: public StatusIndicator{
private:
int state;
public:
void toggle() override{
state = state ? 0:1;
}
bool isOn() const override {
return state ? true : false;
}
};
StatusIndicator& getStatusIndicator(){
static BoardAIndicator board_a;
return board_a;
}
#elif defined(BOARD_TYPE_B)
class BoardBIndicator: public StatusIndicator{
private:
int state;
public:
void toggle()override{
state = state ? 0:1;
}
bool isOn() const override{
return state ? true : false;
}
};
StatusIndicator& getStatusIndicator(){
static BoardBIndicator board_b;
return board_b;
}
#endif
// Factory function declaration (not implemented here)
StatusIndicator& getStatusIndicator();
int main() {
int n;
cin >> n;
StatusIndicator& indicator = getStatusIndicator();
for (int i = 0; i < n; ++i) {
int evt;
cin >> evt;
if (evt == 1) {
indicator.toggle();
}
cout << (indicator.isOn() ? "STATUS=ON\n" : "STATUS=OFF\n");
}
return 0;
}
Input
5 1 1 0 1 1
Expected Output
STATUS=ON STATUS=OFF STATUS=OFF STATUS=ON STATUS=OFF