Program Listing for File EnvironmentData.cpp

Return to documentation for file (src/flamegpu/model/EnvironmentData.cpp)

#include "flamegpu/model/EnvironmentData.h"

#include <memory>

#include "flamegpu/model/EnvironmentDirectedGraphData.cuh"

namespace flamegpu {

EnvironmentData::EnvironmentData(std::shared_ptr<const ModelData> _model)
    : model(_model) {
    // Add CUDASimulation specific environment members
    // We do this here, to not break comparing different model description hierarchies before/after CUDASimulation creation
    properties.emplace("_stepCount", PropData(false, detail::Any(0u)));
}

EnvironmentData::EnvironmentData(std::shared_ptr<const ModelData> _model, const EnvironmentData& other)
    : model(_model)
    , properties(other.properties)
    , macro_properties(other.macro_properties) {
    directed_graphs.clear();
    for (const auto& g : other.directed_graphs) {
        auto t = std::shared_ptr<EnvironmentDirectedGraphData>(new EnvironmentDirectedGraphData(_model, *g.second));
        directed_graphs.emplace(g.first, t);
    }
}

bool EnvironmentData::operator==(const EnvironmentData& rhs) const {
    if (this == &rhs)  // They point to same object
        return true;
    //  if(model.lock() != rhs.model.lock()) return false;  // Don't check weak pointers
    if (properties.size() == rhs.properties.size()) {
        for (auto& v : properties) {
            auto _v = rhs.properties.find(v.first);
            if (_v == rhs.properties.end())
                return false;
            if (v.second != _v->second)
                return false;
        }
        return true;
    }
    if (macro_properties.size() == rhs.macro_properties.size()) {
        for (auto& v : macro_properties) {
            auto _v = rhs.macro_properties.find(v.first);
            if (_v == rhs.macro_properties.end())
                return false;
            if (v.second != _v->second)
                return false;
        }
        return true;
    }
    if (macro_properties.size() == rhs.macro_properties.size()) {
        for (auto& v : macro_properties) {
            auto _v = rhs.macro_properties.find(v.first);
            if (_v == rhs.macro_properties.end())
                return false;
            if (v.second != _v->second)
                return false;
        }
        return true;
    }
    if (directed_graphs.size() == rhs.directed_graphs.size()) {
        for (auto& v : directed_graphs) {
            auto _v = rhs.directed_graphs.find(v.first);
            if (_v == rhs.directed_graphs.end())
                return false;
            if (v.second != _v->second)
                return false;
        }
        return true;
    }
    return false;
}
bool EnvironmentData::operator!=(const EnvironmentData& rhs) const {
    return !(*this == rhs);
}

}  // namespace flamegpu