aboutsummaryrefslogtreecommitdiff
path: root/zencore/compositebuffer.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2022-11-18 11:35:13 +0100
committerGitHub <[email protected]>2022-11-18 02:35:13 -0800
commit55225621f018904abf7e212320bb784dc64f8ac3 (patch)
tree3fb962e9e0553448f9d42612bb078ff072308e1c /zencore/compositebuffer.cpp
parentmove BasicFile to zenutil to remove zenstore dependency from zen command (#190) (diff)
downloadzen-55225621f018904abf7e212320bb784dc64f8ac3.tar.xz
zen-55225621f018904abf7e212320bb784dc64f8ac3.zip
Add `import-project` and `export-project` (#183)
* Add `import-project` and `export-project` command line parsing
Diffstat (limited to 'zencore/compositebuffer.cpp')
-rw-r--r--zencore/compositebuffer.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/zencore/compositebuffer.cpp b/zencore/compositebuffer.cpp
index 3190ca5ea..e4ca93cc2 100644
--- a/zencore/compositebuffer.cpp
+++ b/zencore/compositebuffer.cpp
@@ -124,6 +124,100 @@ CompositeBuffer::ViewOrCopyRange(uint64_t Offset, uint64_t Size, UniqueBuffer& C
return View;
}
+CompositeBuffer::Iterator
+CompositeBuffer::GetIterator(uint64_t Offset) const
+{
+ size_t SegmentCount = m_Segments.size();
+ size_t SegmentIndex = 0;
+ while (SegmentIndex < SegmentCount)
+ {
+ size_t SegmentSize = m_Segments[SegmentIndex].GetSize();
+ if (Offset < SegmentSize)
+ {
+ return {.SegmentIndex = SegmentIndex, .OffsetInSegment = Offset};
+ }
+ Offset -= SegmentSize;
+ SegmentIndex++;
+ }
+ return {.SegmentIndex = ~0ull, .OffsetInSegment = ~0ull};
+}
+
+MemoryView
+CompositeBuffer::ViewOrCopyRange(Iterator& It, uint64_t Size, UniqueBuffer& CopyBuffer) const
+{
+ MutableMemoryView WriteView;
+ size_t SegmentCount = m_Segments.size();
+ ZEN_ASSERT(It.SegmentIndex < SegmentCount);
+ uint64_t SizeLeft = Size;
+ while (SizeLeft > 0 && It.SegmentIndex < SegmentCount)
+ {
+ const SharedBuffer& Segment = m_Segments[It.SegmentIndex];
+ size_t SegmentSize = Segment.GetSize();
+ if (Size == SizeLeft && Size <= (SegmentSize - It.OffsetInSegment))
+ {
+ MemoryView View = Segment.GetView();
+ View.RightChopInline(It.OffsetInSegment);
+ View.LeftInline(SizeLeft);
+ It.OffsetInSegment += SizeLeft;
+ ZEN_ASSERT_SLOW(It.OffsetInSegment <= SegmentSize);
+ if (It.OffsetInSegment == SegmentSize)
+ {
+ It.SegmentIndex++;
+ It.OffsetInSegment = 0;
+ }
+ return View;
+ }
+ if (WriteView.GetSize() == 0)
+ {
+ if (CopyBuffer.GetSize() < Size)
+ {
+ CopyBuffer = UniqueBuffer::Alloc(Size);
+ }
+ WriteView = CopyBuffer.GetMutableView();
+ }
+ size_t CopySize = zen::Min(SegmentSize - It.OffsetInSegment, SizeLeft);
+ MemoryView ReadView = Segment.GetView();
+ ReadView.RightChopInline(It.OffsetInSegment);
+ ReadView.LeftInline(CopySize);
+ WriteView = WriteView.CopyFrom(ReadView);
+ It.OffsetInSegment += CopySize;
+ ZEN_ASSERT_SLOW(It.OffsetInSegment <= SegmentSize);
+ if (It.OffsetInSegment == SegmentSize)
+ {
+ It.SegmentIndex++;
+ It.OffsetInSegment = 0;
+ }
+ SizeLeft -= CopySize;
+ }
+ return CopyBuffer.GetView().Left(Size - SizeLeft);
+}
+
+void
+CompositeBuffer::CopyTo(MutableMemoryView WriteView, Iterator& It) const
+{
+ size_t SizeLeft = WriteView.GetSize();
+ size_t SegmentCount = m_Segments.size();
+ ZEN_ASSERT(It.SegmentIndex < SegmentCount);
+ while (WriteView.GetSize() > 0 && It.SegmentIndex < SegmentCount)
+ {
+ const SharedBuffer& Segment = m_Segments[It.SegmentIndex];
+ size_t SegmentSize = Segment.GetSize();
+ size_t CopySize = zen::Min(SegmentSize - It.OffsetInSegment, SizeLeft);
+ MemoryView ReadView = Segment.GetView();
+ ReadView.RightChopInline(It.OffsetInSegment);
+ ReadView.LeftInline(CopySize);
+ WriteView = WriteView.CopyFrom(ReadView);
+ It.OffsetInSegment += CopySize;
+ ZEN_ASSERT_SLOW(It.OffsetInSegment <= SegmentSize);
+ if (It.OffsetInSegment == SegmentSize)
+ {
+ It.SegmentIndex++;
+ It.OffsetInSegment = 0;
+ }
+ SizeLeft -= CopySize;
+ }
+}
+
void
CompositeBuffer::CopyTo(MutableMemoryView Target, uint64_t Offset) const
{