77 lines
2.1 KiB
C++
77 lines
2.1 KiB
C++
|
|
/*
|
|||
|
|
* SignalMath.hpp
|
|||
|
|
*
|
|||
|
|
* Created on: 9 июн. 2020 г.
|
|||
|
|
* Author: LeonidTitov
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#ifndef UMLIBRARY_SCHEMATIC_SIGNALMATH_HPP_
|
|||
|
|
#define UMLIBRARY_SCHEMATIC_SIGNALMATH_HPP_
|
|||
|
|
|
|||
|
|
#include "../systemic/ISignal.hh"
|
|||
|
|
|
|||
|
|
#include <cmath>
|
|||
|
|
#include <functional>
|
|||
|
|
|
|||
|
|
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<typename Equation>
|
|||
|
|
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<float> > SignalSubtraction;
|
|||
|
|
typedef SignalEquation2< std::plus<float> > SignalAddition;
|
|||
|
|
typedef SignalEquation2< std::multiplies<float> > SignalMultiplication;
|
|||
|
|
typedef SignalEquation2< std::divides<float> > SignalDivision;
|
|||
|
|
typedef SignalEquation2< std::modulus<float> > SignalModulation;
|
|||
|
|
typedef SignalEquation2< std::pointer_to_binary_function<float, float, float> >
|
|||
|
|
SignalBinaryFunction;
|
|||
|
|
|
|||
|
|
|
|||
|
|
template<typename Equation>
|
|||
|
|
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<float> > SignalNegation;
|
|||
|
|
typedef SignalEquation1< std::pointer_to_unary_function<float, float> > SignalUnaryFunction;
|
|||
|
|
|
|||
|
|
}}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#endif /* UMLIBRARY_SCHEMATIC_SIGNALMATH_HPP_ */
|