ASPiK SDK
optional.h
1 // This file is part of VSTGUI. It is subject to the license terms
2 // in the LICENSE file found in the top-level directory of this
3 // distribution and at http://github.com/steinbergmedia/vstgui/LICENSE
4 
5 #pragma once
6 
7 #include <utility>
8 
9 //------------------------------------------------------------------------
10 namespace VSTGUI {
11 
12 //------------------------------------------------------------------------
17 template <typename T>
18 struct Optional
19 {
20  static_assert (std::is_default_constructible<T>::value, "Type T must be default constructible");
21 
22  Optional (T&& v);
23  explicit Optional (const T& v);
24  Optional ();
25 
26  Optional (Optional&&) = default;
27  Optional& operator= (Optional&&) = default;
28  Optional (const Optional&) = delete;
29  Optional& operator= (const Optional&) = delete;
30 
31  explicit operator bool () const;
32 
33  const T* operator-> () const;
34  T* operator-> ();
35 
36  const T& operator* () const&;
37  T& operator* () &;
38 
39  T&& value ();
40  const T& value () const;
41 
42  void reset ();
43 private:
44  std::pair<bool, T> _value;
45 };
46 
47 //------------------------------------------------------------------------
48 template <typename T>
49 inline Optional<typename std::decay<T>::type> makeOptional (T&& value)
50 {
51  return Optional<typename std::decay<T>::type> (std::forward<T> (value));
52 }
53 
54 //------------------------------------------------------------------------
55 template <typename T>
56 inline Optional<T>::Optional (T&& v)
57 : _value {true, std::move (v)}
58 {
59 }
60 
61 //------------------------------------------------------------------------
62 template <typename T>
63 inline Optional<T>::Optional (const T& v)
64 : _value {true, v}
65 {
66 }
67 
68 //------------------------------------------------------------------------
69 template <typename T>
70 inline Optional<T>::Optional ()
71 {
72  _value.first = false;
73 }
74 
75 //------------------------------------------------------------------------
76 template <typename T>
77 inline Optional<T>::operator bool () const
78 {
79  return _value.first;
80 }
81 
82 //------------------------------------------------------------------------
83 template <typename T>
84 inline const T* Optional<T>::operator-> () const
85 {
86  return _value.second;
87 }
88 
89 //------------------------------------------------------------------------
90 template <typename T>
91 inline T* Optional<T>::operator-> ()
92 {
93  return &_value.second;
94 }
95 
96 //------------------------------------------------------------------------
97 template <typename T>
98 inline const T& Optional<T>::operator* () const&
99 {
100  return _value.second;
101 }
102 
103 //------------------------------------------------------------------------
104 template <typename T>
105 inline T& Optional<T>::operator* () &
106 {
107  return _value.second;
108 }
109 
110 //------------------------------------------------------------------------
111 template <typename T>
112 inline T&& Optional<T>::value ()
113 {
114  assert (_value.first);
115  return std::move (_value.second);
116 }
117 
118 //------------------------------------------------------------------------
119 template <typename T>
120 inline const T& Optional<T>::value () const
121 {
122  assert (_value.first);
123  return _value.second;
124 }
125 
126 //------------------------------------------------------------------------
127 template <typename T>
128 inline void Optional<T>::reset ()
129 {
130  _value.first = false;
131  _value.second = {};
132 }
133 
134 //------------------------------------------------------------------------
135 } // VSTGUI
Definition: customcontrols.cpp:8
Definition: optional.h:18