Program Listing for File LayerData.cpp

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

#include "flamegpu/model/LayerData.h"

#include <string>
#include <memory>

#include "flamegpu/model/LayerDescription.h"
#include "flamegpu/model/SubModelData.h"

namespace flamegpu {

LayerData::LayerData(const std::shared_ptr<const ModelData> &_model, const std::string &layer_name, const flamegpu::size_type &layer_index)
    : model(_model)
    , name(layer_name)
    , index(layer_index) { }

LayerData::LayerData(const std::shared_ptr<const ModelData> &_model, const LayerData &other)
    : model(_model)
    , host_functions(other.host_functions)
    , host_functions_callbacks(other.host_functions_callbacks)
    , name(other.name)
    , index(other.index) {
    // Manually perform lookup copies
    for (auto &_f : other.agent_functions) {
        for (auto &a : _model->agents) {
            for (auto &f : a.second->functions) {
                if (*f.second == *_f) {
                    agent_functions.emplace(f.second);
                    goto next_agent_fn;
                }
            }
        }
    next_agent_fn : {}
    }
    if (other.sub_model) {
        for (auto &a : _model->submodels) {
            if (other.sub_model->name == a.second->name) {
                sub_model = a.second;
            }
        }
    }
}

bool LayerData::operator==(const LayerData &rhs) const {
    if (this == &rhs)  // They point to same object
        return true;
    if (name == rhs.name
    //  && model.lock() == rhs.model.lock()  // Don't check weak pointers
    && index == rhs.index
    && agent_functions.size() == rhs.agent_functions.size()
    && host_functions.size() == rhs.host_functions.size()
    && host_functions_callbacks.size() == rhs.host_functions_callbacks.size()
    && host_functions_callbacks == rhs.host_functions_callbacks) {
        // Compare pointed to values, not pointers
        for (auto &a : agent_functions) {
            bool success = false;
            for (auto &b : rhs.agent_functions) {
                if (*a == *b) {
                    success = true;
                    break;
                }
            }
            if (!success) {
                return false;
            }
        }
        for (auto &a : host_functions) {
            bool success = false;
            for (auto &b : rhs.host_functions) {
                if (*a == *b) {
                    success = true;
                    break;
                }
            }
            if (!success) {
                return false;
            }
        }
        return true;
    }
    return false;
}

bool LayerData::operator!=(const LayerData &rhs) const {
    return !operator==(rhs);
}

}  // namespace flamegpu