aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/sharedbuffer.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2023-05-02 10:01:47 +0200
committerGitHub <[email protected]>2023-05-02 10:01:47 +0200
commit075d17f8ada47e990fe94606c3d21df409223465 (patch)
treee50549b766a2f3c354798a54ff73404217b4c9af /src/zencore/sharedbuffer.cpp
parentfix: bundle shouldn't append content zip to zen (diff)
downloadzen-075d17f8ada47e990fe94606c3d21df409223465.tar.xz
zen-075d17f8ada47e990fe94606c3d21df409223465.zip
moved source directories into `/src` (#264)
* moved source directories into `/src` * updated bundle.lua for new `src` path * moved some docs, icon * removed old test trees
Diffstat (limited to 'src/zencore/sharedbuffer.cpp')
-rw-r--r--src/zencore/sharedbuffer.cpp146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/zencore/sharedbuffer.cpp b/src/zencore/sharedbuffer.cpp
new file mode 100644
index 000000000..200e06972
--- /dev/null
+++ b/src/zencore/sharedbuffer.cpp
@@ -0,0 +1,146 @@
+// Copyright Epic Games, Inc. All Rights Reserved.
+
+#include <zencore/sharedbuffer.h>
+
+#include <zencore/testing.h>
+
+#include <memory.h>
+
+#include <gsl/gsl-lite.hpp>
+
+namespace zen {
+
+//////////////////////////////////////////////////////////////////////////
+
+UniqueBuffer
+UniqueBuffer::Alloc(uint64_t Size)
+{
+ void* Buffer = Memory::Alloc(Size, 16);
+ IoBufferCore* Owner = new IoBufferCore(Buffer, Size);
+ Owner->SetIsOwnedByThis(true);
+ Owner->SetIsImmutable(false);
+
+ return UniqueBuffer(Owner);
+}
+
+UniqueBuffer
+UniqueBuffer::MakeMutableView(void* DataPtr, uint64_t Size)
+{
+ IoBufferCore* Owner = new IoBufferCore(DataPtr, Size);
+ Owner->SetIsImmutable(false);
+ return UniqueBuffer(Owner);
+}
+
+UniqueBuffer::UniqueBuffer(IoBufferCore* Owner) : m_Buffer(Owner)
+{
+}
+
+SharedBuffer
+UniqueBuffer::MoveToShared()
+{
+ return SharedBuffer(std::move(m_Buffer));
+}
+
+void
+UniqueBuffer::Reset()
+{
+ m_Buffer = nullptr;
+}
+
+//////////////////////////////////////////////////////////////////////////
+
+SharedBuffer::SharedBuffer(UniqueBuffer&& InBuffer) : m_Buffer(std::move(InBuffer.m_Buffer))
+{
+}
+
+SharedBuffer
+SharedBuffer::MakeOwned() const&
+{
+ if (IsOwned() || !m_Buffer)
+ {
+ return *this;
+ }
+ else
+ {
+ return Clone(GetView());
+ }
+}
+
+SharedBuffer
+SharedBuffer::MakeOwned() &&
+{
+ if (IsOwned())
+ {
+ return std::move(*this);
+ }
+ else
+ {
+ return Clone(GetView());
+ }
+}
+
+SharedBuffer
+SharedBuffer::MakeView(MemoryView View, SharedBuffer OuterBuffer)
+{
+ if (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);
+}
+
+SharedBuffer
+SharedBuffer::MakeView(const void* Data, uint64_t Size)
+{
+ return SharedBuffer(new IoBufferCore(const_cast<void*>(Data), Size));
+}
+
+SharedBuffer
+SharedBuffer::Clone()
+{
+ const uint64_t Size = GetSize();
+ void* Buffer = Memory::Alloc(Size, 16);
+ auto NewOwner = new IoBufferCore(Buffer, Size);
+ NewOwner->SetIsOwnedByThis(true);
+ memcpy(Buffer, m_Buffer->DataPointer(), Size);
+
+ return SharedBuffer(NewOwner);
+}
+
+SharedBuffer
+SharedBuffer::Clone(MemoryView View)
+{
+ const uint64_t Size = View.GetSize();
+ void* Buffer = Memory::Alloc(Size, 16);
+ auto NewOwner = new IoBufferCore(Buffer, Size);
+ NewOwner->SetIsOwnedByThis(true);
+ memcpy(Buffer, View.GetData(), Size);
+
+ return SharedBuffer(NewOwner);
+}
+
+//////////////////////////////////////////////////////////////////////////
+
+#if ZEN_WITH_TESTS
+
+void
+sharedbuffer_forcelink()
+{
+}
+
+TEST_CASE("SharedBuffer")
+{
+}
+
+#endif
+
+} // namespace zen