/*!\file * \brief \todo Описание файла. */ /* * ValueImplementation.hpp * * Created on: 20 мая 2019 г. * Author: titov */ #ifndef SOURCE_SYSTEMIC_VALUEIMPLEMENTATION_HPP_ #define SOURCE_SYSTEMIC_VALUEIMPLEMENTATION_HPP_ #include "IValue.hpp" #include "IValueOverride.hpp" namespace systemic { template class ValueImplementation : public IValue { volatile const BaseType * const p_value; //!< Указатель на основное значение. public: ValueImplementation( const volatile BaseType & base ); IValue * getValue(); IValueOverride * getValueOverride(); volatile const BaseType * getBase(); virtual operator BaseType() const final; ~ValueImplementation() = default; }; template class ValueOverrideImplementation : public IValue, public IValueOverride { BaseType override_value; //!< Перезаписываемое значение. volatile const BaseType * p_value_process; //!< Указатель на текущее значение. volatile const BaseType * const p_value; //!< Указатель на основное значение. public: ValueOverrideImplementation( const volatile BaseType & base ); IValue * getValue(); IValueOverride * getValueOverride(); volatile const BaseType * getBase(); virtual operator BaseType() const final; virtual void setupOverride() final; virtual void setOverrideValue( BaseType value ) final; virtual BaseType getHiddenValue() const final; virtual void resetOverride() final; ~ValueOverrideImplementation() = default; }; } template inline typename systemic::IValue * systemic::ValueImplementation::getValue() { return this; } template inline typename systemic::IValueOverride * systemic::ValueImplementation::getValueOverride() { return nullptr; } template inline volatile const BaseType * systemic::ValueImplementation::getBase() { return p_value; } template inline systemic::ValueImplementation::operator BaseType() const { return *p_value; } template inline systemic::ValueImplementation::ValueImplementation( const volatile BaseType & base) : p_value(&base) {} //-------------------------------------- template inline typename systemic::IValue * systemic::ValueOverrideImplementation::getValue() { return this; } template inline typename systemic::IValueOverride * systemic::ValueOverrideImplementation::getValueOverride() { return this; } template inline volatile const BaseType * systemic::ValueOverrideImplementation::getBase() { return p_value; } template inline systemic::ValueOverrideImplementation::operator BaseType() const { return *p_value_process; } template inline void systemic::ValueOverrideImplementation::setupOverride() { override_value = *p_value; p_value_process = &override_value; } template inline void systemic::ValueOverrideImplementation::setOverrideValue( BaseType value ) { override_value = value; } template inline BaseType systemic::ValueOverrideImplementation::getHiddenValue() const { return *p_value; } template inline systemic::ValueOverrideImplementation::ValueOverrideImplementation( const volatile BaseType & base) : p_value(&base), p_value_process(&base), override_value(base) {} template inline void systemic::ValueOverrideImplementation::resetOverride() { p_value_process = p_value; } #endif /* SOURCE_SYSTEMIC_VALUEIMPLEMENTATION_HPP_ */