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_ */
|