aboutsummaryrefslogtreecommitdiff
path: root/zencore/sharedbuffer.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-05-24 13:19:21 +0200
committerStefan Boberg <[email protected]>2021-05-24 13:19:21 +0200
commit5cf5fd50b34dec7be0362b35046ffd44a3d58983 (patch)
treeb24065a931acfbb1158e30520c6fd267b3736289 /zencore/sharedbuffer.cpp
parentAdded some functionality to support CompositeBuffer implementation (diff)
downloadzen-5cf5fd50b34dec7be0362b35046ffd44a3d58983.tar.xz
zen-5cf5fd50b34dec7be0362b35046ffd44a3d58983.zip
Added functionality to SharedBuffer/UniqueBuffer to support CompositeBuffer implementation
Most importantly, UniqueBuffer may now be "null", whereas previously it would never be.
Diffstat (limited to 'zencore/sharedbuffer.cpp')
-rw-r--r--zencore/sharedbuffer.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/zencore/sharedbuffer.cpp b/zencore/sharedbuffer.cpp
index bbbaa0b24..13924c520 100644
--- a/zencore/sharedbuffer.cpp
+++ b/zencore/sharedbuffer.cpp
@@ -35,17 +35,25 @@ UniqueBuffer::UniqueBuffer(IoBufferCore* Owner) : m_Buffer(Owner)
{
}
+SharedBuffer
+UniqueBuffer::MoveToShared()
+{
+ return SharedBuffer(std::move(m_Buffer));
+}
+
//////////////////////////////////////////////////////////////////////////
SharedBuffer::SharedBuffer(UniqueBuffer&& InBuffer) : m_Buffer(std::move(InBuffer.m_Buffer))
{
}
-void
+SharedBuffer&
SharedBuffer::MakeOwned()
{
if (IsOwned() || !m_Buffer)
- return;
+ {
+ return *this;
+ }
const uint64_t Size = m_Buffer->DataBytes();
void* Buffer = Memory::Alloc(Size, 16);
@@ -55,6 +63,8 @@ SharedBuffer::MakeOwned()
memcpy(Buffer, m_Buffer->DataPointer(), Size);
m_Buffer = NewOwner;
+
+ return *this;
}
SharedBuffer
@@ -65,6 +75,12 @@ SharedBuffer::MakeView(MemoryView View, SharedBuffer OuterBuffer)
ZEN_ASSERT(OuterBuffer.GetView().Contains(View));
}
+ if (View == OuterBuffer.GetView())
+ {
+ // Reference to the full buffer contents, so just return the "outer"
+ return OuterBuffer;
+ }
+
IoBufferCore* NewCore = new IoBufferCore(OuterBuffer.m_Buffer, View.GetData(), View.GetSize());
NewCore->SetIsImmutable(true);
return SharedBuffer(NewCore);