aboutsummaryrefslogtreecommitdiff
path: root/libk/result.h
blob: e940bd956246b5194e5c3e7a8b6195600f9f7372 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#pragma once
#include <types.h>

// TODO T&& constructor
// TODO T&& Result::take() with consumed semantics

template <typename T, error_enum_t E>
class Result {
public:
  constexpr Result() = default;
  explicit constexpr Result(T t) : is_ok(true), data{.t = t} {};
  explicit constexpr Result(E e) : is_ok(false), data{.e = e} {};

  constexpr operator bool() const { return is_ok; }
  constexpr E error() const { return is_ok ? E::NoError : data.e; }
  constexpr T value() const { return is_ok ? data.t : T{}; }

private:
  const bool is_ok = false;
  union {
    T t;
    E e = E::NoError;
  } data;
};