diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2026-06-20 22:23:48 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2026-06-20 22:44:43 +0200 |
| commit | d7c2a8029c4aefc295719174a863129645d6ab99 (patch) | |
| tree | d2f36ab8721dd32235dc63a60218378eb35922c8 /utilities.hpp | |
| download | throttle-quadrant-d7c2a8029c4aefc295719174a863129645d6ab99.tar.xz throttle-quadrant-d7c2a8029c4aefc295719174a863129645d6ab99.zip | |
Diffstat (limited to 'utilities.hpp')
| -rw-r--r-- | utilities.hpp | 67 |
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 |
