Skip to content

File generic_signal_operator.hpp

File List > backends > cxx > include > zmbt > model > generic_signal_operator.hpp

Go to the documentation of this file

#ifndef ZMBT_MODEL_GENERIC_SIGNAL_OPERATOR_HPP_
#define ZMBT_MODEL_GENERIC_SIGNAL_OPERATOR_HPP_


#include <boost/json.hpp>
#include <zmbt/core/type_tag.hpp>
#include <zmbt/reflect/serialization.hpp>
#include <zmbt/reflect/signal_traits.hpp>
#include <iostream>

namespace zmbt {


class GenericSignalOperator
{
    boost::json::value value_;

public:

    GenericSignalOperator() = default;
    explicit GenericSignalOperator(boost::json::value const& value);
    explicit GenericSignalOperator(boost::json::array const& value);
    explicit GenericSignalOperator(boost::json::object const& value);

    template <class T>
    GenericSignalOperator(T const& sample)
        : GenericSignalOperator{json_from(sample)}
    {
    }

    template<class T>
    GenericSignalOperator(type_tag<T>)
        : GenericSignalOperator(reflect::signal_traits<T>::init())
    {
    }

    bool operator==(GenericSignalOperator const& other) const;
    bool operator!=(GenericSignalOperator const& rhs) const;
    bool operator<(GenericSignalOperator const& other) const;
    bool operator>=(GenericSignalOperator const& rhs) const;
    bool operator>(GenericSignalOperator const& rhs) const;
    bool operator<=(GenericSignalOperator const& rhs) const;

    GenericSignalOperator operator&&(GenericSignalOperator const& rhs) const;
    GenericSignalOperator operator||(GenericSignalOperator const& rhs) const;

    boost::json::value operator-() const;
    boost::json::value operator~() const;

    boost::json::value operator+(GenericSignalOperator const& rhs) const;
    boost::json::value operator-(GenericSignalOperator const& rhs) const;
    boost::json::value operator*(GenericSignalOperator const& rhs) const;
    boost::json::value operator/(GenericSignalOperator const& rhs) const;
    boost::json::value operator%(GenericSignalOperator const& rhs) const;
    boost::json::value operator&(GenericSignalOperator const& rhs) const;
    boost::json::value operator|(GenericSignalOperator const& rhs) const;
    boost::json::value operator^(GenericSignalOperator const& rhs) const;
    boost::json::value operator<<(GenericSignalOperator const& rhs) const;
    boost::json::value operator>>(GenericSignalOperator const& rhs) const;

    boost::json::value pow(GenericSignalOperator const& rhs) const;
    boost::json::value log(GenericSignalOperator const& rhs) const;
    boost::json::value quot(GenericSignalOperator const& rhs) const;



    operator bool() const;


    boost::json::value const& value() const& {
        return value_;
    }


    operator boost::json::value() const& {
        return value();
    }

    friend std::ostream& operator<<(std::ostream& os, GenericSignalOperator const& sample)
    {
        os << sample.value();
        return os;
    }

};


}

#endif // ZMBT_MODEL_GENERIC_SIGNAL_OPERATOR_HPP_