• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_CRDTP_GLUE_H_
6 #define V8_CRDTP_GLUE_H_
7 
8 #include <cassert>
9 #include <memory>
10 
11 namespace v8_crdtp {
12 namespace glue {
13 // =============================================================================
14 // glue::detail::PtrMaybe, glue::detail::ValueMaybe, templates for optional
15 // pointers / values which are used in ../lib/Forward_h.template.
16 // =============================================================================
17 namespace detail {
18 template <typename T>
19 class PtrMaybe {
20  public:
21   PtrMaybe() = default;
PtrMaybe(std::unique_ptr<T> value)22   PtrMaybe(std::unique_ptr<T> value) : value_(std::move(value)) {}
PtrMaybe(PtrMaybe && other)23   PtrMaybe(PtrMaybe&& other) noexcept : value_(std::move(other.value_)) {}
24   void operator=(std::unique_ptr<T> value) { value_ = std::move(value); }
fromJust()25   T* fromJust() const {
26     assert(value_);
27     return value_.get();
28   }
fromMaybe(T * default_value)29   T* fromMaybe(T* default_value) const {
30     return value_ ? value_.get() : default_value;
31   }
isJust()32   bool isJust() const { return value_ != nullptr; }
takeJust()33   std::unique_ptr<T> takeJust() {
34     assert(value_);
35     return std::move(value_);
36   }
37 
38  private:
39   std::unique_ptr<T> value_;
40 };
41 
42 template <typename T>
43 class ValueMaybe {
44  public:
ValueMaybe()45   ValueMaybe() : is_just_(false), value_() {}
ValueMaybe(T value)46   ValueMaybe(T value) : is_just_(true), value_(std::move(value)) {}
ValueMaybe(ValueMaybe && other)47   ValueMaybe(ValueMaybe&& other) noexcept
48       : is_just_(other.is_just_), value_(std::move(other.value_)) {}
49   void operator=(T value) {
50     value_ = value;
51     is_just_ = true;
52   }
fromJust()53   const T& fromJust() const {
54     assert(is_just_);
55     return value_;
56   }
fromMaybe(const T & default_value)57   const T& fromMaybe(const T& default_value) const {
58     return is_just_ ? value_ : default_value;
59   }
isJust()60   bool isJust() const { return is_just_; }
takeJust()61   T takeJust() {
62     assert(is_just_);
63     is_just_ = false;
64     return std::move(value_);
65   }
66 
67  private:
68   bool is_just_;
69   T value_;
70 };
71 }  // namespace detail
72 }  // namespace glue
73 }  // namespace v8_crdtp
74 
75 #define PROTOCOL_DISALLOW_COPY(ClassName) \
76  private:                                 \
77   ClassName(const ClassName&) = delete;   \
78   ClassName& operator=(const ClassName&) = delete
79 
80 #endif  // V8_CRDTP_GLUE_H_
81