Program Listing for File AgentData.cpp
↰ Return to documentation for file (src/flamegpu/model/AgentData.cpp
)
#include "flamegpu/model/AgentData.h"
#include <string>
#include <memory>
#include "flamegpu/model/AgentDescription.h"
#include "flamegpu/model/AgentFunctionDescription.h"
namespace flamegpu {
AgentData::AgentData(std::shared_ptr<const ModelData> _model, const std::string &agent_name)
: model(_model)
, initial_state(ModelData::DEFAULT_STATE)
, agent_outputs(0)
, name(agent_name)
, keepDefaultState(false)
, sortPeriod(1) {
states.insert(ModelData::DEFAULT_STATE);
// All agents have an internal _id variable
variables.emplace(ID_VARIABLE_NAME, Variable(std::array<id_t, 1>{ ID_NOT_SET }));
}
std::shared_ptr<const AgentData> AgentData::clone() const {
std::shared_ptr<AgentData> b = std::shared_ptr<AgentData>(new AgentData(nullptr, *this));
// Manually copy construct maps of shared ptr
for (const auto &f : functions) {
// Passing model is risky here, as the weak_ptr for agent output will point here
b->functions.emplace(f.first, std::shared_ptr<AgentFunctionData>(new AgentFunctionData(model.lock(), b, *f.second)));
}
return b;
}
AgentData::AgentData(std::shared_ptr<const ModelData> _model, const AgentData &other)
: model(_model)
, variables(other.variables)
, states(other.states)
, initial_state(other.initial_state)
, agent_outputs(other.agent_outputs)
, name(other.name)
, keepDefaultState(other.keepDefaultState)
, sortPeriod(other.sortPeriod) { }
bool AgentData::operator==(const CAgentDescription& rhs) const {
return *this == *rhs.agent;
}
bool AgentData::operator==(const AgentData &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
&& initial_state == rhs.initial_state
&& agent_outputs == rhs.agent_outputs
&& keepDefaultState == rhs.keepDefaultState
&& sortPeriod == rhs.sortPeriod
&& functions.size() == rhs.functions.size()
&& variables.size() == rhs.variables.size()
&& states.size() == rhs.states.size()) {
{ // Compare functions
for (auto& v : functions) {
auto _v = rhs.functions.find(v.first);
if (_v == rhs.functions.end())
return false;
if (*v.second != *_v->second)
return false;
}
}
{ // Compare variables
for (auto& v : variables) {
auto _v = rhs.variables.find(v.first);
if (_v == rhs.variables.end())
return false;
if (v.second.type_size != _v->second.type_size || v.second.type != _v->second.type || v.second.elements != _v->second.elements)
return false;
}
}
{ // Compare state lists
if (states != rhs.states)
return false;
}
return true;
}
return false;
}
bool AgentData::operator!=(const AgentData &rhs) const {
return !operator==(rhs);
}
bool AgentData::isOutputOnDevice() const {
return agent_outputs > 0;
}
} // namespace flamegpu