]> git.stg.codes - stg.git/blob - include/stg/optional.h
Merge remote-tracking branch 'github/master'
[stg.git] / include / stg / optional.h
1 #pragma once
2
3 namespace STG
4 {
5
6 template <typename T>
7 class Optional
8 {
9 public:
10     using value_type = T;
11
12     Optional() noexcept : m_isSet(false) {}
13     explicit Optional(const T& value) noexcept : m_value(value), m_isSet(true) {}
14
15     Optional(const Optional<T>&) = default;
16     Optional<T>& operator=(const Optional<T>&) = default;
17
18     Optional(Optional<T>&&) = default;
19     Optional<T>& operator=(Optional<T>&&) = default;
20
21     Optional<T>& operator=(const T & rhs) noexcept
22     {
23         m_value = rhs;
24         m_isSet = true;
25         return *this;
26     }
27
28     const T & const_data() const noexcept { return m_value; }
29     T & data() noexcept { return m_value; }
30     const T & data() const noexcept { return m_value; }
31     bool empty() const noexcept { return !m_isSet; }
32     void reset() noexcept { m_isSet = false; }
33     void splice(const Optional<T>& rhs) noexcept
34     {
35         if (rhs.m_isSet)
36         {
37             m_value = rhs.m_value;
38             m_isSet = true;
39         }
40     }
41     const T& get(const T& defaultValue) const noexcept
42     {
43         if (m_isSet)
44             return m_value;
45         else
46             return defaultValue;
47     }
48
49 private:
50     value_type m_value;
51     bool       m_isSet;
52 };
53
54 }