30 T*
get() {
return ptr.get(); }
36 : ptr(
std::move(s)) {}
38 std::shared_ptr<T> ptr;
47 template <
class T,
class... Args>
49 return Mutable<T>(std::make_shared<T>(std::forward<Args>(args)...));
52 template <
class S,
class U>
54 return Mutable<S>(std::static_pointer_cast<S>(u.ptr));
71 : ptr(
std::const_pointer_cast<const S>(
std::move(s.ptr))) {}
75 : ptr(
std::move(s.ptr)) {}
82 ptr = std::const_pointer_cast<const S>(std::move(s.ptr));
89 const T*
get()
const {
return ptr.get(); }
94 return lhs.ptr == rhs.ptr;
98 return lhs.ptr != rhs.ptr;
103 : ptr(
std::move(s)) {}
105 std::shared_ptr<const T> ptr;
113 template <
class S,
class U>
115 return Immutable<S>(std::static_pointer_cast<const S>(u.ptr));
126 template <
class T,
class Fn>
129 std::forward<Fn>(fn)(*mut);
130 immutable = std::move(mut);
Immutable(Immutable< S > s)
const T * operator->() const
friend bool operator!=(const Immutable< T > &lhs, const Immutable< T > &rhs)
Immutable(Immutable &&) noexcept=default
friend bool operator==(const Immutable< T > &lhs, const Immutable< T > &rhs)
Immutable & operator=(Immutable &&) noexcept=default
const T & operator*() const
friend Immutable< S > staticImmutableCast(const Immutable< U > &)
Immutable(Mutable< S > &&s)
friend Mutable< S > staticMutableCast(const Mutable< U > &)
friend Mutable< S > makeMutable(Args &&...)
Mutable(Mutable &&) noexcept=default
Immutable< S > staticImmutableCast(const Immutable< U > &u)
Mutable< T > makeMutable(Args &&... args)
Mutable< S > staticMutableCast(const Mutable< U > &u)
void mutate(Immutable< T > &immutable, Fn &&fn)