ScopedTemporaryFlagsChanger(Flags toFlags) { count_ = new int[MAXNUM]; if (! count_) return; for (int i = 0;; ++i) { count_[i] = 0; ModifierFlag flag = getFlag(i); if (flag == ModifierFlag::NONE) break; // ---------------------------------------- // reset flag while (! makeFlags().isOn(flag)) { temporary_increase(flag); ++count_[i]; } while (makeFlags().isOn(flag)) { temporary_decrease(flag); --count_[i]; } // ---------------------------------------- // set a flag if (toFlags.isOn(flag)) { temporary_increase(flag); ++count_[i]; } } }
~ScopedTemporaryFlagsChanger(void) { if (! count_) return; for (int i = 0;; ++i) { ModifierFlag flag = getFlag(i); if (flag == ModifierFlag::NONE) break; if (count_[i] < 0) { while (count_[i] != 0) { temporary_increase(flag); ++count_[i]; } } else if (count_[i] > 0) { while (count_[i] != 0) { temporary_decrease(flag); --count_[i]; } } } delete[] count_; }
void temporary_decrease(ModifierFlag flag) { temporary_decrease(Flags(flag)); }