Line data Source code
1 : #pragma once 2 : 3 : #include <AH/Error/Error.hpp> 4 : #include <AH/STL/type_traits> 5 : #include <Def/Def.hpp> 6 : #include <stdint.h> 7 : 8 : BEGIN_CS_NAMESPACE 9 : 10 : template <setting_t N> // TODO: check bounds here? 11 : class Selectable { 12 : protected: 13 38 : Selectable(setting_t initialSelection = 0) 14 38 : : initialSelection(initialSelection) {} 15 : 16 : public: 17 : virtual void select(setting_t setting) = 0; 18 : 19 96 : static setting_t validateSetting(setting_t setting) { 20 : static_assert(std::is_unsigned<setting_t>::value, 21 : "Error: setting_t should be an unsigned integer type."); 22 96 : if (setting >= N) { 23 1 : ERROR(F("Error: Setting ") 24 : << setting 25 : << F(" is not less than the number of settings (") << N 26 : << ')', 27 : 0xFFFE); 28 : return N - 1; 29 : } 30 95 : return setting; 31 : } 32 : 33 9 : setting_t getInitialSelection() const { return initialSelection; } 34 : 35 : void setInitialSelection(setting_t initialSelection) { 36 : this->initialSelection = validateSetting(initialSelection); 37 : } 38 : 39 : private: 40 : setting_t initialSelection; 41 : }; 42 : 43 : END_CS_NAMESPACE