31 #include <type_traits>
45 const std::string& key,
46 const std::vector<std::string>& available_components);
48 const std::string& vehicle()
const {
return vehicle_; }
49 const std::string& unknown_component()
const {
return unknown_; }
50 const std::vector<std::string>& available_components()
const;
55 std::vector<std::string> available_;
65 const std::string& vehicle()
const {
return vehicle_; }
66 const std::string& component_name()
const {
return component_; }
70 std::string component_;
78 CannotAddComponent(
const std::string& msg,
const std::string& vehicle,
const std::string& key);
80 const std::string& vehicle()
const {
return vehicle_; }
81 const std::string& component_name()
const {
return component_; }
85 std::string component_;
109 virtual ~
Vehicle() noexcept =
default;
117 std::shared_ptr<Vehicle>
clone(uint64_t
id,
const std::string&
name);
119 uint64_t id()
const {
return id_; }
124 size_t size()
const {
return this->components_.size(); }
129 bool has(
const std::string& key)
const {
return this->components_.count(key) != 0; }
135 template <typename Enum, std::enable_if_t<std::is_enum<Enum>::value,
int> = 0>
137 return this->
has(to_string(c));
147 template <
typename T>
148 std::shared_ptr<const T>
get(
const std::string& key)
const {
149 auto ptr = std::dynamic_pointer_cast<const T>(
at(key));
150 if (ptr ==
nullptr) {
156 template <
typename T>
157 std::shared_ptr<T>
get(
const std::string& key) {
158 return std::const_pointer_cast<T>(
const_cast<const Vehicle&
>(*this).
get<T>(key));
167 template <typename T, typename Enum, std::enable_if_t<std::is_enum<Enum>::value,
int> = 0>
168 std::shared_ptr<const T>
get(Enum c)
const {
169 return get<T>(to_string(c));
172 template <typename T, typename Enum, std::enable_if_t<std::is_enum<Enum>::value,
int> = 0>
173 std::shared_ptr<T>
get(Enum c) {
174 return get<T>(to_string(c));
178 template <
typename... Arguments>
179 void new_component(Component* ptr,
const Arguments&... aliases) {
180 auto sp = std::shared_ptr<Component>(ptr);
181 this->add_component(sp, aliases...);
184 template <
typename First,
typename... Arguments>
185 void add_component(std::shared_ptr<Component> sp,
const First& alias,
186 const Arguments&... aliases) {
187 this->add_component(sp, alias);
188 this->add_component(sp, aliases...);
191 template <typename Enum, std::enable_if_t<std::is_enum<Enum>::value,
int> = 0>
192 void add_component(std::shared_ptr<Component> sp, Enum c) {
193 this->add_component(sp, to_string(c));
196 void add_component(std::shared_ptr<Component> sp,
const std::string& alias) {
197 if (this->
has(alias)) {
198 throw CannotAddComponent(
"component already exists",
name(), alias);
200 this->set_component(alias, sp);
203 template <
typename First,
typename... Arguments>
204 void emplace_component(std::shared_ptr<Component> sp,
const First& alias,
205 const Arguments&... aliases) {
206 this->emplace_component(sp, alias);
207 this->emplace_component(sp, aliases...);
210 template <typename Enum, std::enable_if_t<std::is_enum<Enum>::value,
int> = 0>
211 void emplace_component(std::shared_ptr<Component> sp, Enum c) {
212 this->emplace_component(sp, to_string(c));
215 void emplace_component(std::shared_ptr<Component> sp,
const std::string& alias) {
216 this->set_component(alias, sp);
219 void set_component(
const std::string& key, std::shared_ptr<Component> component) {
220 this->components_[key] = component;
223 std::vector<std::string> component_names()
const {
224 std::vector<std::string> results;
225 results.reserve(components_.size());
226 for (
const auto& kv : components_) {
227 results.emplace_back(kv.first);
249 void enroll(Registrar& r)
override;
250 void reset()
override;
251 void abort()
override;
253 friend void to_json(Json& j,
const Vehicle& v) {
257 {
"components", v.components_},
266 std::shared_ptr<const Component>
at(
const std::string& key)
const;
267 std::shared_ptr<Component>
at(
const std::string& key);
289 std::map<std::string, std::shared_ptr<Component>> components_;
Definition: vehicle.hpp:61
Definition: vehicle.hpp:76
const std::string & name() const
Definition: entity.hpp:67
Definition: model.hpp:203
Definition: vehicle.hpp:42
Definition: vehicle.hpp:106
void abort() override
Definition: vehicle.cpp:92
void disconnect() override
Definition: vehicle.cpp:59
void enroll(Registrar &r) override
Definition: vehicle.cpp:44
size_t size() const
Definition: vehicle.hpp:124
std::shared_ptr< const T > get(Enum c) const
Definition: vehicle.hpp:168
void connect() override
Definition: vehicle.cpp:48
bool has(Enum c) const
Definition: vehicle.hpp:136
Duration process(const Sync &sync) override
Definition: vehicle.cpp:70
bool has(const std::string &key) const
Definition: vehicle.hpp:129
void reset() override
Definition: vehicle.cpp:86
std::shared_ptr< const Component > at(const std::string &key) const
Definition: vehicle.cpp:98
std::shared_ptr< const T > get(const std::string &key) const
Definition: vehicle.hpp:148
std::shared_ptr< Vehicle > clone(uint64_t id, const std::string &name)
Definition: vehicle.cpp:38
std::chrono::nanoseconds Duration
Definition: cloe_fwd.hpp:36
nlohmann::json Json
Definition: fable_fwd.hpp:35