@@ -28,6 +28,7 @@ void AsyncBuffersPool::unrefBuffer(AsyncBufferView::ID bufferID)
2828 {
2929 case AsyncBufferView::Type::Writable: buffer->writableData = buffer->originalWritableData ; break ;
3030 case AsyncBufferView::Type::ReadOnly: *buffer = {}; break ;
31+ case AsyncBufferView::Type::Growable: *buffer = {}; break ;
3132 case AsyncBufferView::Type::Empty: Assert::unreachable (); break ;
3233 }
3334 }
@@ -41,6 +42,14 @@ Result AsyncBuffersPool::getReadableData(AsyncBufferView::ID bufferID, Span<cons
4142 {
4243 case AsyncBufferView::Type::Writable: data = buffer->writableData ; break ;
4344 case AsyncBufferView::Type::ReadOnly: data = buffer->readonlyData ; break ;
45+ case AsyncBufferView::Type::Growable: {
46+ AsyncBufferView::GrowableStorage storage;
47+
48+ auto da = buffer->getGrowableBuffer (storage, true )->getDirectAccess ();
49+ data = {static_cast <char *>(da.data ), da.sizeInBytes };
50+ (void )buffer->getGrowableBuffer (storage, false ); // destruct
51+ break ;
52+ }
4453 case AsyncBufferView::Type::Empty: Assert::unreachable (); break ;
4554 }
4655 return Result (true );
@@ -77,6 +86,16 @@ Result AsyncBuffersPool::requestNewBuffer(size_t minimumSizeInBytes, AsyncBuffer
7786 {
7887 case AsyncBufferView::Type::Writable: buffer.originalWritableData = buffer.writableData ; break ;
7988 case AsyncBufferView::Type::ReadOnly: buffer.originalReadonlyData = buffer.readonlyData ; break ;
89+ case AsyncBufferView::Type::Growable: {
90+ AsyncBufferView::GrowableStorage storage;
91+
92+ auto da = buffer.getGrowableBuffer (storage, true )->getDirectAccess ();
93+
94+ buffer.writableData = {static_cast <char *>(da.data ), da.sizeInBytes };
95+ buffer.originalWritableData = {static_cast <char *>(da.data ), da.sizeInBytes };
96+ (void )buffer.getGrowableBuffer (storage, false ); // destruct
97+ break ;
98+ }
8099 case AsyncBufferView::Type::Empty: SC_ASSERT_RELEASE (false ); break ;
81100 }
82101 bufferID = AsyncBufferView::ID (static_cast <AsyncBufferView::ID::NumericType>(&buffer - buffers.begin ()));
@@ -105,6 +124,22 @@ void AsyncBuffersPool::setNewBufferSize(AsyncBufferView::ID bufferID, size_t new
105124 buffer->readonlyData = {buffer->readonlyData .data (), newSizeInBytes};
106125 }
107126 break ;
127+ case AsyncBufferView::Type::Growable: {
128+ AsyncBufferView::GrowableStorage storage;
129+
130+ IGrowableBuffer* growable = buffer->getGrowableBuffer (storage, true );
131+ if (growable->resizeWithoutInitializing (newSizeInBytes))
132+ {
133+ auto da = growable->getDirectAccess ();
134+
135+ buffer->writableData = {static_cast <char *>(da.data ), da.sizeInBytes };
136+ buffer->originalWritableData = {static_cast <char *>(da.data ), da.sizeInBytes };
137+ }
138+ (void )buffer->getGrowableBuffer (storage, false ); // destruct
139+ break ;
140+ }
141+
142+ break ;
108143 case AsyncBufferView::Type::Empty: SC_ASSERT_RELEASE (false ); break ;
109144 }
110145 }
0 commit comments