| 101 | } |
| 102 | |
| 103 | Result AsyncBuffersPool::getWritableData(AsyncBufferView::ID bufferID, Span<char>& data) |
| 104 | { |
| 105 | AsyncBufferView* buffer = getBuffer(bufferID); |
| 106 | SC_TRY_MSG(buffer != nullptr, "AsyncBuffersPool::getWritableData - Invalid bufferID"); |
| 107 | switch (buffer->type) |
| 108 | { |
| 109 | case AsyncBufferView::Type::Writable: |
| 110 | SC_TRY(buffer->writableData.sliceStartLength(buffer->offset, buffer->length, data)); |
| 111 | break; |
| 112 | case AsyncBufferView::Type::Child: { |
| 113 | AsyncBufferView* parent = getBuffer(buffer->parentID); |
| 114 | SC_TRY_MSG(parent != nullptr, "AsyncBuffersPool::getWritableData - Invalid parentID"); |
| 115 | if (parent->type == AsyncBufferView::Type::Growable) |
| 116 | { |
| 117 | AsyncBufferView::GrowableStorage storage; |
| 118 | |
| 119 | auto da = parent->getGrowableBuffer(storage, true)->getDirectAccess(); |
| 120 | Span<char> rootFullData = {static_cast<char*>(da.data), da.sizeInBytes}; |
| 121 | SC_TRY(rootFullData.sliceStartLength(buffer->offset, buffer->length, data)); |
| 122 | buffer->writableData = data; // Update for debugging visibility |
| 123 | (void)parent->getGrowableBuffer(storage, false); // destruct |
| 124 | } |
| 125 | else |
| 126 | { |
| 127 | data = buffer->writableData; |
| 128 | } |
| 129 | break; |
| 130 | } |
| 131 | default: return Result::Error("AsyncBuffersPool::getWritableData - Readonly or Growable buffer"); |
| 132 | } |
| 133 | return Result(true); |
| 134 | } |
| 135 | |
| 136 | AsyncBufferView* AsyncBuffersPool::getBuffer(AsyncBufferView::ID bufferID) |
| 137 | { |