source: filezilla/trunk/fuentes/src/include/optional.h @ 130

Last change on this file since 130 was 130, checked in by jrpelegrina, 4 years ago

First release to xenial

File size: 2.4 KB
Line 
1#ifndef FILEZILLA_OPTIONAL_HEADER
2#define FILEZILLA_OPTIONAL_HEADER
3
4#include <type_traits>
5
6template<class T> class CSparseOptional final
7{
8        // This class does what std::optional would do, if we had it.
9        // Note that we do not perform "small object optimization" under the assumption
10        // that in most cases the optional is not set.
11public:
12        CSparseOptional();
13        explicit CSparseOptional(T const& v);
14        CSparseOptional(CSparseOptional<T> const& v);
15        CSparseOptional(CSparseOptional<T> && v) noexcept;
16        ~CSparseOptional();
17
18        void clear();
19
20        explicit operator bool() const { return v_ != 0; };
21
22        T& operator*() { return *v_; }
23        T const& operator*() const { return *v_; }
24
25        T* operator->() { return v_; }
26        T const* operator->() const { return v_; }
27
28        bool operator==(CSparseOptional<T> const& cmp) const;
29        inline bool operator!=(CSparseOptional<T> const& cmp) const { return !(*this == cmp); }
30        bool operator<(CSparseOptional<T> const& cmp) const;
31
32        CSparseOptional<T>& operator=(CSparseOptional<T> const& v);
33        CSparseOptional<T>& operator=(CSparseOptional<T> && v) noexcept;
34protected:
35        T* v_;
36};
37
38template<class T> CSparseOptional<T>::CSparseOptional()
39        : v_()
40{
41}
42
43template<class T> CSparseOptional<T>::CSparseOptional(T const& v)
44        : v_(new T(v))
45{
46}
47
48template<class T> CSparseOptional<T>::CSparseOptional(CSparseOptional<T> const& v)
49{
50        if( v ) {
51                v_ = new T(*v);
52        }
53        else {
54                v_ = 0;
55        }
56}
57
58template<class T> CSparseOptional<T>::CSparseOptional(CSparseOptional<T> && v) noexcept
59{
60        v_ = v.v_;
61        v.v_ = 0;
62}
63
64template<class T> CSparseOptional<T>::~CSparseOptional()
65{
66        delete v_;
67}
68
69template<class T> void CSparseOptional<T>::clear()
70{
71        delete v_;
72        v_ = 0;
73}
74
75template<class T> CSparseOptional<T>& CSparseOptional<T>::operator=(CSparseOptional<T> const& v)
76{
77        if( this != &v ) {
78                delete v_;
79                if( v.v_ ) {
80                        v_ = new T(*v.v_);
81                }
82                else {
83                        v_ = 0;
84                }
85        }
86
87        return *this;
88}
89
90template<class T> CSparseOptional<T>& CSparseOptional<T>::operator=(CSparseOptional<T> && v) noexcept
91{
92        if( this != &v ) {
93                delete v_;
94                v_ = v.v_;
95                v.v_ = 0;
96        }
97
98        return *this;
99}
100
101template<class T> bool CSparseOptional<T>::operator==(CSparseOptional<T> const& cmp) const
102{
103        if( !v_ && !cmp.v_ ) {
104                return true;
105        }
106
107        if( !v_ || !cmp.v_ ) {
108                return false;
109        }
110
111        return *v_ == *cmp.v_;
112}
113
114template<class T> bool CSparseOptional<T>::operator<(CSparseOptional<T> const& cmp) const
115{
116        if( !v_ || !cmp.v_ ) {
117                return cmp.operator bool();
118        }
119
120        return *v_ < *cmp.v_;
121}
122
123#endif
Note: See TracBrowser for help on using the repository browser.