OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 // Dereference with a default value in case we don't have a value. | 227 // Dereference with a default value in case we don't have a value. |
228 const T& value_or(const T& default_val) const { | 228 const T& value_or(const T& default_val) const { |
229 // The no-op call prevents the compiler from generating optimized code that | 229 // The no-op call prevents the compiler from generating optimized code that |
230 // reads value_ even if !has_value_, but only if FunctionThatDoesNothing is | 230 // reads value_ even if !has_value_, but only if FunctionThatDoesNothing is |
231 // not completely inlined; see its declaration.). | 231 // not completely inlined; see its declaration.). |
232 return has_value_ ? *optional_internal::FunctionThatDoesNothing(&value_) | 232 return has_value_ ? *optional_internal::FunctionThatDoesNothing(&value_) |
233 : default_val; | 233 : default_val; |
234 } | 234 } |
235 | 235 |
236 // Equality tests. Two Optionals are equal if they contain equivalent values, | 236 // Equality tests. Two Optionals are equal if they contain equivalent values, |
237 // or | 237 // or if they're both empty. |
238 // if they're both empty. | |
239 friend bool operator==(const Optional& m1, const Optional& m2) { | 238 friend bool operator==(const Optional& m1, const Optional& m2) { |
240 return m1.has_value_ && m2.has_value_ ? m1.value_ == m2.value_ | 239 return m1.has_value_ && m2.has_value_ ? m1.value_ == m2.value_ |
241 : m1.has_value_ == m2.has_value_; | 240 : m1.has_value_ == m2.has_value_; |
242 } | 241 } |
| 242 friend bool operator==(const Optional& opt, const T& value) { |
| 243 return opt.has_value_ && opt.value_ == value; |
| 244 } |
| 245 friend bool operator==(const T& value, const Optional& opt) { |
| 246 return opt.has_value_ && value == opt.value_; |
| 247 } |
| 248 |
243 friend bool operator!=(const Optional& m1, const Optional& m2) { | 249 friend bool operator!=(const Optional& m1, const Optional& m2) { |
244 return m1.has_value_ && m2.has_value_ ? m1.value_ != m2.value_ | 250 return m1.has_value_ && m2.has_value_ ? m1.value_ != m2.value_ |
245 : m1.has_value_ != m2.has_value_; | 251 : m1.has_value_ != m2.has_value_; |
246 } | 252 } |
| 253 friend bool operator!=(const Optional& opt, const T& value) { |
| 254 return !opt.has_value_ || opt.value_ != value; |
| 255 } |
| 256 friend bool operator!=(const T& value, const Optional& opt) { |
| 257 return !opt.has_value_ || value != opt.value_; |
| 258 } |
247 | 259 |
248 private: | 260 private: |
249 // Tell sanitizers that value_ shouldn't be touched. | 261 // Tell sanitizers that value_ shouldn't be touched. |
250 void PoisonValue() { | 262 void PoisonValue() { |
251 rtc::AsanPoison(rtc::MakeArrayView(&value_, 1)); | 263 rtc::AsanPoison(rtc::MakeArrayView(&value_, 1)); |
252 rtc::MsanMarkUninitialized(rtc::MakeArrayView(&value_, 1)); | 264 rtc::MsanMarkUninitialized(rtc::MakeArrayView(&value_, 1)); |
253 } | 265 } |
254 | 266 |
255 // Tell sanitizers that value_ is OK to touch again. | 267 // Tell sanitizers that value_ is OK to touch again. |
256 void UnpoisonValue() { | 268 void UnpoisonValue() { |
(...skipping 11 matching lines...) Expand all Loading... |
268 // construct it, and the Optional destructor won't automatically destroy | 280 // construct it, and the Optional destructor won't automatically destroy |
269 // it. Basically, this just allocates a properly sized and aligned block of | 281 // it. Basically, this just allocates a properly sized and aligned block of |
270 // memory in which we can manually put a T with placement new. | 282 // memory in which we can manually put a T with placement new. |
271 T value_; | 283 T value_; |
272 }; | 284 }; |
273 }; | 285 }; |
274 | 286 |
275 } // namespace rtc | 287 } // namespace rtc |
276 | 288 |
277 #endif // WEBRTC_BASE_OPTIONAL_H_ | 289 #endif // WEBRTC_BASE_OPTIONAL_H_ |
OLD | NEW |