Skip to content

File environment_data.hpp

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

Go to the documentation of this file

#ifndef ZMBT_MODEL_ENVIRONMENT_DATA_HPP_
#define ZMBT_MODEL_ENVIRONMENT_DATA_HPP_


#include <cstdint>
#include <map>
#include <memory>
#include <tuple>
#include <mutex>
#include <typeindex>
#include <type_traits>


#include "signal_operator_handler.hpp"
#include "test_failure.hpp"
#include "trigger.hpp"


namespace zmbt {


struct EnvironmentData {

    using mutex_t = std::recursive_mutex;
    using lock_t = std::unique_lock<mutex_t>;

    using shared_data_record = std::pair<std::type_index, std::shared_ptr<void>>;
    using shared_data_table = std::map<boost::json::string, shared_data_record>;
    shared_data_table shared;


    using FailureHandler = std::function<void(boost::json::value const&)>;
    FailureHandler failure_handler {default_test_failure};


    static boost::json::value init_json_data()
    {
        return {
            {"interface_records", boost::json::object()},
            {"prototypes"       , boost::json::object()},
            {"vars"             , boost::json::object()},
            {"refs"             , boost::json::object()}
        };
    }
    JsonNode json_data {init_json_data()};

    std::map<boost::json::string, std::function<void()>> callbacks;
    std::map<boost::json::string, Trigger> triggers;
    std::map<interface_id, TriggerIfc> trigger_ifcs;
    std::map<object_id, TriggerObj> trigger_objs;
    std::map<boost::json::string, SignalOperatorHandler> operators;

    mutex_t mutable mutex;

    EnvironmentData()
    {
    }

    EnvironmentData(EnvironmentData &&o)
    {
        lock_t lock(o.mutex);
        shared = std::move(o.shared);
        json_data = std::move(o.json_data);
        callbacks = std::move(o.callbacks);
        operators = std::move(o.operators);
        failure_handler = std::move(o.failure_handler);
    }

    EnvironmentData& operator=(EnvironmentData &&o)
    {
        if (this != &o)
        {
            lock_t l_lock(mutex, std::defer_lock);
            lock_t r_lock(o.mutex, std::defer_lock);
            std::lock(l_lock, r_lock);
            shared = std::move(o.shared);
            json_data = std::move(o.json_data);
            callbacks = std::move(o.callbacks);
            operators = std::move(o.operators);
            failure_handler = std::move(o.failure_handler);
        }
        return *this;
    }

    EnvironmentData(EnvironmentData const& o)
    {
        lock_t lock(o.mutex);
        shared = o.shared;
        json_data = o.json_data;
        callbacks = o.callbacks;
        operators = o.operators;
        failure_handler = o.failure_handler;
    }

    EnvironmentData& operator=(EnvironmentData const& o)
    {
        if (this != &o)
        {
            lock_t l_lock(mutex, std::defer_lock);
            lock_t r_lock(o.mutex, std::defer_lock);
            std::lock(l_lock, r_lock);
            shared = o.shared;
            json_data = o.json_data;
            callbacks = o.callbacks;
            operators = o.operators;
            failure_handler = o.failure_handler;
        }
        return *this;
    }


    virtual ~EnvironmentData() {
    }
};



}  // namespace zmbt

#endif  // ZMBT_MAPPING_ENVIRONMENT_DATA_HPP_