26 #ifndef CLOE_VEHICLE_HPP_ 27 #define CLOE_VEHICLE_HPP_ 33 #include <type_traits> 47 const std::string& key,
48 const std::vector<std::string>& available_components);
50 const std::string& vehicle()
const {
return vehicle_; }
51 const std::string& unknown_component()
const {
return unknown_; }
52 const std::vector<std::string>& available_components()
const;
57 std::vector<std::string> available_;
67 const std::string& vehicle()
const {
return vehicle_; }
68 const std::string& component_name()
const {
return component_; }
72 std::string component_;
80 CannotAddComponent(
const std::string& msg,
const std::string& vehicle,
const std::string& key);
82 const std::string& vehicle()
const {
return vehicle_; }
83 const std::string& component_name()
const {
return component_; }
87 std::string component_;
110 Vehicle(uint64_t
id,
const std::string& name) :
Model(name), id_(
id) {}
111 virtual ~
Vehicle() noexcept =
default;
119 std::shared_ptr<Vehicle> clone(uint64_t
id,
const std::string& name);
121 uint64_t id()
const {
return id_; }
126 size_t size()
const {
return this->components_.size(); }
131 bool has(
const std::string& key)
const {
return this->components_.count(key) != 0; }
137 template <typename Enum, std::enable_if_t<std::is_enum<Enum>::value,
int> = 0>
139 return this->has(to_string(c));
149 template <
typename T>
150 std::shared_ptr<const T>
get(
const std::string& key)
const {
151 auto ptr = std::dynamic_pointer_cast<
const T>(at(key));
152 if (ptr ==
nullptr) {
158 template <
typename T>
159 std::shared_ptr<T>
get(
const std::string& key) {
160 return std::const_pointer_cast<T>(
const_cast<const Vehicle&
>(*this).
get<T>(key));
169 template <typename T, typename Enum, std::enable_if_t<std::is_enum<Enum>::value,
int> = 0>
170 std::shared_ptr<const T>
get(Enum c)
const {
171 return get<T>(to_string(c));
174 template <typename T, typename Enum, std::enable_if_t<std::is_enum<Enum>::value,
int> = 0>
175 std::shared_ptr<T>
get(Enum c) {
176 return get<T>(to_string(c));
180 template <
typename... Arguments>
181 void new_component(
Component* ptr,
const Arguments&... aliases) {
182 auto sp = std::shared_ptr<Component>(ptr);
183 this->add_component(sp, aliases...);
186 template <
typename First,
typename... Arguments>
187 void add_component(std::shared_ptr<Component> sp,
const First& alias,
188 const Arguments&... aliases) {
189 this->add_component(sp, alias);
190 this->add_component(sp, aliases...);
193 template <typename Enum, std::enable_if_t<std::is_enum<Enum>::value,
int> = 0>
194 void add_component(std::shared_ptr<Component> sp, Enum c) {
195 this->add_component(sp, to_string(c));
198 void add_component(std::shared_ptr<Component> sp,
const std::string& alias) {
199 if (this->has(alias)) {
202 this->set_component(alias, sp);
205 template <
typename First,
typename... Arguments>
206 void emplace_component(std::shared_ptr<Component> sp,
const First& alias,
207 const Arguments&... aliases) {
208 this->emplace_component(sp, alias);
209 this->emplace_component(sp, aliases...);
212 template <typename Enum, std::enable_if_t<std::is_enum<Enum>::value,
int> = 0>
213 void emplace_component(std::shared_ptr<Component> sp, Enum c) {
214 this->emplace_component(sp, to_string(c));
217 void emplace_component(std::shared_ptr<Component> sp,
const std::string& alias) {
218 this->set_component(alias, sp);
221 void set_component(
const std::string& key, std::shared_ptr<Component> component) {
222 this->components_[key] = component;
239 void connect()
override;
240 void disconnect()
override;
243 void reset()
override;
244 void abort()
override;
246 friend void to_json(Json& j,
const Vehicle& v) {
250 {
"components", v.components_},
259 std::shared_ptr<const Component> at(
const std::string& key)
const;
260 std::shared_ptr<Component> at(
const std::string& key);
282 std::map<std::string, std::shared_ptr<Component>> components_;
287 #endif // CLOE_VEHICLE_HPP_ Definition: registrar.hpp:117
bool has(const std::string &key) const
Definition: vehicle.hpp:131
Definition: coordinator.hpp:36
std::chrono::nanoseconds Duration
Definition: duration.hpp:45
size_t size() const
Definition: vehicle.hpp:126
Definition: vehicle.hpp:78
Definition: vehicle.hpp:44
std::string name() const
Definition: entity.hpp:68
Definition: component.hpp:144
Definition: vehicle.hpp:108
Definition: model.hpp:214
bool has(Enum c) const
Definition: vehicle.hpp:138
std::shared_ptr< const T > get(const std::string &key) const
Definition: vehicle.hpp:150
Definition: vehicle.hpp:63