Uni20
Asynchronous tensor and runtime library.
Loading...
Searching...
No Matches
Public Types | Public Member Functions | List of all members
uni20::async::WriteBuffer< T > Class Template Reference

Exclusive mutable-access buffer for one Async<T> epoch. More...

#include <buffers.hpp>

Public Types

using element_type = std::conditional_t< is_async_alias_v< T >, T const &, T & >
 
using value_type = T
 

Public Member Functions

bool await_ready () const noexcept
 Reports whether the writer epoch is immediately writable.
 
WriteAccessProxy< T > await_resume () &
 Resume and return a non-owning mutable write proxy.
 
OwningWriteAccessProxy< T > await_resume () &&
 Resume and return an owning mutable write proxy.
 
WriteAccessProxy< T > await_resume () const &
 Resume and return a non-owning mutable write proxy.
 
void await_suspend (BasicTask &&t) noexcept
 Suspend until the writer epoch becomes writable.
 
template<typename... Args>
requires (!is_async_alias_v<T> && std::constructible_from<T, Args...>)
T & emplace_assert (Args &&... args)
 Construct the destination value in-place when immediately writable.
 
std::shared_ptr< EpochContext > epoch_context_shared () const noexcept
 Returns the epoch context used for exception propagation.
 
T move_from_wait ()
 Wait for writability and move out the contained value.
 
auto operator co_await () &&noexcept -> OwningWriteAwaiter< T >
 Enable co_await for rvalue write buffers and transfer ownership.
 
auto operator co_await () &noexcept -> WriteBuffer &
 Enable co_await for lvalue write buffers.
 
auto operator co_await () const &noexcept -> WriteBuffer const &
 Enable co_await for const lvalue write buffers.
 
WriteBuffer & operator= (WriteBuffer &&other) noexcept
 Move assignment.
 
WriteBuffer & operator= (WriteBuffer const &)=delete
 
void register_exception_sink (TaskPromiseBase &promise, bool explicit_sink) const
 Register this buffer as an exception sink with a promise.
 
void release () noexcept
 Release the writer epoch held by this buffer.
 
auto storage () &
 Awaiter yielding direct access to writer shared storage.
 
auto storage () &&-> OwningStorageAwaiter< T > requires(!is_async_alias_v< T >)
 Awaiter yielding owning access to writer shared storage.
 
auto take () &
 Awaiter that takes the stored value.
 
auto take () &&-> OwningTakeAwaiter< T > requires(!is_async_alias_v< T >)
 Awaiter that takes the stored value from an rvalue buffer.
 
auto take_release () &
 Awaiter that takes the value and releases the writer epoch.
 
auto take_release () &&-> OwningTakeAwaiter< T > requires(!is_async_alias_v< T >)
 Awaiter that takes the value and releases the writer epoch from an rvalue buffer.
 
WriteBuffer && transfer () &&noexcept
 Transfer this write buffer into the owning-await path.
 
WriteBuffer && transfer () &noexcept
 Transfer this write buffer into the owning-await path.
 
WriteAssignProxy< T > write ()
 Build an assignment-only proxy that consumes this writer.
 
template<typename U >
requires (!is_async_alias_v<T> || detail::async_alias_assignment_source<T, U>)
void write (U &&val)
 Schedule assignment into this write buffer.
 
template<typename U >
requires ((!is_async_alias_v<T> && std::assignable_from<T&, U &&>) || detail::async_alias_assignable_from<T, U &&>)
void write_assert (U &&val)
 Assign immediately when the writer is known to be ready.
 
template<typename U >
requires (!is_async_alias_v<T>)
void write_move (U &&val)
 Schedule move-assignment into this write buffer.
 
template<typename U >
requires (!is_async_alias_v<T> && std::assignable_from<T&, U &&>)
void write_move_assert (U &&val)
 Move-assign immediately when the writer is known to be ready.
 
 WriteBuffer (EpochContextWriter< T > writer)
 Construct a write buffer tied to a writer context.
 
 WriteBuffer (WriteBuffer &&other) noexcept
 Move constructor.
 
 WriteBuffer (WriteBuffer const &)=delete
 
 ~WriteBuffer () noexcept
 Destructor unregisters exception sink and invalidates debug proxy state.
 

Detailed Description

template<typename T>
class uni20::async::WriteBuffer< T >

Exclusive mutable-access buffer for one Async<T> epoch.

