libfilezilla
lib
libfilezilla
optional.hpp
Go to the documentation of this file.
1
#ifndef LIBFILEZILLA_OPTIONAL_HEADER
2
#define LIBFILEZILLA_OPTIONAL_HEADER
3
4
9
namespace
fz
{
10
18
template
<
typename
T>
19
class
sparse_optional
final
20
{
21
public
:
22
sparse_optional
();
23
explicit
sparse_optional
(T
const
& v);
24
26
explicit
sparse_optional
(T * v);
27
28
sparse_optional
(
sparse_optional<T>
const
& v);
29
sparse_optional
(
sparse_optional<T>
&& v) noexcept;
30
~
sparse_optional
();
31
32
void
clear();
33
34
explicit
operator
bool()
const
{
return
v_ != 0; };
35
36
T& operator*() {
return
*v_; }
37
T
const
& operator*()
const
{
return
*v_; }
38
39
T* operator->() {
return
v_; }
40
T
const
* operator->()
const
{
return
v_; }
41
42
bool
operator==(
sparse_optional<T>
const
& cmp)
const
;
43
inline
bool
operator!=(
sparse_optional<T>
const
& cmp)
const
{
return
!(*
this
== cmp); }
44
bool
operator<(sparse_optional<T>
const
& cmp)
const
;
45
46
sparse_optional<T>
& operator=(
sparse_optional<T>
const
& v);
47
sparse_optional<T>
& operator=(
sparse_optional<T>
&& v) noexcept;
48
private
:
49
T* v_;
50
};
51
52
53
template
<
typename
T>
54
sparse_optional<T>::sparse_optional
()
55
: v_()
56
{
57
}
58
59
template
<
typename
T>
60
sparse_optional<T>::sparse_optional
(T
const
& v)
61
: v_(
new
T(v))
62
{
63
}
64
65
template
<
typename
T>
66
sparse_optional<T>::sparse_optional
(T * v)
67
: v_(v)
68
{
69
}
70
71
template
<
typename
T>
72
sparse_optional<T>::sparse_optional
(
sparse_optional<T>
const
& v)
73
{
74
if
(v) {
75
v_ =
new
T(*v);
76
}
77
else
{
78
v_ = 0;
79
}
80
}
81
82
template
<
typename
T>
83
sparse_optional<T>::sparse_optional
(
sparse_optional<T>
&& v) noexcept
84
{
85
v_ = v.v_;
86
v.v_ = 0;
87
}
88
89
template
<
typename
T>
90
sparse_optional<T>::~sparse_optional
()
91
{
92
delete
v_;
93
}
94
95
template
<
typename
T>
96
void
sparse_optional<T>::clear
()
97
{
98
delete
v_;
99
v_ = 0;
100
}
101
102
template
<
typename
T>
103
sparse_optional<T>
&
sparse_optional<T>::operator=
(
sparse_optional<T>
const
& v)
104
{
105
if
(
this
!= &v) {
106
delete
v_;
107
if
(v.v_) {
108
v_ =
new
T(*v.v_);
109
}
110
else
{
111
v_ = 0;
112
}
113
}
114
115
return
*
this
;
116
}
117
118
template
<
typename
T>
119
sparse_optional<T>
&
sparse_optional<T>::operator=
(
sparse_optional<T>
&& v) noexcept
120
{
121
if
(
this
!= &v) {
122
delete
v_;
123
v_ = v.v_;
124
v.v_ = 0;
125
}
126
127
return
*
this
;
128
}
129
130
template
<
typename
T>
131
bool
sparse_optional<T>::operator==
(
sparse_optional<T>
const
& cmp)
const
132
{
133
if
(!v_ && !cmp.v_) {
134
return
true
;
135
}
136
137
if
(!v_ || !cmp.v_) {
138
return
false
;
139
}
140
141
return
*v_ == *cmp.v_;
142
}
143
144
template
<
typename
T>
145
bool
sparse_optional<T>::operator<
(
sparse_optional<T>
const
& cmp)
const
146
{
147
if
(!v_ || !cmp.v_) {
148
return
cmp.v_ != 0;
149
}
150
151
return
*v_ < *cmp.v_;
152
}
153
154
}
155
156
#endif
fz
The namespace used by libfilezilla.
Definition:
apply.hpp:16
fz::sparse_optional
Similar to C++17's std::optional, but stores the data in dynamic memory.
Definition:
optional.hpp:19
Generated by
1.8.13