class IResetable
{
public: virtual void Reset(void) = 0;
};
template<typename ConfigStruct>
class Config
{
// Fields
public:
const ConfigStruct defaults;
ConfigStruct config;
// Methods
protected:
Config(ConfigStruct defaults)
: defaults(defaults)
{
}
// Methods
public:
virtual bool SetConfig(ConfigStruct new_config)
{
config = new_config;
return true;
};
virtual ConfigStruct GetConfig(void)
{
return config;
};
virtual bool RestoreDefaultConfig(void)
{
config = defaults;
return true;
}
virtual ConfigStruct GetDefaults(void)
{
return defaults;
};
};
template <typename ConfigStruct, typename StateStruct>
class AppliedEntity
: public IResetable
, public Config<ConfigStruct>
{
StateStruct state;
public:
AppliedEntity(const ConfigStruct defaults)
: Config<ConfigStruct>(defaults)
{
}
virtual void Init(void)
{
this->config.open_delay = 1;
}
virtual bool SetConfig(ConfigStruct new_config)
{
Reset();
this->config = new_config;
Reset();
return true;
}
};
struct FlapConfig
{
int open_delay;
int port;
};
struct FlapState
{
int elapsed_time;
};
class Flap
: public AppliedEntity<FlapConfig, FlapState>
{
private:
public:
Flap(FlapConfig config)
: AppliedEntity<FlapConfig, FlapState>(config)
{
}
void Reset(void)
{
}
};
FlapConfig config = { 1, 1 };
Flap flap(config);
int main(void)
{
flap.config.open_delay = 0;
}