1#include <type_traits>
2#include <utility>
3
4#if REVISION == 0
5// Pre-a3942b3 layout.
6#define NO_REMOVE_CV
7#endif
8// REVISION == 1: current layout
9
10namespace std {
11namespace __lldb {
12
13struct in_place_t {
14 explicit in_place_t() = default;
15};
16constexpr in_place_t in_place{};
17
18template <class _Tp, bool = is_trivially_destructible<_Tp>::value>
19struct __optional_destruct_base {
20 typedef _Tp value_type;
21 union {
22 char __null_state_;
23#ifdef NO_REMOVE_CV
24 value_type __val_;
25#else // !NO_REMOVE_CV
26 remove_cv_t<value_type> __val_;
27#endif
28 };
29 bool __engaged_;
30
31 template <class... _Args>
32 constexpr explicit __optional_destruct_base(in_place_t, _Args &&...__args)
33 : __val_(std::forward<_Args>(__args)...), __engaged_(true) {}
34};
35
36template <class _Tp, bool = is_reference<_Tp>::value>
37struct __optional_storage_base : __optional_destruct_base<_Tp> {
38 using __base = __optional_destruct_base<_Tp>;
39 using value_type = _Tp;
40 using __base::__base;
41};
42
43template <class _Tp, bool = is_trivially_copy_constructible<_Tp>::value>
44struct __optional_copy_base : __optional_storage_base<_Tp> {
45 using __optional_storage_base<_Tp>::__optional_storage_base;
46};
47
48template <class _Tp, bool = is_trivially_move_constructible<_Tp>::value>
49struct __optional_move_base : __optional_copy_base<_Tp> {
50 using __optional_copy_base<_Tp>::__optional_copy_base;
51};
52
53template <class _Tp, bool = is_trivially_destructible<_Tp>::value &&
54 is_trivially_copy_constructible<_Tp>::value &&
55 is_trivially_copy_assignable<_Tp>::value>
56struct __optional_copy_assign_base : __optional_move_base<_Tp> {
57 using __optional_move_base<_Tp>::__optional_move_base;
58};
59
60template <class _Tp, bool = is_trivially_destructible<_Tp>::value &&
61 is_trivially_move_constructible<_Tp>::value &&
62 is_trivially_move_assignable<_Tp>::value>
63struct __optional_move_assign_base : __optional_copy_assign_base<_Tp> {
64 using __optional_copy_assign_base<_Tp>::__optional_copy_assign_base;
65};
66
67template <bool _CanCopy, bool _CanMove> struct __sfinae_ctor_base {};
68
69template <class _Tp>
70using __optional_sfinae_ctor_base_t =
71 __sfinae_ctor_base<is_copy_constructible<_Tp>::value,
72 is_move_constructible<_Tp>::value>;
73
74template <bool _CanCopy, bool _CanMove> struct __sfinae_assign_base {};
75
76template <class _Tp>
77using __optional_sfinae_assign_base_t = __sfinae_assign_base<
78 (is_copy_constructible<_Tp>::value && is_copy_assignable<_Tp>::value),
79 (is_move_constructible<_Tp>::value && is_move_assignable<_Tp>::value)>;
80
81template <class _Tp>
82class optional : private __optional_move_assign_base<_Tp>,
83 private __optional_sfinae_ctor_base_t<_Tp>,
84 private __optional_sfinae_assign_base_t<_Tp> {
85 using __base = __optional_move_assign_base<_Tp>;
86
87public:
88 using value_type = _Tp;
89
90public:
91 template <class _Up = value_type>
92 constexpr explicit optional(_Up &&__v)
93 : __base(in_place, std::forward<_Up>(__v)) {}
94};
95
96} // namespace __lldb
97} // namespace std
98
99int main() {
100 std::__lldb::optional<char const *> maybe_string{"Hello"};
101 std::__lldb::optional<int> maybe_int{42};
102 return 0; // Break here
103}
104

source code of lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx-simulators/optional/main.cpp