#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;
};
class BoardAStatusInd :public StatusIndicator {
private:
int status;
public:
BoardAStatusInd() : status(0) {}
void toggle(){
if(status==0){
status = 1;
}
else{
status = 0;
}
}
bool isOn() const{
if(status==1){
return true;
}
else{
return false;
}
}
};
class BoardBStatusInd :public StatusIndicator {
private:
int status;
public:
BoardBStatusInd() : status(0) {}
void toggle(){
if(status==0){
status = 1;
}
else{
status = 0;
}
}
bool isOn() const{
if(status==1){
return true;
}
else{
return false;
}
}
};
/*
TASK FOR LEARNER:
- Create TWO board-specific implementations of StatusIndicator
- Select exactly one using conditional compilation
- Enforce compile-time errors for invalid selections
- Implement the factory function below
DO NOT modify main()
*/
#ifdef BOARD_TYPE_A
BoardAStatusInd IndA;
#else
BoardBStatusInd IndB;
#endif
StatusIndicator& getStatusIndicator(void){
#ifdef BOARD_TYPE_A
return IndA;
#else
return IndB;
#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