#pragma once #include #include #include #include BEGIN_CS_NAMESPACE template // TODO: check bounds here? class Selectable { protected: Selectable(setting_t initialSelection = 0) : initialSelection(initialSelection) {} public: virtual void select(setting_t setting) = 0; static setting_t validateSetting(setting_t setting) { static_assert(std::is_unsigned::value, "Error: setting_t should be an unsigned integer type."); if (setting >= N) { ERROR(F("Error: Setting ") << setting << F(" is not less than the number of settings (") << N << ')', 0xFFFE); return N - 1; } return setting; } setting_t getInitialSelection() const { return initialSelection; } void setInitialSelection(setting_t initialSelection) { this->initialSelection = validateSetting(initialSelection); } private: setting_t initialSelection; }; END_CS_NAMESPACE