MapLibre Native Core
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
immutable.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <memory>
4 
5 namespace mbgl {
6 
21 template <class T>
22 class Mutable {
23 public:
24  Mutable(Mutable&&) noexcept = default;
25  Mutable& operator=(Mutable&&) noexcept = default;
26 
27  Mutable(const Mutable&) = delete;
28  Mutable& operator=(const Mutable&) = delete;
29 
30  T* get() { return ptr.get(); }
31  T* operator->() { return ptr.get(); }
32  T& operator*() { return *ptr; }
33 
34 private:
35  Mutable(std::shared_ptr<T>&& s)
36  : ptr(std::move(s)) {}
37 
38  std::shared_ptr<T> ptr;
39 
40  template <class S> friend class Immutable;
41  // NOLINTNEXTLINE(readability-redundant-declaration)
42  template <class S, class... Args> friend Mutable<S> makeMutable(Args&&...);
43  // NOLINTNEXTLINE(readability-redundant-declaration)
44  template <class S, class U> friend Mutable<S> staticMutableCast(const Mutable<U>&);
45 };
46 
47 template <class T, class... Args>
48 Mutable<T> makeMutable(Args&&... args) {
49  return Mutable<T>(std::make_shared<T>(std::forward<Args>(args)...));
50 }
51 
52 template <class S, class U>
54  return Mutable<S>(std::static_pointer_cast<S>(u.ptr));
55 }
56 
66 template <class T>
67 class Immutable {
68 public:
69  template <class S>
71  : ptr(std::const_pointer_cast<const S>(std::move(s.ptr))) {}
72 
73  template <class S>
75  : ptr(std::move(s.ptr)) {}
76 
77  Immutable(Immutable&&) noexcept = default;
78  Immutable(const Immutable&) = default;
79 
80  template <class S>
81  Immutable& operator=(Mutable<S>&& s) {
82  ptr = std::const_pointer_cast<const S>(std::move(s.ptr));
83  return *this;
84  }
85 
86  Immutable& operator=(Immutable&&) noexcept = default;
87  Immutable& operator=(const Immutable&) = default;
88 
89  const T* get() const { return ptr.get(); }
90  const T* operator->() const { return ptr.get(); }
91  const T& operator*() const { return *ptr; }
92 
93  friend bool operator==(const Immutable<T>& lhs, const Immutable<T>& rhs) {
94  return lhs.ptr == rhs.ptr;
95  }
96 
97  friend bool operator!=(const Immutable<T>& lhs, const Immutable<T>& rhs) {
98  return lhs.ptr != rhs.ptr;
99  }
100 
101 private:
102  Immutable(std::shared_ptr<const T>&& s)
103  : ptr(std::move(s)) {}
104 
105  std::shared_ptr<const T> ptr;
106 
107  template <class S> friend class Immutable;
108 
109  // NOLINTNEXTLINE(readability-redundant-declaration)
110  template <class S, class U> friend Immutable<S> staticImmutableCast(const Immutable<U>&);
111 };
112 
113 template <class S, class U>
115  return Immutable<S>(std::static_pointer_cast<const S>(u.ptr));
116 }
117 
126 template <class T, class Fn>
127 void mutate(Immutable<T>& immutable, Fn&& fn) {
128  Mutable<T> mut = makeMutable<T>(*immutable);
129  std::forward<Fn>(fn)(*mut);
130  immutable = std::move(mut);
131 }
132 
133 } // namespace mbgl
Immutable(Immutable< S > s)
Definition: immutable.hpp:74
const T * operator->() const
Definition: immutable.hpp:90
const T * get() const
Definition: immutable.hpp:89
friend bool operator!=(const Immutable< T > &lhs, const Immutable< T > &rhs)
Definition: immutable.hpp:97
Immutable(Immutable &&) noexcept=default
friend bool operator==(const Immutable< T > &lhs, const Immutable< T > &rhs)
Definition: immutable.hpp:93
Immutable & operator=(Immutable &&) noexcept=default
const T & operator*() const
Definition: immutable.hpp:91
friend Immutable< S > staticImmutableCast(const Immutable< U > &)
Definition: immutable.hpp:114
Immutable(Mutable< S > &&s)
Definition: immutable.hpp:70
friend class Immutable
Definition: immutable.hpp:107
T * operator->()
Definition: immutable.hpp:31
friend Mutable< S > staticMutableCast(const Mutable< U > &)
Definition: immutable.hpp:53
friend Mutable< S > makeMutable(Args &&...)
T & operator*()
Definition: immutable.hpp:32
Mutable(Mutable &&) noexcept=default
Definition: actor.hpp:15
Immutable< S > staticImmutableCast(const Immutable< U > &u)
Definition: immutable.hpp:114
Mutable< T > makeMutable(Args &&... args)
Definition: immutable.hpp:48
Mutable< S > staticMutableCast(const Mutable< U > &u)
Definition: immutable.hpp:53
void mutate(Immutable< T > &immutable, Fn &&fn)
Definition: immutable.hpp:127
Definition: tile_id.hpp:256