Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Side by Side Diff: docs/optional.md

Issue 1245163002: Base: add Optional<T>. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix md Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/optional_unittest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 # base::Optional
2
3 `base::Optional<T>` is a container that might contain an instance of `T`.
4
5 [TOC]
6
7 ## History
8
9 [base::Optional<T>](https://code.google.com/p/chromium/codesearch#chromium/src/b ase/optional.h)
10 is an implementation of [std::optional<T>](http://en.cppreference.com/w/cpp/util ity/optional),
11 initially a C++ experimental feature and now part of the C++17 standard. The
12 Chromium's implementation is as close as possible to the specification. The
13 differences are listed at the beginning of the header. The most important
14 difference is that all the objects and types are part of the `base::` namespace
15 instead of `std::`. Also, following Chromium coding style, the class is named
16 `Optional` instead of `optional`.
17
18 ## API description
19
20 For a deep API description, please have a look at [std::optional<T>](http://en.c ppreference.com/w/cpp/utility/optional)
21 or the [Chromium implementation](https://code.google.com/p/chromium/codesearch#c hromium/src/base/optional.h).
22
23 When initialized without a value, `base::Optional<T>` will be empty. When empty,
24 the `operator bool` will return `false` and `value()` should not be called. An
25 empty `base::Optional<T>` is equal to `base::nullopt_t`.
26
27 ```C++
28 base::Optional<int> opt;
29 opt == true; // false
30 opt.value(); // illegal, will DCHECK
31 opt == base::nullopt_t; // true
32 ```
33
34 To avoid calling `value()` when an `base::Optional<T>` is empty, instead of
35 doing checks, it is possible to use `value_or()` and pass a default value:
36
37 ```C++
38 base::Optional<int> opt;
39 opt.value_or(42); // will return 42
40 ```
41
42 It is possible to initialize a `base::Optional<T>` from its constructor and
43 `operator=` using `T` or another `base::Optional<T>`:
44
45 ```C++
46 base::Optional<int> opt_1 = 1; // .value() == 1
47 base::Optional<int> opt_2 = base::Optional<int>(2); // .value() == 2
48 ```
49
50 All basic operators should be available on `base::Optional<T>`: it is possible
51 to compare a `base::Optional<T>` with another or with a `T` or
52 `base::nullopt_t`.
53
54 ```C++
55 base::Optional<int> opt_1;
56 base::Optional<int> opt_2 = 2;
57
58 opt_1 == opt_2; // false
59 opt_1 = 1;
60
61 opt_1 <= opt_2; // true
62 opt_1 == 1; // true
63 opt_1 == base::nullopt_t; // false
64 ```
65
66 `base::Optional<T>` has a helper function `make_optional<T&&>`:
67
68 ```C++
69 base::Optional<int> opt = make_optional<int>(GetMagicNumber());
70 ```
71
72 Finally, `base::Optional<T>` is integrated with `std::hash`, using
73 `std::hash<T>` if it is not empty, a default value otherwise. `.emplace()` and
74 `.swap()` can be used as members functions and `std::swap()` will work with two
75 `base::Optional<T>` objects.
76
77 ## How is it implemented?
78
79 `base::Optional<T>` is implemented using `base::AlignedMemory`. The object
80 doesn't behave like a pointer and doesn't do dynamic memory allocation. In
81 other words, it is guaranteed to have an object allocated when it is not empty.
82
83 ## When to use?
84
85 A very common use case is for classes and structures that have an object not
86 always available, because it is early initialized or because the underlying data
87 structure doesn't require it.
88
89 It is common to implement such patterns with dynamically allocated pointers,
90 `nullptr` representing the absence of value. Other approaches involve
91 `std::pair<T, bool>` where bool represents whether the object is actually
92 present.
93
94 It can also be used for simple types, for example when a structure wants to
95 represent whether the user or the underlying data structure has some value
96 unspecified, a `base::Optional<int>` would be easier to understand than a
97 special value representing the lack of it. For example, using -1 as the
98 undefined value when the expected value can't be negative.
99
100 ## When not to use?
101
102 It is recommended to not use `base::Optional<T>` as a function parameter as it
103 will force the callers to use `base::Optional<T>`. Instead, it is recommended to
104 keep using `T*` for arguments that can be ommited, with `nullptr` representing
105 no value.
106
107 Furthermore, depending on `T`, MSVC might fail to compile code using
108 `base::Optional<T>` as a parameter because of memory alignment issues.
OLDNEW
« no previous file with comments | « base/optional_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698