/* * SignalMath.hpp * * Created on: 9 июн. 2020 г. * Author: LeonidTitov */ #ifndef UMLIBRARY_SCHEMATIC_SIGNALMATH_HPP_ #define UMLIBRARY_SCHEMATIC_SIGNALMATH_HPP_ #include "../systemic/ISignal.hh" #include #include namespace systemic { namespace detail { //!Абсолютное значение сигнала. Реализует функцию float = |value|. class SignalAbs : public systemic::ISignal { public: SignalAbs( systemic::ISignal & value ) : value(value) {} operator float() const { return fabsf( value ); } private: systemic::ISignal & value; }; template class SignalEquation2 : public systemic::ISignal { public: SignalEquation2( systemic::ISignal & a, systemic::ISignal & b, Equation eq = Equation() ) : a(a), b(b), equation(eq) {} operator float() const { return equation( a, b ); } private: Equation equation; systemic::ISignal & a; systemic::ISignal & b; }; //!Разница двух сигналов. Реализует функцию float = a - b. typedef SignalEquation2< std::minus > SignalSubtraction; typedef SignalEquation2< std::plus > SignalAddition; typedef SignalEquation2< std::multiplies > SignalMultiplication; typedef SignalEquation2< std::divides > SignalDivision; typedef SignalEquation2< std::modulus > SignalModulation; typedef SignalEquation2< std::pointer_to_binary_function > SignalBinaryFunction; template class SignalEquation1 : public systemic::ISignal { public: SignalEquation1( systemic::ISignal & a, Equation eq = Equation() ) : a(a), equation(eq) {} operator float() const { return equation( a ); } private: Equation equation; systemic::ISignal & a; }; typedef SignalEquation1< std::negate > SignalNegation; typedef SignalEquation1< std::pointer_to_unary_function > SignalUnaryFunction; }} #endif /* UMLIBRARY_SCHEMATIC_SIGNALMATH_HPP_ */