1#ifndef LIBSBX_SIGNAL_COPY_ON_WRITE_HPP_
2#define LIBSBX_SIGNAL_COPY_ON_WRITE_HPP_
7namespace sbx::signals {
14 template<
typename... Args>
15 explicit payload(Args&&... args)
17 value{std::forward<Args>(args)...} { }
21 std::atomic<std::size_t> count;
26 template<
typename Other>
31 using value_type = Type;
34 : _payload{
new payload{}} { }
36 template<
typename Other>
37 requires (!std::is_same_v<std::decay_t<Other>,
copy_on_write>)
39 : _payload{
new payload{std::forward<Other>(other)}} { }
42 : _payload{other._payload} {
47 : _payload{std::exchange(other._payload,
nullptr)} { }
50 if (_payload && (_payload->count == 0)) {
64 auto temp = std::move(other);
70 auto read()
const noexcept ->
const value_type& {
71 return _payload->value;
74 auto write() -> value_type& {
79 return _payload->value;
84 auto _is_unique()
const ->
bool {
85 return _payload->count == 1;
92template<
typename Type>
95 swap(lhs._payload, rhs._payload);
98template<
typename Type>
99auto cow_read(
const Type& value) ->
const Type& {
103template<
typename Type>
104auto cow_read(copy_on_write<Type>& value) ->
const Type& {
108template<
typename Type>
109auto cow_write(Type& value) -> Type& {
113template<
typename Type>
114auto cow_write(copy_on_write<Type>& value) -> Type& {
115 return value.write();
Definition: copy_on_write.hpp:10