From 9cdf62d835d22647e5acc4e9b90a02ee61fcca1b Mon Sep 17 00:00:00 2001 From: Ludovic 'Archivist' Lagouardette Date: Fri, 5 Jun 2020 06:18:56 +0200 Subject: [PATCH] work on function and rendering characters --- include/gp/function.hpp | 29 ++- include/gp/rendering/characters.hpp | 268 ++++++++++++++++++++++++++++ 2 files changed, 290 insertions(+), 7 deletions(-) create mode 100644 include/gp/rendering/characters.hpp diff --git a/include/gp/function.hpp b/include/gp/function.hpp index e302e8d..ad52f32 100644 --- a/include/gp/function.hpp +++ b/include/gp/function.hpp @@ -2,6 +2,7 @@ #include "gp/exception.hpp" #include "gp/algorithm/tmp_manip.hpp" #include "gp/algorithm/move.hpp" + namespace gp{ template @@ -83,11 +84,27 @@ namespace gp{ delete self.functor; } } - if(t.state | ACTIVE) + if(!(t.state & ACTIVE)) { + state = INACTIVE; + return; + } + if constexpr (!std::is_same_v>) { if constexpr (sizeof(callable) <= sizeof(self)) { - t.self.functor->inplace_copy(self.inplace); + new((void*)self.inplace) callable(t); + state = (state_t)(ACTIVE | SOO); + } + else + { + self.functor = new callable(t); + state = (state_t)(ACTIVE | NO_SOO); + } + } else { + if(t.state & SOO) + { + auto& ref = t.self.functor; + ref->inplace_copy((char*)&self); state = (state_t)(ACTIVE | SOO); } else @@ -95,9 +112,7 @@ namespace gp{ self.functor = t.self.functor->all_copy(); state = (state_t)(ACTIVE | NO_SOO); } - return; } - state = INACTIVE; } function() @@ -105,10 +120,10 @@ namespace gp{ state = INACTIVE; } - template + template function<>(T& t) { - if constexpr (!std::is_same_v) { + if constexpr (!std::is_same_v>) { if constexpr (sizeof(callable) <= sizeof(self)) { new((void*)self.inplace) callable(t); @@ -136,7 +151,7 @@ namespace gp{ template function(T&& t) { - if constexpr (!std::is_same_v) { + if constexpr (!std::is_same_v>) { if constexpr (sizeof(callable) <= sizeof(self)) { new((void*)self.inplace) callable(gp::move(t)); diff --git a/include/gp/rendering/characters.hpp b/include/gp/rendering/characters.hpp new file mode 100644 index 0000000..e558f29 --- /dev/null +++ b/include/gp/rendering/characters.hpp @@ -0,0 +1,268 @@ +#pragma once +#include "gp/array.hpp" + +using display_char = gp::array; + +constexpr display_char ascii_tr(unsigned char c) { + display_char whitespace{ + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000 + }; + + display_char invalid{ + 0b11111111, + c, + 0b10101011, + 0b10101011, + 0b10011001, + 0b10100101, + 0b11000011, + 0b11111111 + }; + + switch(c) { + case '\0': + return whitespace; + case ' ': + return whitespace; + case '!': + return { + 0b00000000, + 0b00010000, + 0b00010000, + 0b00010000, + 0b00010000, + 0b00000000, + 0b00010000, + 0b00000000 + }; + case '"': + return { + 0b00000000, + 0b00101000, + 0b00101000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000 + }; + case '#': + return { + 0b00010010, + 0b00100100, + 0b11111110, + 0b00100100, + 0b01001000, + 0b11111110, + 0b01001000, + 0b10010000 + }; + case '$': + return { + 0b01111000, + 0b10100100, + 0b10100000, + 0b01111000, + 0b00100100, + 0b00100100, + 0b01111000, + 0b00100000 + }; + case '%': + return { + 0b11100001, + 0b10100010, + 0b11100100, + 0b00001000, + 0b00010000, + 0b00100111, + 0b01000101, + 0b10000111 + }; + case '&': + return { + 0b00011000, + 0b00100100, + 0b01000000, + 0b00100000, + 0b01010100, + 0b10001000, + 0b01110100, + 0b00000000 + }; + case '\'': + return { + 0b00000000, + 0b00010000, + 0b00010000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000 + }; + case '(': + return { + 0b00100000, + 0b01000000, + 0b10000000, + 0b10000000, + 0b10000000, + 0b01000000, + 0b00100000, + 0b00000000 + }; + case ')': + return { + 0b00100000, + 0b00010000, + 0b00001000, + 0b00001000, + 0b00001000, + 0b00010000, + 0b00100000, + 0b00000000 + }; + case '*': + return { + 0b00000000, + 0b00010000, + 0b01111100, + 0b00101000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000 + }; + case '+': + return { + 0b00000000, + 0b00000000, + 0b00010000, + 0b00010000, + 0b01111100, + 0b00010000, + 0b00010000, + 0b00000000 + }; + case ',': + return { + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00001000, + 0b00010000, + 0b00000000 + }; + case '-': + return { + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b01111100, + 0b00000000, + 0b00000000, + 0b00000000 + }; + case '.': + return { + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00000000, + 0b00011000, + 0b00011000, + 0b00000000 + }; + case '/': + return { + 0b00000100, + 0b00001000, + 0b00001000, + 0b00010000, + 0b00100000, + 0b00100000, + 0b01000000, + 0b00000000 + }; + case '0': + return { + 0b00111000, + 0b01000100, + 0b10001010, + 0b10010010, + 0b10100010, + 0b01000100, + 0b00111000, + 0b00000000 + }; + case '1': + return { + 0b00100000, + 0b01100000, + 0b00100000, + 0b00100000, + 0b00100000, + 0b00100000, + 0b00100000, + 0b00000000 + }; + case '2': + return { + 0b00111000, + 0b01000100, + 0b00000100, + 0b00001000, + 0b00010000, + 0b00100000, + 0b11111100, + 0b00000000 + }; + case '3': + return { + 0b00111000, + 0b01000100, + 0b00000100, + 0b00011000, + 0b00000100, + 0b01000100, + 0b00111000, + 0b00000000 + }; + case '4': + return { + 0b00001000, + 0b00011000, + 0b00101000, + 0b01001000, + 0b11111100, + 0b00001000, + 0b00001000, + 0b00000000 + }; + case '5': + return { + 0b01111110, + 0b01000000, + 0b00111100, + 0b00000010, + 0b00000010, + 0b00000010, + 0b01111100, + 0b00000000 + }; + default: + return invalid; + } +} \ No newline at end of file