BuGUI
BUtton Grid User Interface
Loading...
Searching...
No Matches
device.hpp
1#pragma once
2#include "common.hpp"
3#include <bugui/labels.hpp>
4#include <bugui/io/button_presser.hpp>
5
6#include <string_view>
7#include <type_traits>
8
9namespace bugui
10{
11template <typename Tp>
13 || std::same_as<Tp, char*>
14 || std::same_as<Tp, std::string_view>;
15
16template <typename Tp>
18 || std::floating_point<Tp>
20
21template <typename Tp>
22concept has_grid = is_valid_id<std::remove_cvref_t
23 <decltype(Tp::grid::ids()[0][0])>>
24 && requires
25{
26 Tp::grid::ids().size() > 2;
27 Tp::grid::ids()[0].size() > 2;
28};
29
30template <typename Tp>
31concept has_buttons = std::is_aggregate_v<class Tp::buttons>;
32
33template <typename Tp>
34concept has_init = std::is_aggregate_v<class Tp::init>
35 && !is_void<decltype(Tp::init::message())>;
36
37template <typename Tp>
39
40template <typename Tp>
41concept has_clear = std::is_aggregate_v<class Tp::clear>
42 && !is_void<decltype(Tp::clear::message())>;
43
44template <typename Tp>
46
47#define has_button(L) \
48template <typename Device> \
49concept device_##L##_button = \
50is_valid_id<decltype(Device::buttons::L##_id())>; \
51 \
52template <typename Controller> \
53concept controller_##L##_button = \
54requires(Controller c, button_presser p) \
55{ std::is_void_v<decltype(c.on_##L(p))>; }; \
56 \
57template <typename Device, typename Controller> \
58concept L##_button = \
59device_##L##_button<Device> \
60&& controller_##L##_button<Controller>;
61// FIXME : find more succint macro
62#define CALL_MACRO(r, data, elem) has_button(elem)
63FOR_EACH_LABEL(CALL_MACRO)
64#undef CALL_MACRO
65#undef has_button
66
67} // namespace bugui
Definition common.hpp:26
Definition device.hpp:45
Definition device.hpp:31
Definition device.hpp:41
Definition device.hpp:22
Definition device.hpp:34
Definition device.hpp:38
Definition common.hpp:22
Definition device.hpp:12
Definition device.hpp:17
Definition common.hpp:19