Program Listing for File EnvironmentDescription.cpp

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

#include <utility>
#include <memory>
#include <string>

#include "flamegpu/model/EnvironmentDescription.h"
#include "flamegpu/model/EnvironmentDirectedGraphDescription.cuh"

namespace flamegpu {

CEnvironmentDescription::CEnvironmentDescription(std::shared_ptr<EnvironmentData> data)
    : environment(std::move(data)) { }
CEnvironmentDescription::CEnvironmentDescription(std::shared_ptr<const EnvironmentData> data)
    : environment(std::const_pointer_cast<EnvironmentData>(data)) { }

bool CEnvironmentDescription::operator==(const CEnvironmentDescription& rhs) const {
    return *this->environment == *rhs.environment;  // Compare content is functionally the same
}
bool CEnvironmentDescription::operator!=(const CEnvironmentDescription& rhs) const {
    return !(*this == rhs);
}

bool CEnvironmentDescription::getConst(const std::string& name) const {
    for (auto& i : environment->properties) {
        if (i.first == name) {
            return i.second.isConst;
        }
    }
    THROW exception::InvalidEnvProperty("Environmental property with name '%s' does not exist, "
        "in EnvironmentDescription::getConst().",
        name.c_str());
}
CEnvironmentDirectedGraphDescription CEnvironmentDescription::getDirectedGraph(const std::string& graph_name) const {
    auto r = this->environment->directed_graphs.find(graph_name);
    if (r == this->environment->directed_graphs.end()) {
        THROW exception::InvalidGraphName("Directed graph with name '%s' already exists, "
            "in EnvironmentDescription::getDirectedGraph().",
            graph_name.c_str());
    }
    return CEnvironmentDirectedGraphDescription(r->second);
}

EnvironmentDescription::EnvironmentDescription(std::shared_ptr<EnvironmentData> data)
    : CEnvironmentDescription(std::move(data)) { }

void EnvironmentDescription::newProperty(const std::string &name, const char *ptr, size_t length, bool isConst, flamegpu::size_type elements, const std::type_index &type) {
    environment->properties.emplace(name, EnvironmentData::PropData(isConst, detail::Any(ptr, length, type, elements)));
}
EnvironmentDirectedGraphDescription EnvironmentDescription::newDirectedGraph(const std::string& graph_name) {
    if (this->environment->directed_graphs.find(graph_name) == this->environment->directed_graphs.end()) {
        auto t = std::shared_ptr<EnvironmentDirectedGraphData>(new EnvironmentDirectedGraphData(this->environment, graph_name));
        this->environment->directed_graphs.emplace(graph_name, t);
        return EnvironmentDirectedGraphDescription(t);
    }
    THROW exception::InvalidGraphName("Directed graph with name '%s' already exists, "
        "in EnvironmentDescription::newDirectedGraph().",
        graph_name.c_str());
}
EnvironmentDirectedGraphDescription EnvironmentDescription::getDirectedGraph(const std::string& graph_name) {
    auto r = this->environment->directed_graphs.find(graph_name);
    if (r == this->environment->directed_graphs.end()) {
        THROW exception::InvalidGraphName("Directed graph with name '%s' already exists, "
            "in EnvironmentDescription::getDirectedGraph().",
            graph_name.c_str());
    }
    return EnvironmentDirectedGraphDescription(r->second);
}

}  // namespace flamegpu