#include #include void i2c_set_bit(int bit, int val) { std::cout << "Bit " << bit << " set to " << val << "\n"; } class i2c_temp_bit { int bit; /* which bit */ int newval; /* value to set bit to */ int oldval; /* value to reset bit to */ public: i2c_temp_bit(int b, int nv, int ov) : bit{b}, newval{nv}, oldval{ov} { std::cout << "Bit " << bit << " set to " << newval << "\n"; } ~i2c_temp_bit() { std::cout << "Bit " << bit << " set to " << oldval << "\n"; } i2c_temp_bit(const i2c_temp_bit&) = delete; i2c_temp_bit(i2c_temp_bit&&) = delete; i2c_temp_bit& operator=(const i2c_temp_bit&) = delete; i2c_temp_bit& operator=(i2c_temp_bit&&) = delete; }; int check_kettle_temp() { static int callnum = 0; if (++callnum > 5) { return 100; } #ifdef BADNUM else if (callnum == 4) { /* Don't like this number */ throw callnum; } #endif else { return 25; } } void foo() { std::cout << "Waiting for kettle to boil" << std::endl; do { /* Check every 100 ms */ usleep(100000); } while (check_kettle_temp() < 100); std::cout << "Water is boiled!" << std::endl; } void boil_kettle() { #ifdef RAII i2c_temp_bit temp(10, 1, 0); foo(); #else i2c_set_bit(10, 1); // bit 10 is stove heater control, turn it on foo(); // wait for kettle to start boiling i2c_set_bit(10, 0); // turn heater off #endif } int main() { try { boil_kettle(); } catch (...) { std::cerr << "Abnormal termination\n"; } }