#pragma once #include #include #include #include #include namespace interrupt { namespace detail { template typename X> concept specializes = stdx::is_specialization_of_v, X>; } template concept root_config = requires { { T::children } -> detail::specializes; { T::descendants } -> detail::specializes; typename T::template dynamic_controller_t; }; template concept base_irq_config = status_policy and detail::specializes and requires { { T::template enable() } -> std::same_as; { T::children } -> detail::specializes; { T::descendants } -> detail::specializes; }; template concept irq_config = base_irq_config and requires { { T::irq_number } -> std::same_as; }; template concept sub_irq_config = base_irq_config and requires { T::enable_field; T::status_field; }; template concept base_irq_interface = requires(T const &t) { { t.get_interrupt_enables() } -> detail::specializes; { t.run() } -> std::same_as; }; template concept irq_interface = base_irq_interface and requires(T const &t) { { T::irq_number } -> std::same_as; { t.init_mcu_interrupts() } -> std::same_as; }; template concept sub_irq_interface = base_irq_interface; template concept nexus_for = requires { T::template service(); { T::template service.active } -> std::same_as; }; } // namespace interrupt