Write names the exclusive producer role, not write-only memory access. Independent values may be inspected, mutated, constructed, replaced, or moved out. Async aliases expose their descriptor as read-only and permit only ADL-customized write-through assignment. co_await writer yields a borrowed proxy tied to the WriteBuffer<T> object. co_await writer.transfer() yields an owning proxy whose lifetime no longer depends on the original buffer object. Specialized awaiters such as storage() and take() are paths through this one capability; they do not create additional writer epochs.

Member Typedef Documentation

◆ element_type

template<typename T >
using uni20::async::WriteBuffer< T >::element_type = std::conditional_t<is_async_alias_v<T>, T const&, T&>

◆ value_type

template<typename T >
using uni20::async::WriteBuffer< T >::value_type = T

Constructor & Destructor Documentation

◆ WriteBuffer() [1/3]

template<typename T >
uni20::async::WriteBuffer< T >::WriteBuffer ( EpochContextWriter< T >  writer)
inlineexplicit

Construct a write buffer tied to a writer context.

Parameters
writerRAII writer handle for this operation.

◆ ~WriteBuffer()

template<typename T >
uni20::async::WriteBuffer< T >::~WriteBuffer ( )
inlinenoexcept

Destructor unregisters exception sink and invalidates debug proxy state.

◆ WriteBuffer() [2/3]

template<typename T >
uni20::async::WriteBuffer< T >::WriteBuffer ( WriteBuffer< T > const &  )
delete

◆ WriteBuffer() [3/3]

template<typename T >
uni20::async::WriteBuffer< T >::WriteBuffer ( WriteBuffer< T > &&  other)
inlinenoexcept

Move constructor.

Parameters
otherSource write buffer.

Member Function Documentation

◆ await_ready()

template<typename T >
bool uni20::async::WriteBuffer< T >::await_ready ( ) const
inlinenoexcept

Reports whether the writer epoch is immediately writable.

Returns
true when no suspension is needed.

◆ await_resume() [1/3]

template<typename T >
WriteAccessProxy< T > uni20::async::WriteBuffer< T >::await_resume ( ) &
inline

Resume and return a non-owning mutable write proxy.

Returns
Non-owning write proxy.

◆ await_resume() [2/3]

template<typename T >
OwningWriteAccessProxy< T > uni20::async::WriteBuffer< T >::await_resume ( ) &&
inline

Resume and return an owning mutable write proxy.

Returns
Owning write proxy.

◆ await_resume() [3/3]

template<typename T >
WriteAccessProxy< T > uni20::async::WriteBuffer< T >::await_resume ( ) const &
inline

Resume and return a non-owning mutable write proxy.

Returns
Non-owning write proxy.

◆ await_suspend()

template<typename T >
void uni20::async::WriteBuffer< T >::await_suspend ( BasicTask &&  t)
inlinenoexcept

Suspend until the writer epoch becomes writable.

Parameters
tOwning task to suspend and enqueue.

◆ emplace_assert()

template<typename T >
template<typename... Args>
requires (!is_async_alias_v<T> && std::constructible_from<T, Args...>)
T & uni20::async::WriteBuffer< T >::emplace_assert ( Args &&...  args)
inline

Construct the destination value in-place when immediately writable.

Template Parameters
ArgsConstructor argument types.
Parameters
argsConstructor arguments.
Returns
Reference to the constructed value.

◆ epoch_context_shared()

template<typename T >
std::shared_ptr< EpochContext > uni20::async::WriteBuffer< T >::epoch_context_shared ( ) const
inlinenoexcept

Returns the epoch context used for exception propagation.

Returns
Shared pointer to the epoch context.

◆ move_from_wait()

template<typename T >
T uni20::async::WriteBuffer< T >::move_from_wait ( )
inline

Wait for writability and move out the contained value.

Returns
Moved value.

◆ operator co_await() [1/3]

template<typename T >
auto uni20::async::WriteBuffer< T >::operator co_await ( ) && -> OwningWriteAwaiter<T>
inlinenoexcept

Enable co_await for rvalue write buffers and transfer ownership.

Returns
Owning write awaiter.

◆ operator co_await() [2/3]

template<typename T >
auto uni20::async::WriteBuffer< T >::operator co_await ( ) & -> WriteBuffer&
inlinenoexcept

Enable co_await for lvalue write buffers.

Returns
Reference to this buffer.

◆ operator co_await() [3/3]

template<typename T >
auto uni20::async::WriteBuffer< T >::operator co_await ( ) const & -> WriteBuffer const&
inlinenoexcept

Enable co_await for const lvalue write buffers.

Returns
Const reference to this buffer.

◆ operator=() [1/2]

template<typename T >
WriteBuffer & uni20::async::WriteBuffer< T >::operator= ( WriteBuffer< T > &&  other)
inlinenoexcept

