diff options
Diffstat (limited to 'mbuoy')
-rw-r--r-- | mbuoy/attr/dimensions.hpp | 14 | ||||
-rw-r--r-- | mbuoy/attr/ondraw.hpp | 21 | ||||
-rw-r--r-- | mbuoy/attr/position.hpp | 14 | ||||
-rw-r--r-- | mbuoy/attr/string.hpp | 24 | ||||
-rw-r--r-- | mbuoy/find.hpp | 57 | ||||
-rw-r--r-- | mbuoy/port.hpp | 18 | ||||
-rw-r--r-- | mbuoy/ui/button.hpp | 37 | ||||
-rw-r--r-- | mbuoy/ui/label.hpp | 32 | ||||
-rw-r--r-- | mbuoy/view.hpp | 29 |
9 files changed, 246 insertions, 0 deletions
diff --git a/mbuoy/attr/dimensions.hpp b/mbuoy/attr/dimensions.hpp new file mode 100644 index 0000000..9c1fda9 --- /dev/null +++ b/mbuoy/attr/dimensions.hpp @@ -0,0 +1,14 @@ +#ifndef MBUOY_ATTR_DIMENSIONS_HPP +#define MBUOY_ATTR_DIMENSIONS_HPP + +namespace mbuoy { + +struct dimensions +{ + int width, height; +}; + +} // namespace mbuoy + +#endif // MBUOY_ATTR_DIMENSIONS_HPP + diff --git a/mbuoy/attr/ondraw.hpp b/mbuoy/attr/ondraw.hpp new file mode 100644 index 0000000..d0932ef --- /dev/null +++ b/mbuoy/attr/ondraw.hpp @@ -0,0 +1,21 @@ +#ifndef MBUOY_ATTR_ONDRAW_HPP +#define MBUOY_ATTR_ONDRAW_HPP + +#include "position.hpp" +#include "dimensions.hpp" + +namespace mbuoy { + +struct ondraw +{ + void (*func)(const position&, const dimensions&); + + void operator()(const position& pos, const dimensions& dim) const noexcept { + func(pos, dim); + } +}; + +} // namespace mbuoy + +#endif // MBUOY_ATTR_ONDRAW_HPP + diff --git a/mbuoy/attr/position.hpp b/mbuoy/attr/position.hpp new file mode 100644 index 0000000..dfb9cc7 --- /dev/null +++ b/mbuoy/attr/position.hpp @@ -0,0 +1,14 @@ +#ifndef MBUOY_ATTR_POSITION_HPP +#define MBUOY_ATTR_POSITION_HPP + +namespace mbuoy { + +struct position +{ + int x, y; +}; + +} // namespace mbuoy + +#endif // MBUOY_ATTR_POSITION_HPP + diff --git a/mbuoy/attr/string.hpp b/mbuoy/attr/string.hpp new file mode 100644 index 0000000..d7e1fcb --- /dev/null +++ b/mbuoy/attr/string.hpp @@ -0,0 +1,24 @@ +#ifndef MBUOY_ATTR_STRING_HPP +#define MBUOY_ATTR_STRING_HPP + +namespace mbuoy { + +template<int N> +struct string +{ + consteval string(const char (&s_)[N]) { + for (int i = 0; i < N; ++i) + s[i] = s_[i]; + } + + consteval operator const char *() const { + return s; + } + + char s[N]; +}; + +} // namespace mbuoy + +#endif // MBUOY_ATTR_STRING_HPP + diff --git a/mbuoy/find.hpp b/mbuoy/find.hpp new file mode 100644 index 0000000..edba06d --- /dev/null +++ b/mbuoy/find.hpp @@ -0,0 +1,57 @@ +#ifndef MBUOY_FIND_HPP +#define MBUOY_FIND_HPP + +#include <optional> +#include <type_traits> + +namespace mbuoy { + +template<typename T, typename U> +concept can_static_cast = requires(U u) { + static_cast<T>(u); +}; + +template<typename T> +consteval std::optional<T> find(T val) +{ + return val; +} + +template<typename T, typename U> + requires (!std::is_same_v<T, U> && can_static_cast<T, U>) +consteval std::optional<U> find(U val) +{ + return val; +} + +template<typename T, typename U> + requires (!std::is_same_v<T, U> && !can_static_cast<T, U>) +consteval std::optional<T> find(U val) +{ + return {}; +} + +template<typename T> +consteval std::optional<T> find(T val, auto... vals) +{ + return val; +} + +template<typename T, typename U> + requires (!std::is_same_v<T, U> && can_static_cast<T, U>) +consteval std::optional<U> find(U val, auto... vals) +{ + return val; +} + +template<typename T, typename U> + requires (!std::is_same_v<T, U> && !can_static_cast<T, U>) +consteval auto find(U val, auto... vals) +{ + return find<T>(vals...); +} + +} // namespace mbuoy + +#endif // MBUOY_FIND_HPP + diff --git a/mbuoy/port.hpp b/mbuoy/port.hpp new file mode 100644 index 0000000..366f498 --- /dev/null +++ b/mbuoy/port.hpp @@ -0,0 +1,18 @@ +#ifndef MBUOY_PORT_HPP +#define MBUOY_PORT_HPP + +#include <cstdio> + +namespace mbuoy { +namespace port { + +inline void puts(int x, int y, const char *s) +{ + std::printf("[%d, %d]: %s\n", x, y, s); +} + +} // namespace port +} // namespace mbuoy + +#endif // MBUOY_PORT_HPP + diff --git a/mbuoy/ui/button.hpp b/mbuoy/ui/button.hpp new file mode 100644 index 0000000..c6e5b66 --- /dev/null +++ b/mbuoy/ui/button.hpp @@ -0,0 +1,37 @@ +#ifndef MBUOY_UI_BUTTON_HPP +#define MBUOY_UI_BUTTON_HPP + +#include "../attr/dimensions.hpp" +#include "../attr/ondraw.hpp" +#include "../attr/position.hpp" +#include "../attr/string.hpp" +#include "../find.hpp" +#include "../port.hpp" + +namespace mbuoy { + +template<auto... Attr> +struct button +{ + static constexpr auto point = find<position>(Attr...); + static constexpr auto dims = find<dimensions>(Attr...); + static constexpr auto text = find<const char *>(Attr...); + static constexpr auto draw = find<ondraw>(Attr...); + + static consteval void init(unsigned char *(&ptr)) { + *ptr++ = 0; // pressed? + } + + static void render() { + (*draw)(*point, *dims); + } + + static consteval int size() { + return 1; + } +}; + +} // namespace mbuoy + +#endif // MBUOY_UI_BUTTON_HPP + diff --git a/mbuoy/ui/label.hpp b/mbuoy/ui/label.hpp new file mode 100644 index 0000000..c6cc581 --- /dev/null +++ b/mbuoy/ui/label.hpp @@ -0,0 +1,32 @@ +#ifndef MBUOY_UI_LABEL_HPP +#define MBUOY_UI_LABEL_HPP + +#include "../attr/position.hpp" +#include "../attr/string.hpp" +#include "../find.hpp" +#include "../port.hpp" + +namespace mbuoy { + +template<auto... Attr> +struct label +{ + static constexpr auto point = find<position>(Attr...); + static constexpr auto text = find<const char *>(Attr...); + + static consteval void init(unsigned char *(&ptr)) { + } + + static void render() { + port::puts(point->x, point->y, *text); + } + + static consteval int size() { + return 0; + } +}; + +} // namespace mbuoy + +#endif // MBUOY_UI_LABEL_HPP + diff --git a/mbuoy/view.hpp b/mbuoy/view.hpp new file mode 100644 index 0000000..29915fd --- /dev/null +++ b/mbuoy/view.hpp @@ -0,0 +1,29 @@ +#ifndef MBUOY_VIEW_HPP +#define MBUOY_VIEW_HPP + +namespace mbuoy { + +template<auto... Objs> +class view_t +{ +public: + consteval view_t() { + auto ptr = data; + (Objs.init(ptr), ...); + } + + void render() { + (Objs.render(), ...); + } + +private: + unsigned char data[(0 + ... + Objs.size())] = {}; +}; + +template<auto... Objs> +constinit auto view = view_t<Objs...>(); + +} // namespace mbuoy + +#endif // MBUOY_VIEW_HPP + |