3#include <bugui/labels.hpp>
4#include <bugui/io/button_presser.hpp>
13 || std::same_as<Tp, char*>
14 || std::same_as<Tp, std::string_view>;
18 || std::floating_point<Tp>
23 <
decltype(Tp::grid::ids()[0][0])>>
26 Tp::grid::ids().size() > 2;
27 Tp::grid::ids()[0].size() > 2;
34concept has_init = std::is_aggregate_v<class Tp::init>
35 && !
is_void<
decltype(Tp::init::message())>;
41concept has_clear = std::is_aggregate_v<class Tp::clear>
42 && !
is_void<
decltype(Tp::clear::message())>;
47#define has_button(L) \
48template <typename Device> \
49concept device_##L##_button = \
50is_valid_id<decltype(Device::buttons::L##_id())>; \
52template <typename Controller> \
53concept controller_##L##_button = \
54requires(Controller c, button_presser p) \
55{ std::is_void_v<decltype(c.on_##L(p))>; }; \
57template <typename Device, typename Controller> \
59device_##L##_button<Device> \
60&& controller_##L##_button<Controller>;
62#define CALL_MACRO(r, data, elem) has_button(elem)
63FOR_EACH_LABEL(CALL_MACRO)