80class ComponentContext
final {
82 ComponentContext(ComponentContext&&) =
delete;
83 ComponentContext& operator=(ComponentContext&&) =
delete;
98 return FindComponent<T>(impl::NameFromComponentType<T>());
102 template <
typename T>
103 T& FindComponent(std::string_view name)
const {
104 if (!Contains(name)) {
105 ThrowNonRegisteredComponent(name,
compiler::GetTypeName<T>());
108 auto* component_base = DoFindComponent(name);
109 T* ptr =
dynamic_cast<T*>(component_base);
111 ThrowComponentTypeMismatch(name,
compiler::GetTypeName<T>(), component_base);
117 template <
typename T>
118 T& FindComponent(std::string_view = {}) {
119 return ReportMisuse<T>();
124 template <
typename T>
126 return FindComponentOptional<T>(impl::NameFromComponentType<T>());
130 template <
typename T>
131 T* FindComponentOptional(std::string_view name)
const {
132 if (!Contains(name)) {
135 return dynamic_cast<T*>(DoFindComponent(name));
138 template <
typename T>
139 T& FindComponentOptional(std::string_view = {}) {
140 return ReportMisuse<T>();
146 template <
typename T>
147 engine::TaskProcessor& GetTaskProcessor(
const T&) {
148 return ReportMisuse<T>();
175 ComponentContext(utils::
impl::InternalTag, impl::ComponentContextImpl& impl, impl::ComponentInfo& component_info)
179 impl::ComponentContextImpl& GetImpl(utils::
impl::InternalTag)
const;
182 const impl::Manager& GetManager(utils::
impl::InternalTag)
const;
188 bool Contains(std::string_view name)
const noexcept;
190 template <
typename T>
191 bool Contains(
const T&) {
192 return ReportMisuse<T>();
196 decltype(
auto) ReportMisuse() {
199 "components::ComponentContext should be accepted by "
200 "a constant reference, i.e. "
201 "`MyComponent(const components::ComponentConfig& config, "
202 "const components::ComponentContext& context)`"
207 [[noreturn]]
void ThrowNonRegisteredComponent(std::string_view name, std::string_view type)
const;
209 [[noreturn]]
void ThrowComponentTypeMismatch(
210 std::string_view name,
211 std::string_view type,
217 impl::ComponentContextImpl& impl_;
218 impl::ComponentInfo& component_info_;