| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef BASE_OPTIONAL_H_ | 5 #ifndef BASE_OPTIONAL_H_ |
| 6 #define BASE_OPTIONAL_H_ | 6 #define BASE_OPTIONAL_H_ |
| 7 | 7 |
| 8 #include <type_traits> | 8 #include <type_traits> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/template_util.h" | |
| 12 | 11 |
| 13 namespace base { | 12 namespace base { |
| 14 | 13 |
| 15 // Specification: | 14 // Specification: |
| 16 // http://en.cppreference.com/w/cpp/utility/optional/in_place_t | 15 // http://en.cppreference.com/w/cpp/utility/optional/in_place_t |
| 17 struct in_place_t {}; | 16 struct in_place_t {}; |
| 18 | 17 |
| 19 // Specification: | 18 // Specification: |
| 20 // http://en.cppreference.com/w/cpp/utility/optional/nullopt_t | 19 // http://en.cppreference.com/w/cpp/utility/optional/nullopt_t |
| 21 struct nullopt_t { | 20 struct nullopt_t { |
| 22 constexpr explicit nullopt_t(int) {} | 21 constexpr explicit nullopt_t(int) {} |
| 23 }; | 22 }; |
| 24 | 23 |
| 25 // Specification: | 24 // Specification: |
| 26 // http://en.cppreference.com/w/cpp/utility/optional/in_place | 25 // http://en.cppreference.com/w/cpp/utility/optional/in_place |
| 27 constexpr in_place_t in_place = {}; | 26 constexpr in_place_t in_place = {}; |
| 28 | 27 |
| 29 // Specification: | 28 // Specification: |
| 30 // http://en.cppreference.com/w/cpp/utility/optional/nullopt | 29 // http://en.cppreference.com/w/cpp/utility/optional/nullopt |
| 31 constexpr nullopt_t nullopt(0); | 30 constexpr nullopt_t nullopt(0); |
| 32 | 31 |
| 33 namespace internal { | 32 namespace internal { |
| 34 | 33 |
| 35 template <typename T, bool = base::is_trivially_destructible<T>::value> | 34 template <typename T, bool = std::is_trivially_destructible<T>::value> |
| 36 struct OptionalStorage { | 35 struct OptionalStorage { |
| 37 // Initializing |empty_| here instead of using default member initializing | 36 // Initializing |empty_| here instead of using default member initializing |
| 38 // to avoid errors in g++ 4.8. | 37 // to avoid errors in g++ 4.8. |
| 39 constexpr OptionalStorage() : empty_('\0') {} | 38 constexpr OptionalStorage() : empty_('\0') {} |
| 40 | 39 |
| 41 constexpr explicit OptionalStorage(const T& value) | 40 constexpr explicit OptionalStorage(const T& value) |
| 42 : is_null_(false), value_(value) {} | 41 : is_null_(false), value_(value) {} |
| 43 | 42 |
| 44 // TODO(alshabalin): Can't use 'constexpr' with std::move until C++14. | 43 // TODO(alshabalin): Can't use 'constexpr' with std::move until C++14. |
| 45 explicit OptionalStorage(T&& value) | 44 explicit OptionalStorage(T&& value) |
| (...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 template <class T> | 496 template <class T> |
| 498 struct hash<base::Optional<T>> { | 497 struct hash<base::Optional<T>> { |
| 499 size_t operator()(const base::Optional<T>& opt) const { | 498 size_t operator()(const base::Optional<T>& opt) const { |
| 500 return opt == base::nullopt ? 0 : std::hash<T>()(*opt); | 499 return opt == base::nullopt ? 0 : std::hash<T>()(*opt); |
| 501 } | 500 } |
| 502 }; | 501 }; |
| 503 | 502 |
| 504 } // namespace std | 503 } // namespace std |
| 505 | 504 |
| 506 #endif // BASE_OPTIONAL_H_ | 505 #endif // BASE_OPTIONAL_H_ |
| OLD | NEW |