-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathoptional.h
More file actions
55 lines (42 loc) · 1.18 KB
/
Copy pathoptional.h
File metadata and controls
55 lines (42 loc) · 1.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*
* optional.h
*
* Created on: Aug 21, 2014
* Author: busygin
*/
#ifndef OPTIONAL_H_
#define OPTIONAL_H_
#include <ostream>
template<typename T>
class Optional {
public:
Optional() : enabled_(false) { }
Optional(const T& v) : value_(v), enabled_(true) { }
Optional(const Optional<T> & that) : value_(that ? *that : T()), enabled_(that) { }
const T& operator*() const { return value_; }
T& operator*() { return value_; }
const T* operator->() const { return &value_; }
T* operator->() { return &value_; }
Optional<T>& operator=(const T& v) {
value_ = v; enabled_ = true;
return *this;
}
Optional<T>& operator=(const Optional<T>& rhs) {
enabled_ = rhs.enabled_;
if (enabled_) value_ = rhs.value_;
return *this;
}
bool operator==(const Optional<T>& rhs) const {
return (enabled_ ? value_==rhs.value_ : !rhs);
}
explicit operator bool() const { return enabled_; }
bool enabled() const { return enabled_; }
void enable() { enabled_ = true; }
void disable() { enabled_ = false; }
private:
T value_;
bool enabled_;
};
template<typename T>
std::ostream& operator<<(std::ostream& os, const Optional<T>& rhs) { return os << bool(rhs); }
#endif /* OPTIONAL_H_ */