diff options
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 |
