From 2ce052e54d55e9029eff00f0985e399fa1eb2c1a Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Wed, 29 Jul 2020 17:36:33 -0400 Subject: add sum types --- common/external/nillable.h | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 common/external/nillable.h (limited to 'common/external/nillable.h') diff --git a/common/external/nillable.h b/common/external/nillable.h new file mode 100644 index 0000000..40cf01c --- /dev/null +++ b/common/external/nillable.h @@ -0,0 +1,30 @@ +inline constexpr struct nil_t {} nil; + +// Requirements: T is default-constructible and trivially-destructible +template +struct nillable { + bool has_value = false; + T value; + + nillable() = default; + + nillable(nil_t) : nillable() {} + nillable(const T& v) : has_value(true), value(v) {} + + nillable& operator=(nil_t) { + has_value = false; + return *this; + } + nillable& operator=(const T& v) { + value = v; + has_value = true; + return *this; + } + + const T* operator->() const { return &value; } + T* operator->() { return &value; } + + explicit operator bool() const { return has_value; } +}; + +template nillable(T)->nillable; -- cgit v1.2.3