aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/include/expected.h
diff options
context:
space:
mode:
authorAlexander Karatarakis <alkarata@microsoft.com>2016-09-18 20:50:08 -0700
committerAlexander Karatarakis <alkarata@microsoft.com>2016-09-18 20:54:03 -0700
commitccca198c1b1730b0241911cb56dc8e3504958b2a (patch)
treea2dd9b8b087a09afdcecc5cbb3377bed15127eb2 /toolsrc/include/expected.h
downloadvcpkg-ccca198c1b1730b0241911cb56dc8e3504958b2a.tar.gz
vcpkg-ccca198c1b1730b0241911cb56dc8e3504958b2a.zip
Initial commit
Diffstat (limited to 'toolsrc/include/expected.h')
-rw-r--r--toolsrc/include/expected.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/toolsrc/include/expected.h b/toolsrc/include/expected.h
new file mode 100644
index 000000000..affabcc02
--- /dev/null
+++ b/toolsrc/include/expected.h
@@ -0,0 +1,81 @@
+#pragma once
+
+#include "vcpkg_Checks.h"
+
+namespace vcpkg
+{
+ template <class T>
+ class expected
+ {
+ public:
+ // Constructors are intentionally implicit
+ expected(const std::error_code& ec) : m_error_code(ec), m_t()
+ {
+ }
+
+ expected(std::errc ec) : expected(std::make_error_code(ec))
+ {
+ }
+
+ expected(const T& t) : m_error_code(), m_t(t)
+ {
+ }
+
+ expected(T&& t) : m_error_code(), m_t(std::move(t))
+ {
+ }
+
+ expected() : expected(std::error_code(), T())
+ {
+ }
+
+ expected(const expected&) = default;
+ expected(expected&&) = default;
+ expected& operator=(const expected&) = default;
+ expected& operator=(expected&&) = default;
+
+ std::error_code error_code() const
+ {
+ return this->m_error_code;
+ }
+
+ T&& get_or_throw() &&
+ {
+ throw_if_error();
+ return std::move(this->m_t);
+ }
+
+ const T& get_or_throw() const &
+ {
+ throw_if_error();
+ return this->m_t;
+ }
+
+ const T* get() const
+ {
+ if (m_error_code)
+ {
+ return nullptr;
+ }
+ return &this->m_t;
+ }
+
+ T* get()
+ {
+ if (m_error_code)
+ {
+ return nullptr;
+ }
+ return &this->m_t;
+ }
+
+ private:
+ void throw_if_error() const
+ {
+ Checks::check_throw(!this->m_error_code, this->m_error_code.message().c_str());
+ }
+
+ std::error_code m_error_code;
+ T m_t;
+ };
+}