From 00f84e3b984904e36cbee502a470003ecd7d09cf Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Sat, 10 Aug 2024 10:46:54 -0400 Subject: [PATCH] initial upload --- Makefile | 10 ++++++++ attr/dimensions.hpp | 14 +++++++++++ attr/ondraw.hpp | 21 +++++++++++++++++ attr/position.hpp | 14 +++++++++++ attr/string.hpp | 24 +++++++++++++++++++ find.hpp | 57 +++++++++++++++++++++++++++++++++++++++++++++ main.cpp | 26 +++++++++++++++++++++ port.hpp | 18 ++++++++++++++ ui/button.hpp | 37 +++++++++++++++++++++++++++++ ui/label.hpp | 32 +++++++++++++++++++++++++ view.hpp | 29 +++++++++++++++++++++++ 11 files changed, 282 insertions(+) create mode 100644 Makefile create mode 100644 attr/dimensions.hpp create mode 100644 attr/ondraw.hpp create mode 100644 attr/position.hpp create mode 100644 attr/string.hpp create mode 100644 find.hpp create mode 100644 main.cpp create mode 100644 port.hpp create mode 100644 ui/button.hpp create mode 100644 ui/label.hpp create mode 100644 view.hpp diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3c09c2f --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ +all: + clang main.cpp -std=c++20 -I. -ggdb -g3 -O0 -fno-exceptions + ./a.out + @echo + g++ main.cpp -std=c++20 -I. -ggdb -g3 -O0 + ./a.out + +clean: + rm -f a.out + diff --git a/attr/dimensions.hpp b/attr/dimensions.hpp new file mode 100644 index 0000000..9c1fda9 --- /dev/null +++ b/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/attr/ondraw.hpp b/attr/ondraw.hpp new file mode 100644 index 0000000..d0932ef --- /dev/null +++ b/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/attr/position.hpp b/attr/position.hpp new file mode 100644 index 0000000..dfb9cc7 --- /dev/null +++ b/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/attr/string.hpp b/attr/string.hpp new file mode 100644 index 0000000..d7e1fcb --- /dev/null +++ b/attr/string.hpp @@ -0,0 +1,24 @@ +#ifndef MBUOY_ATTR_STRING_HPP +#define MBUOY_ATTR_STRING_HPP + +namespace mbuoy { + +template +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/find.hpp b/find.hpp new file mode 100644 index 0000000..edba06d --- /dev/null +++ b/find.hpp @@ -0,0 +1,57 @@ +#ifndef MBUOY_FIND_HPP +#define MBUOY_FIND_HPP + +#include +#include + +namespace mbuoy { + +template +concept can_static_cast = requires(U u) { + static_cast(u); +}; + +template +consteval std::optional find(T val) +{ + return val; +} + +template + requires (!std::is_same_v && can_static_cast) +consteval std::optional find(U val) +{ + return val; +} + +template + requires (!std::is_same_v && !can_static_cast) +consteval std::optional find(U val) +{ + return {}; +} + +template +consteval std::optional find(T val, auto... vals) +{ + return val; +} + +template + requires (!std::is_same_v && can_static_cast) +consteval std::optional find(U val, auto... vals) +{ + return val; +} + +template + requires (!std::is_same_v && !can_static_cast) +consteval auto find(U val, auto... vals) +{ + return find(vals...); +} + +} // namespace mbuoy + +#endif // MBUOY_FIND_HPP + diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..590f1ed --- /dev/null +++ b/main.cpp @@ -0,0 +1,26 @@ +#include "view.hpp" +#include "ui/button.hpp" +#include "ui/label.hpp" + +void drawButton(const mbuoy::position& pos, const mbuoy::dimensions& dim) +{ + std::printf("[%d, %d, %d, %d]: button\n", pos.x, pos.y, dim.width, dim.height); +} + +int main() +{ + auto test = mbuoy::view< + mbuoy::label< + mbuoy::string("Hey"), + mbuoy::position(10, 100)>{}, + mbuoy::label< + mbuoy::string("there"), + mbuoy::position(10, 120)>{}, + mbuoy::button< + mbuoy::position(10, 120), + mbuoy::dimensions(40, 40), + mbuoy::ondraw(drawButton)>{} + >; + test.render(); +} + diff --git a/port.hpp b/port.hpp new file mode 100644 index 0000000..366f498 --- /dev/null +++ b/port.hpp @@ -0,0 +1,18 @@ +#ifndef MBUOY_PORT_HPP +#define MBUOY_PORT_HPP + +#include + +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/ui/button.hpp b/ui/button.hpp new file mode 100644 index 0000000..4a0a9f5 --- /dev/null +++ b/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 +struct button +{ + static constexpr auto point = find(Attr...); + static constexpr auto dims = find(Attr...); + static constexpr auto text = find(Attr...); + static constexpr auto draw = find(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/ui/label.hpp b/ui/label.hpp new file mode 100644 index 0000000..9524007 --- /dev/null +++ b/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 +struct label +{ + static constexpr auto point = find(Attr...); + static constexpr auto text = find(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/view.hpp b/view.hpp new file mode 100644 index 0000000..29915fd --- /dev/null +++ b/view.hpp @@ -0,0 +1,29 @@ +#ifndef MBUOY_VIEW_HPP +#define MBUOY_VIEW_HPP + +namespace mbuoy { + +template +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 +constinit auto view = view_t(); + +} // namespace mbuoy + +#endif // MBUOY_VIEW_HPP +