79class ComponentContext
final {
81 ComponentContext(ComponentContext&&) =
delete;
82 ComponentContext& operator=(ComponentContext&&) =
delete;
97 return FindComponent<T>(impl::NameFromComponentType<T>());
101 template <
typename T>
102 T& FindComponent(std::string_view name)
const {
103 if (!Contains(name)) {
104 ThrowNonRegisteredComponent(name,
compiler::GetTypeName<T>());
107 auto* component_base = DoFindComponent(name);
108 T* ptr =
dynamic_cast<T*>(component_base);
110 ThrowComponentTypeMismatch(name,
compiler::GetTypeName<T>(), component_base);
116 template <
typename T>
117 T& FindComponent(std::string_view = {}) {
118 return ReportMisuse<T>();
123 template <
typename T>
125 return FindComponentOptional<T>(impl::NameFromComponentType<T>());
129 template <
typename T>
130 T* FindComponentOptional(std::string_view name)
const {
131 if (!Contains(name)) {
134 return dynamic_cast<T*>(DoFindComponent(name));
137 template <
typename T>
138 T& FindComponentOptional(std::string_view = {}) {
139 return ReportMisuse<T>();
145 template <
typename T>
146 engine::TaskProcessor& GetTaskProcessor(
const T&) {
147 return ReportMisuse<T>();
165 ComponentContext(
utils::impl::InternalTag, impl::ComponentContextImpl& impl, impl::ComponentInfo& component_info)
169 impl::ComponentContextImpl& GetImpl(
utils::impl::InternalTag)
const;
172 const impl::Manager& GetManager(
utils::impl::InternalTag)
const;
178 bool Contains(std::string_view name)
const noexcept;
180 template <
typename T>
181 bool Contains(
const T&) {
182 return ReportMisuse<T>();
186 decltype(
auto) ReportMisuse() {
189 "components::ComponentContext should be accepted by "
190 "a constant reference, i.e. "
191 "`MyComponent(const components::ComponentConfig& config, "
192 "const components::ComponentContext& context)`"
197 [[noreturn]]
void ThrowNonRegisteredComponent(std::string_view name, std::string_view type)
const;
199 [[noreturn]]
void ThrowComponentTypeMismatch(
200 std::string_view name,
201 std::string_view type,
207 impl::ComponentContextImpl& impl_;
208 impl::ComponentInfo& component_info_;