Move assignment.

Parameters
otherSource write buffer.
Returns
Reference to *this.

◆ operator=() [2/2]

template<typename T >
WriteBuffer & uni20::async::WriteBuffer< T >::operator= ( WriteBuffer< T > const &  )
delete

◆ register_exception_sink()

template<typename T >
void uni20::async::WriteBuffer< T >::register_exception_sink ( TaskPromiseBase &  promise,
bool  explicit_sink 
) const
inline

Register this buffer as an exception sink with a promise.

Parameters
promisePromise that owns the sink list.
explicit_sinkWhether this sink came from propagate_exceptions_to.

◆ release()

template<typename T >
void uni20::async::WriteBuffer< T >::release ( )
inlinenoexcept

Release the writer epoch held by this buffer.

◆ storage() [1/2]

template<typename T >
auto uni20::async::WriteBuffer< T >::storage ( ) &
inline

Awaiter yielding direct access to writer shared storage.

Returns
Storage awaiter.

◆ storage() [2/2]

template<typename T >
auto uni20::async::WriteBuffer< T >::storage ( ) && -> OwningStorageAwaiter<T> requires(!is_async_alias_v<T>)
inline

Awaiter yielding owning access to writer shared storage.

Returns
Owning storage awaiter.

◆ take() [1/2]

template<typename T >
auto uni20::async::WriteBuffer< T >::take ( ) &
inline

Awaiter that takes the stored value.

Returns
Awaiter yielding a moved value.

◆ take() [2/2]

template<typename T >
auto uni20::async::WriteBuffer< T >::take ( ) && -> OwningTakeAwaiter<T> requires(!is_async_alias_v<T>)
inline

Awaiter that takes the stored value from an rvalue buffer.

Returns
Owning take awaiter.

◆ take_release() [1/2]

template<typename T >
auto uni20::async::WriteBuffer< T >::take_release ( ) &
inline

Awaiter that takes the value and releases the writer epoch.

Returns
Awaiter yielding a moved value.

◆ take_release() [2/2]

template<typename T >
auto uni20::async::WriteBuffer< T >::take_release ( ) && -> OwningTakeAwaiter<T> requires(!is_async_alias_v<T>)
inline

Awaiter that takes the value and releases the writer epoch from an rvalue buffer.

Returns
Owning take awaiter.

◆ transfer() [1/2]

template<typename T >
WriteBuffer && uni20::async::WriteBuffer< T >::transfer ( ) &&
inlinenoexcept

Transfer this write buffer into the owning-await path.

Returns
Rvalue reference to *this.

◆ transfer() [2/2]

template<typename T >
WriteBuffer && uni20::async::WriteBuffer< T >::transfer ( ) &
inlinenoexcept

Transfer this write buffer into the owning-await path.

Returns
Rvalue reference to *this.

◆ write() [1/2]

template<typename T >
WriteAssignProxy< T > uni20::async::WriteBuffer< T >::write ( )

Build an assignment-only proxy that consumes this writer.

Build an assignment-only proxy from a write buffer.

Returns
Assignment-only proxy.
Template Parameters
TStored value type.
Returns
Assignment-only writer proxy.

◆ write() [2/2]

template<typename T >
template<typename U >
requires (!is_async_alias_v<T> || detail::async_alias_assignment_source<T, U>)
void uni20::async::WriteBuffer< T >::write ( U &&  val)
inline

Schedule assignment into this write buffer.

Template Parameters
USource type.
Parameters
valSource expression.

◆ write_assert()

template<typename T >
template<typename U >
requires ((!is_async_alias_v<T> && std::assignable_from<T&, U &&>) || detail::async_alias_assignable_from<T, U &&>)
void uni20::async::WriteBuffer< T >::write_assert ( U &&  val)
inline

Assign immediately when the writer is known to be ready.

Template Parameters
USource type assignable to T&.
Parameters
valSource value.

◆ write_move()

template<typename T >
template<typename U >
requires (!is_async_alias_v<T>)
void uni20::async::WriteBuffer< T >::write_move ( U &&  val)
inline

Schedule move-assignment into this write buffer.

Template Parameters
USource type.
Parameters
valSource expression.

◆ write_move_assert()

template<typename T >
template<typename U >
requires (!is_async_alias_v<T> && std::assignable_from<T&, U &&>)
void uni20::async::WriteBuffer< T >::write_move_assert ( U &&  val)
inline

Move-assign immediately when the writer is known to be ready.

Template Parameters
USource type assignable to T&.
Parameters
valSource value.

The documentation for this class was generated from the following file: