summaryrefslogtreecommitdiff
path: root/utilities.hpp
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2026-06-20 22:23:48 +0200
committerFelix Morgner <felix.morgner@gmail.com>2026-06-20 22:44:43 +0200
commitd7c2a8029c4aefc295719174a863129645d6ab99 (patch)
treed2f36ab8721dd32235dc63a60218378eb35922c8 /utilities.hpp
downloadthrottle-quadrant-d7c2a8029c4aefc295719174a863129645d6ab99.tar.xz
throttle-quadrant-d7c2a8029c4aefc295719174a863129645d6ab99.zip
initial commitHEADmaster
Diffstat (limited to 'utilities.hpp')
-rw-r--r--utilities.hpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/utilities.hpp b/utilities.hpp
new file mode 100644
index 0000000..819c170
--- /dev/null
+++ b/utilities.hpp
@@ -0,0 +1,67 @@
+#ifndef THROTTLE_QUADRANT_UTILITIES_HPP
+#define THROTTLE_QUADRANT_UTILITIES_HPP
+
+#include <Arduino.h>
+
+void* operator new(size_t size, void* ptr);
+
+namespace tq {
+
+template<typename ValueType>
+struct optional {
+
+ optional()
+ : m_engaged{ false } {
+ }
+
+ optional(optional const& other)
+ : m_engaged{ other.has_value() } {
+ if (m_engaged) {
+ construct_from(other.value());
+ }
+ }
+
+ explicit optional(ValueType const& value)
+ : m_engaged{ true } {
+ construct_from(value);
+ }
+
+ ~optional() {
+ destroy();
+ }
+
+ auto operator=(optional const& other) -> optional& {
+ destroy();
+ m_engaged = other.m_engaged;
+ if (m_engaged) {
+ construct_from(other.value());
+ }
+ }
+
+ auto has_value() const -> bool {
+ return m_engaged;
+ }
+
+ auto value() const -> ValueType const& {
+ return *(reinterpret_cast<ValueType const*>(m_storage));
+ }
+
+private:
+ auto construct_from(ValueType const& value) -> void {
+ new (static_cast<byte*>(m_storage)) ValueType{ value };
+ }
+
+ auto destroy() -> void {
+ if (has_value()) {
+ (reinterpret_cast<ValueType const*>(m_storage))->~ValueType();
+ }
+ }
+
+ alignas(ValueType) byte m_storage[sizeof(ValueType)];
+ bool m_engaged;
+};
+
+
+}
+
+#endif \ No newline at end of file