text: #pragma once
  
  #include <string>
  #include <vector>
  
  using namespace std::string_literals;
  
  class SettingEntry {
  	public:
  		std::string name, prefix, suffix;
  		SettingEntry(
  			const std::string &name,
  			const std::string &prefix, const std::string &suffix
  		);
  		virtual ~SettingEntry() = default;
  		virtual void increase(const int modifier) = 0;
  		virtual void decrease(const int modifier) = 0;
  		virtual std::string getValueDisplay() const = 0;
  		std::string getDisplay() const;
  		virtual std::string getBottomDisplay() const;
  		virtual void save() = 0;
  };
  
  #define settingEntryMethods \
  	virtual void increase(const int modifier) override;\
  	virtual void decrease(const int modifier) override;\
  	virtual std::string getValueDisplay() const override;\
  	virtual void save() override
  
  class SettingEntryLong final: public SettingEntry {
  	private:
  		long &handle;
  		long value, min, max;
  		void setValue(const long newValue);
  	public:	
  		SettingEntryLong(
  			const std::string &name,
  			const std::string &prefix, const std::string &suffix,
  			long &handle, const long min, const long max
  		);
  		virtual ~SettingEntryLong() override = default;
  		settingEntryMethods;
  		virtual std::string getBottomDisplay() const override;
  		long getValue() const;
  };
  
  class SettingEntryBool final: public SettingEntry {
  	private:
  		bool &handle;
  		bool value;
  		std::string onDisplay, offDisplay;
  		void toggle();
  	public:
  		SettingEntryBool(
  			const std::string &name,
  			bool &handle,
  			const std::string &onDisplay = "ON"s,
  			const std::string &offDisplay = "OFF"s
  		);
  		virtual ~SettingEntryBool() override = default;
  		settingEntryMethods;
  		bool getValue() const;
  };
  
  class SettingEntryEnum final: public SettingEntry {
  	private:
  		long &handle;
  		long value;
  		std::vector<std::string> enums;
  	public:
  		SettingEntryEnum(
  			const std::string &name,
  			long &handle,
  			const std::vector<std::string> &enums
  		);
  		virtual ~SettingEntryEnum() override = default;
  		settingEntryMethods;
  		long getValue() const;
  };
  
  #undef settingEntryMethods