| OLD | NEW |
| 1 # base::Optional | 1 # base::Optional |
| 2 | 2 |
| 3 `base::Optional<T>` is a container that might contain an instance of `T`. | 3 `base::Optional<T>` is a container that might contain an instance of `T`. |
| 4 | 4 |
| 5 [TOC] | 5 [TOC] |
| 6 | 6 |
| 7 ## History | 7 ## History |
| 8 | 8 |
| 9 [base::Optional<T>](https://code.google.com/p/chromium/codesearch#chromium/src/b
ase/optional.h) | 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), | 10 is an implementation of [std::optional<T>](http://en.cppreference.com/w/cpp/util
ity/optional), |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 base::Optional<int> opt = make_optional<int>(GetMagicNumber()); | 69 base::Optional<int> opt = make_optional<int>(GetMagicNumber()); |
| 70 ``` | 70 ``` |
| 71 | 71 |
| 72 Finally, `base::Optional<T>` is integrated with `std::hash`, using | 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 | 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 | 74 `.swap()` can be used as members functions and `std::swap()` will work with two |
| 75 `base::Optional<T>` objects. | 75 `base::Optional<T>` objects. |
| 76 | 76 |
| 77 ## How is it implemented? | 77 ## How is it implemented? |
| 78 | 78 |
| 79 `base::Optional<T>` is implemented using `base::AlignedMemory`. The object | 79 `base::Optional<T>` is implemented with a union with a `T` member. The object |
| 80 doesn't behave like a pointer and doesn't do dynamic memory allocation. In | 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. | 81 other words, it is guaranteed to have an object allocated when it is not empty. |
| 82 | 82 |
| 83 ## When to use? | 83 ## When to use? |
| 84 | 84 |
| 85 A very common use case is for classes and structures that have an object not | 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 | 86 always available, because it is early initialized or because the underlying data |
| 87 structure doesn't require it. | 87 structure doesn't require it. |
| 88 | 88 |
| 89 It is common to implement such patterns with dynamically allocated pointers, | 89 It is common to implement such patterns with dynamically allocated pointers, |
| 90 `nullptr` representing the absence of value. Other approaches involve | 90 `nullptr` representing the absence of value. Other approaches involve |
| 91 `std::pair<T, bool>` where bool represents whether the object is actually | 91 `std::pair<T, bool>` where bool represents whether the object is actually |
| 92 present. | 92 present. |
| 93 | 93 |
| 94 It can also be used for simple types, for example when a structure wants to | 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 | 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 | 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 | 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. | 98 undefined value when the expected value can't be negative. |
| 99 | 99 |
| 100 ## When not to use? | 100 ## When not to use? |
| 101 | 101 |
| 102 It is recommended to not use `base::Optional<T>` as a function parameter as it | 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 | 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 | 104 keep using `T*` for arguments that can be ommited, with `nullptr` representing |
| 105 no value. | 105 no value. |
| 106 | 106 |
| 107 Furthermore, depending on `T`, MSVC might fail to compile code using | 107 Furthermore, depending on `T`, MSVC might fail to compile code using |
| 108 `base::Optional<T>` as a parameter because of memory alignment issues. | 108 `base::Optional<T>` as a parameter because of memory alignment issues. |
| OLD | NEW |