aboutsummaryrefslogtreecommitdiff
path: root/zencore
diff options
context:
space:
mode:
Diffstat (limited to 'zencore')
-rw-r--r--zencore/compactbinarypackage.cpp47
-rw-r--r--zencore/include/zencore/iobuffer.h29
-rw-r--r--zencore/include/zencore/refcount.h2
-rw-r--r--zencore/include/zencore/stream.h293
-rw-r--r--zencore/include/zencore/streamutil.h118
-rw-r--r--zencore/include/zencore/zencore.h8
-rw-r--r--zencore/stream.cpp312
-rw-r--r--zencore/streamutil.cpp104
-rw-r--r--zencore/uid.cpp7
-rw-r--r--zencore/zencore.cpp58
-rw-r--r--zencore/zencore.vcxproj3
-rw-r--r--zencore/zencore.vcxproj.filters3
12 files changed, 115 insertions, 869 deletions
diff --git a/zencore/compactbinarypackage.cpp b/zencore/compactbinarypackage.cpp
index fbdcd24e9..88757d47f 100644
--- a/zencore/compactbinarypackage.cpp
+++ b/zencore/compactbinarypackage.cpp
@@ -83,8 +83,7 @@ CbAttachment::CbAttachment(const CbObject& InValue, const IoHash* const InHash)
bool
CbAttachment::TryLoad(IoBuffer& InBuffer, BufferAllocator Allocator)
{
- MemoryInStream InStream(InBuffer.Data(), InBuffer.Size());
- BinaryReader Reader(InStream);
+ BinaryReader Reader(InBuffer.Data(), InBuffer.Size());
return TryLoad(Reader, Allocator);
}
@@ -427,8 +426,7 @@ CbPackage::GatherAttachments(const CbObject& Value, AttachmentResolver Resolver)
bool
CbPackage::TryLoad(IoBuffer InBuffer, BufferAllocator Allocator, AttachmentResolver* Mapper)
{
- MemoryInStream InStream(InBuffer.Data(), InBuffer.Size());
- BinaryReader Reader(InStream);
+ BinaryReader Reader(InBuffer.Data(), InBuffer.Size());
return TryLoad(Reader, Allocator, Mapper);
}
@@ -670,8 +668,7 @@ namespace legacy {
bool TryLoadCbPackage(CbPackage& Package, IoBuffer InBuffer, BufferAllocator Allocator, CbPackage::AttachmentResolver* Mapper)
{
- MemoryInStream InStream(InBuffer.Data(), InBuffer.Size());
- BinaryReader Reader(InStream);
+ BinaryReader Reader(InBuffer.Data(), InBuffer.Size());
return TryLoadCbPackage(Package, Reader, Allocator, Mapper);
}
@@ -764,24 +761,22 @@ TEST_CASE("usonpackage")
Attachment.Save(Writer);
CbFieldIterator Fields = Writer.Save();
- MemoryOutStream WriteStream;
- BinaryWriter StreamWriter{WriteStream};
+ BinaryWriter StreamWriter;
Attachment.Save(StreamWriter);
- CHECK(MakeMemoryView(WriteStream).EqualBytes(Fields.GetRangeBuffer().GetView()));
- CHECK(ValidateCompactBinaryRange(MakeMemoryView(WriteStream), CbValidateMode::All) == CbValidateError::None);
- CHECK(ValidateObjectAttachment(MakeMemoryView(WriteStream), CbValidateMode::All) == CbValidateError::None);
+ CHECK(MakeMemoryView(StreamWriter).EqualBytes(Fields.GetRangeBuffer().GetView()));
+ CHECK(ValidateCompactBinaryRange(MakeMemoryView(StreamWriter), CbValidateMode::All) == CbValidateError::None);
+ CHECK(ValidateObjectAttachment(MakeMemoryView(StreamWriter), CbValidateMode::All) == CbValidateError::None);
CbAttachment FromFields;
FromFields.TryLoad(Fields);
CHECK(!bool(Fields));
CHECK(FromFields == Attachment);
- CbAttachment FromArchive;
- MemoryInStream InStream(MakeMemoryView(WriteStream));
- BinaryReader Reader(InStream);
+ CbAttachment FromArchive;
+ BinaryReader Reader(MakeMemoryView(StreamWriter));
FromArchive.TryLoad(Reader);
- CHECK(Reader.CurrentOffset() == InStream.Size());
+ CHECK(Reader.CurrentOffset() == Reader.Size());
CHECK(FromArchive == Attachment);
};
@@ -956,9 +951,8 @@ TEST_CASE("usonpackage.serialization")
Package.Save(Writer);
CbFieldIterator Fields = Writer.Save();
- MemoryOutStream MemStream;
- BinaryWriter WriteAr(MemStream);
- Package.Save(WriteAr);
+ BinaryWriter MemStream;
+ Package.Save(MemStream);
CHECK(MakeMemoryView(MemStream).EqualBytes(Fields.GetRangeBuffer().GetView()));
CHECK(ValidateCompactBinaryRange(MakeMemoryView(MemStream), CbValidateMode::All) == CbValidateError::None);
@@ -969,11 +963,10 @@ TEST_CASE("usonpackage.serialization")
CHECK_FALSE(bool(Fields));
CHECK(FromFields == Package);
- CbPackage FromArchive;
- MemoryInStream ReadMemStream(MakeMemoryView(MemStream));
- BinaryReader ReadAr(ReadMemStream);
+ CbPackage FromArchive;
+ BinaryReader ReadAr(MakeMemoryView(MemStream));
FromArchive.TryLoad(ReadAr);
- CHECK(ReadAr.CurrentOffset() == ReadMemStream.Size());
+ CHECK(ReadAr.CurrentOffset() == ReadAr.Size());
CHECK(FromArchive == Package);
};
@@ -1195,12 +1188,10 @@ TEST_CASE("usonpackage.serialization")
CHECK(FieldsOuterBufferView.Contains(Level4Attachment->AsBinary().GetView()));
CHECK(Level4Attachment->GetHash() == Level4Hash);
- MemoryOutStream WriteStream;
- BinaryWriter WriteAr(WriteStream);
- Writer.Save(WriteAr);
- CbPackage FromArchive;
- MemoryInStream ReadStream(MakeMemoryView(WriteStream));
- BinaryReader ReadAr(ReadStream);
+ BinaryWriter WriteStream;
+ Writer.Save(WriteStream);
+ CbPackage FromArchive;
+ BinaryReader ReadAr(MakeMemoryView(WriteStream));
FromArchive.TryLoad(ReadAr);
Writer.Reset();
diff --git a/zencore/include/zencore/iobuffer.h b/zencore/include/zencore/iobuffer.h
index 6f3609d19..54801f9ac 100644
--- a/zencore/include/zencore/iobuffer.h
+++ b/zencore/include/zencore/iobuffer.h
@@ -28,6 +28,35 @@ enum class ZenContentType : uint8_t
kCOUNT
};
+inline std::string_view
+ToString(ZenContentType ContentType)
+{
+ using namespace std::literals;
+
+ switch (ContentType)
+ {
+ default:
+ case ZenContentType::kUnknownContentType:
+ return "unknown"sv;
+ case ZenContentType::kBinary:
+ return "binary"sv;
+ case ZenContentType::kText:
+ return "text"sv;
+ case ZenContentType::kJSON:
+ return "json"sv;
+ case ZenContentType::kCbObject:
+ return "cb-object"sv;
+ case ZenContentType::kCbPackage:
+ return "cb-package"sv;
+ case ZenContentType::kCbPackageOffer:
+ return "cb-package-offer"sv;
+ case ZenContentType::kCompressedBinary:
+ return "compressed-binary"sv;
+ case ZenContentType::kYAML:
+ return "yaml"sv;
+ }
+}
+
struct IoBufferFileReference
{
void* FileHandle;
diff --git a/zencore/include/zencore/refcount.h b/zencore/include/zencore/refcount.h
index 50bd82f59..0a1e15614 100644
--- a/zencore/include/zencore/refcount.h
+++ b/zencore/include/zencore/refcount.h
@@ -17,7 +17,7 @@ namespace zen {
class RefCounted
{
public:
- RefCounted() : m_RefCount(IsPointerToStack(this)){};
+ RefCounted() = default;
virtual ~RefCounted() = default;
inline uint32_t AddRef() const { return AtomicIncrement(const_cast<RefCounted*>(this)->m_RefCount); }
diff --git a/zencore/include/zencore/stream.h b/zencore/include/zencore/stream.h
index a0e165bdc..9d1a7628c 100644
--- a/zencore/include/zencore/stream.h
+++ b/zencore/include/zencore/stream.h
@@ -5,51 +5,30 @@
#include "zencore.h"
#include <zencore/memory.h>
-#include <zencore/refcount.h>
#include <zencore/thread.h>
-#include <string_view>
#include <vector>
namespace zen {
/**
- * Basic byte stream interface
- *
- * This is intended as a minimal base class offering only the absolute minimum of functionality.
- *
- * IMPORTANT: To better support concurrency, this abstraction offers no "file pointer". Thus
- * every read or write operation needs to specify the offset from which they wish to read.
- *
- * Most client code will likely want to use reader/writer classes like BinaryWriter/BinaryReader
- *
+ * Binary stream writer
*/
-class OutStream : public RefCounted
-{
-public:
- virtual void Write(const void* Data, size_t ByteCount, uint64_t Offset) = 0;
- virtual void Flush() = 0;
-};
-class InStream : public RefCounted
+class BinaryWriter
{
public:
- virtual void Read(void* DataPtr, size_t ByteCount, uint64_t Offset) = 0;
- virtual uint64_t Size() const = 0;
- uint64_t GetSize() const { return Size(); }
-};
+ inline BinaryWriter() = default;
+ ~BinaryWriter() = default;
-/**
- * Stream which writes into a growing memory buffer
- */
-class MemoryOutStream : public OutStream
-{
-public:
- MemoryOutStream() = default;
- ~MemoryOutStream() = default;
+ inline void Write(const void* DataPtr, size_t ByteCount)
+ {
+ Write(DataPtr, ByteCount, m_Offset);
+ m_Offset += ByteCount;
+ }
+
+ inline uint64_t CurrentOffset() const { return m_Offset; }
- virtual void Write(const void* DataPtr, size_t ByteCount, uint64_t Offset) override;
- virtual void Flush() override;
inline const uint8_t* Data() const { return m_Buffer.data(); }
inline const uint8_t* GetData() const { return m_Buffer.data(); }
inline uint64_t Size() const { return m_Buffer.size(); }
@@ -58,263 +37,45 @@ public:
private:
RwLock m_Lock;
std::vector<uint8_t> m_Buffer;
+ uint64_t m_Offset = 0;
+
+ void Write(const void* DataPtr, size_t ByteCount, uint64_t Offset);
};
inline MemoryView
-MakeMemoryView(const MemoryOutStream& Stream)
+MakeMemoryView(const BinaryWriter& Stream)
{
return MemoryView(Stream.Data(), Stream.Size());
}
/**
- * Stream which reads from a memory buffer
- */
-class MemoryInStream : public InStream
-{
-public:
- MemoryInStream(const void* Buffer, size_t Size);
- MemoryInStream(MemoryView View) : MemoryInStream(View.GetData(), View.GetSize()) {}
- ~MemoryInStream() = default;
-
- virtual void Read(void* DataPtr, size_t ByteCount, uint64_t ReadOffset) override;
- virtual uint64_t Size() const override { return m_Buffer.size(); }
- inline const uint8_t* Data() const { return m_Buffer.data(); }
- inline const uint8_t* GetData() const { return m_Buffer.data(); }
-
-private:
- RwLock m_Lock;
- std::vector<uint8_t> m_Buffer;
-};
-
-/**
- * Binary stream writer
- */
-
-class BinaryWriter
-{
-public:
- inline BinaryWriter(OutStream& Stream) : m_Stream(&Stream) {}
- ~BinaryWriter() = default;
-
- inline void Write(const void* DataPtr, size_t ByteCount)
- {
- m_Stream->Write(DataPtr, ByteCount, m_Offset);
- m_Offset += ByteCount;
- }
-
- uint64_t CurrentOffset() const { return m_Offset; }
-
-private:
- RefPtr<OutStream> m_Stream;
- uint64_t m_Offset = 0;
-};
-
-inline BinaryWriter&
-operator<<(BinaryWriter& Writer, bool Value)
-{
- Writer.Write(&Value, sizeof Value);
- return Writer;
-}
-inline BinaryWriter&
-operator<<(BinaryWriter& Writer, int8_t Value)
-{
- Writer.Write(&Value, sizeof Value);
- return Writer;
-}
-inline BinaryWriter&
-operator<<(BinaryWriter& Writer, int16_t Value)
-{
- Writer.Write(&Value, sizeof Value);
- return Writer;
-}
-inline BinaryWriter&
-operator<<(BinaryWriter& Writer, int32_t Value)
-{
- Writer.Write(&Value, sizeof Value);
- return Writer;
-}
-inline BinaryWriter&
-operator<<(BinaryWriter& Writer, int64_t Value)
-{
- Writer.Write(&Value, sizeof Value);
- return Writer;
-}
-inline BinaryWriter&
-operator<<(BinaryWriter& Writer, uint8_t Value)
-{
- Writer.Write(&Value, sizeof Value);
- return Writer;
-}
-inline BinaryWriter&
-operator<<(BinaryWriter& Writer, uint16_t Value)
-{
- Writer.Write(&Value, sizeof Value);
- return Writer;
-}
-inline BinaryWriter&
-operator<<(BinaryWriter& Writer, uint32_t Value)
-{
- Writer.Write(&Value, sizeof Value);
- return Writer;
-}
-inline BinaryWriter&
-operator<<(BinaryWriter& Writer, uint64_t Value)
-{
- Writer.Write(&Value, sizeof Value);
- return Writer;
-}
-
-/**
* Binary stream reader
*/
class BinaryReader
{
public:
- inline BinaryReader(InStream& Stream) : m_Stream(&Stream) {}
- ~BinaryReader() = default;
-
- inline void Read(void* DataPtr, size_t ByteCount)
+ inline BinaryReader(const void* Buffer, uint64_t Size) : m_BufferBase(reinterpret_cast<const uint8_t*>(Buffer)), m_BufferSize(Size) {}
+ inline BinaryReader(MemoryView Buffer)
+ : m_BufferBase(reinterpret_cast<const uint8_t*>(Buffer.GetData()))
+ , m_BufferSize(Buffer.GetSize())
{
- m_Stream->Read(DataPtr, ByteCount, m_Offset);
- m_Offset += ByteCount;
}
- void Seek(uint64_t Offset)
- {
- ZEN_ASSERT(Offset <= m_Stream->Size());
- m_Offset = Offset;
- }
-
- void Skip(uint64_t SkipOffset)
+ inline void Read(void* DataPtr, size_t ByteCount)
{
- ZEN_ASSERT((m_Offset + SkipOffset) <= m_Stream->Size());
- m_Offset += SkipOffset;
+ memcpy(DataPtr, m_BufferBase + m_Offset, ByteCount);
+ m_Offset += ByteCount;
}
+ inline uint64_t Size() const { return m_BufferSize; }
+ inline uint64_t GetSize() const { return Size(); }
inline uint64_t CurrentOffset() const { return m_Offset; }
- inline uint64_t AvailableBytes() const { return m_Stream->Size() - m_Offset; }
-
-private:
- RefPtr<InStream> m_Stream;
- uint64_t m_Offset = 0;
-};
-
-inline BinaryReader&
-operator>>(BinaryReader& Reader, bool& Value)
-{
- Reader.Read(&Value, sizeof Value);
- return Reader;
-}
-inline BinaryReader&
-operator>>(BinaryReader& Reader, int8_t& Value)
-{
- Reader.Read(&Value, sizeof Value);
- return Reader;
-}
-inline BinaryReader&
-operator>>(BinaryReader& Reader, int16_t& Value)
-{
- Reader.Read(&Value, sizeof Value);
- return Reader;
-}
-inline BinaryReader&
-operator>>(BinaryReader& Reader, int32_t& Value)
-{
- Reader.Read(&Value, sizeof Value);
- return Reader;
-}
-inline BinaryReader&
-operator>>(BinaryReader& Reader, int64_t& Value)
-{
- Reader.Read(&Value, sizeof Value);
- return Reader;
-}
-inline BinaryReader&
-operator>>(BinaryReader& Reader, uint8_t& Value)
-{
- Reader.Read(&Value, sizeof Value);
- return Reader;
-}
-inline BinaryReader&
-operator>>(BinaryReader& Reader, uint16_t& Value)
-{
- Reader.Read(&Value, sizeof Value);
- return Reader;
-}
-inline BinaryReader&
-operator>>(BinaryReader& Reader, uint32_t& Value)
-{
- Reader.Read(&Value, sizeof Value);
- return Reader;
-}
-inline BinaryReader&
-operator>>(BinaryReader& Reader, uint64_t& Value)
-{
- Reader.Read(&Value, sizeof Value);
- return Reader;
-}
-
-/**
- * Text stream writer
- */
-
-class TextWriter
-{
-public:
- ZENCORE_API TextWriter(OutStream& Stream);
- ZENCORE_API ~TextWriter();
-
- ZENCORE_API virtual void Write(const void* DataPtr, size_t ByteCount);
- ZENCORE_API void Writef(const char* FormatString, ...);
-
- inline uint64_t CurrentOffset() const { return m_CurrentOffset; }
-
-private:
- RefPtr<OutStream> m_Stream;
- uint64_t m_CurrentOffset = 0;
-};
-
-ZENCORE_API TextWriter& operator<<(TextWriter& Writer, const char* Value);
-ZENCORE_API TextWriter& operator<<(TextWriter& Writer, const std::string_view& Value);
-ZENCORE_API TextWriter& operator<<(TextWriter& Writer, bool Value);
-ZENCORE_API TextWriter& operator<<(TextWriter& Writer, int8_t Value);
-ZENCORE_API TextWriter& operator<<(TextWriter& Writer, int16_t Value);
-ZENCORE_API TextWriter& operator<<(TextWriter& Writer, int32_t Value);
-ZENCORE_API TextWriter& operator<<(TextWriter& Writer, int64_t Value);
-ZENCORE_API TextWriter& operator<<(TextWriter& Writer, uint8_t Value);
-ZENCORE_API TextWriter& operator<<(TextWriter& Writer, uint16_t Value);
-ZENCORE_API TextWriter& operator<<(TextWriter& Writer, uint32_t Value);
-ZENCORE_API TextWriter& operator<<(TextWriter& Writer, uint64_t Value);
-
-class IndentTextWriter : public TextWriter
-{
-public:
- ZENCORE_API IndentTextWriter(OutStream& stream);
- ZENCORE_API ~IndentTextWriter();
-
- ZENCORE_API virtual void Write(const void* DataPtr, size_t ByteCount) override;
-
- inline void Indent(int Amount) { m_IndentAmount += Amount; }
-
- struct Scope
- {
- Scope(IndentTextWriter& Outer, int IndentAmount = 2) : m_Outer(Outer), m_IndentAmount(IndentAmount)
- {
- m_Outer.Indent(IndentAmount);
- }
-
- ~Scope() { m_Outer.Indent(-m_IndentAmount); }
-
- private:
- IndentTextWriter& m_Outer;
- int m_IndentAmount;
- };
private:
- int m_IndentAmount = 0;
- int m_LineCursor = 0;
- char m_LineBuffer[2048];
+ const uint8_t* m_BufferBase;
+ uint64_t m_BufferSize;
+ uint64_t m_Offset = 0;
};
void stream_forcelink(); // internal
diff --git a/zencore/include/zencore/streamutil.h b/zencore/include/zencore/streamutil.h
deleted file mode 100644
index 190cd18eb..000000000
--- a/zencore/include/zencore/streamutil.h
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright Epic Games, Inc. All Rights Reserved.
-
-#pragma once
-
-#include <fmt/format.h>
-#include <zencore/string.h>
-#include <string>
-#include <string_view>
-
-#include "blake3.h"
-#include "iohash.h"
-#include "sha1.h"
-#include "stream.h"
-
-namespace zen {
-
-ZENCORE_API BinaryWriter& operator<<(BinaryWriter& writer, const std::string_view& value);
-ZENCORE_API BinaryReader& operator>>(BinaryReader& reader, std::string& value);
-
-ZENCORE_API BinaryWriter& operator<<(BinaryWriter& writer, const std::wstring_view& value);
-ZENCORE_API BinaryReader& operator>>(BinaryReader& reader, std::wstring& value);
-ZENCORE_API TextWriter& operator<<(TextWriter& writer, const std::wstring_view& value);
-
-inline BinaryWriter&
-operator<<(BinaryWriter& writer, const SHA1& value)
-{
- writer.Write(value.Hash, sizeof value.Hash);
- return writer;
-}
-inline BinaryReader&
-operator>>(BinaryReader& reader, SHA1& value)
-{
- reader.Read(value.Hash, sizeof value.Hash);
- return reader;
-}
-ZENCORE_API TextWriter& operator<<(TextWriter& writer, const zen::SHA1& value);
-
-inline BinaryWriter&
-operator<<(BinaryWriter& writer, const BLAKE3& value)
-{
- writer.Write(value.Hash, sizeof value.Hash);
- return writer;
-}
-inline BinaryReader&
-operator>>(BinaryReader& reader, BLAKE3& value)
-{
- reader.Read(value.Hash, sizeof value.Hash);
- return reader;
-}
-ZENCORE_API TextWriter& operator<<(TextWriter& writer, const BLAKE3& value);
-
-inline BinaryWriter&
-operator<<(BinaryWriter& writer, const IoHash& value)
-{
- writer.Write(value.Hash, sizeof value.Hash);
- return writer;
-}
-inline BinaryReader&
-operator>>(BinaryReader& reader, IoHash& value)
-{
- reader.Read(value.Hash, sizeof value.Hash);
- return reader;
-}
-ZENCORE_API TextWriter& operator<<(TextWriter& writer, const IoHash& value);
-
-} // namespace zen
-
-//////////////////////////////////////////////////////////////////////////
-
-template<>
-struct fmt::formatter<zen::IoHash>
-{
- constexpr auto parse(format_parse_context& ctx)
- {
- // Parse the presentation format and store it in the formatter:
- auto it = ctx.begin(), end = ctx.end();
-
- // Check if reached the end of the range:
- if (it != end && *it != '}')
- throw format_error("invalid format");
-
- // Return an iterator past the end of the parsed range:
- return it;
- }
-
- template<typename FormatContext>
- auto format(const zen::IoHash& h, FormatContext& ctx)
- {
- zen::ExtendableStringBuilder<48> String;
- h.ToHexString(String);
- return format_to(ctx.out(), std::string_view(String));
- }
-};
-
-template<>
-struct fmt::formatter<zen::BLAKE3>
-{
- constexpr auto parse(format_parse_context& ctx)
- {
- // Parse the presentation format and store it in the formatter:
- auto it = ctx.begin(), end = ctx.end();
-
- // Check if reached the end of the range:
- if (it != end && *it != '}')
- throw format_error("invalid format");
-
- // Return an iterator past the end of the parsed range:
- return it;
- }
-
- template<typename FormatContext>
- auto format(const zen::BLAKE3& h, FormatContext& ctx)
- {
- zen::ExtendableStringBuilder<80> String;
- h.ToHexString(String);
- return format_to(ctx.out(), std::string_view(String));
- }
-};
diff --git a/zencore/include/zencore/zencore.h b/zencore/include/zencore/zencore.h
index 4b9c1af1b..136ed2944 100644
--- a/zencore/include/zencore/zencore.h
+++ b/zencore/include/zencore/zencore.h
@@ -112,7 +112,7 @@
#if ZEN_ARCH_ARM64
// On ARM we can't do this because the executable will require jumps larger
// than the branch instruction can handle. Clang will only generate
-// the trampolines in the .text segment of the binary. If the uedbg segment
+// the trampolines in the .text segment of the binary. If the zcold segment
// is present it will generate code that it cannot link.
# define ZEN_DEBUG_SECTION
#else
@@ -121,7 +121,7 @@
// it well off the hot path and hopefully out of the instruction cache. It also
// facilitates reasoning about the makeup of a compiled/linked binary.
# define ZEN_DEBUG_SECTION ZEN_CODE_SECTION(".zcold")
-#endif // DO_CHECK || DO_GUARD_SLOW
+#endif
namespace zen {
@@ -194,16 +194,18 @@ char (&ZenArrayCountHelper(const T (&)[N]))[N + 1];
namespace zen {
-ZENCORE_API bool IsPointerToStack(const void* ptr); // Query if pointer is within the stack of the currently executing thread
ZENCORE_API bool IsApplicationExitRequested();
ZENCORE_API void RequestApplicationExit(int ExitCode);
ZENCORE_API bool IsDebuggerPresent();
+ZENCORE_API void SetIsInteractiveSession(bool Value);
ZENCORE_API bool IsInteractiveSession();
ZENCORE_API void zencore_forcelinktests();
} // namespace zen
+//////////////////////////////////////////////////////////////////////////
+
#ifndef ZEN_USE_MIMALLOC
# define ZEN_USE_MIMALLOC 1
#endif
diff --git a/zencore/stream.cpp b/zencore/stream.cpp
index ead0b014b..aa9705764 100644
--- a/zencore/stream.cpp
+++ b/zencore/stream.cpp
@@ -10,269 +10,19 @@
namespace zen {
-MemoryInStream::MemoryInStream(const void* buffer, size_t size)
-: m_Buffer(reinterpret_cast<const uint8_t*>(buffer), reinterpret_cast<const uint8_t*>(buffer) + size)
-{
-}
-
void
-MemoryInStream::Read(void* buffer, size_t byteCount, uint64_t offset)
+BinaryWriter::Write(const void* data, size_t ByteCount, uint64_t Offset)
{
RwLock::ExclusiveLockScope _(m_Lock);
- const size_t needEnd = offset + byteCount;
-
- if (needEnd > m_Buffer.size())
- throw std::runtime_error("read past end of file!"); // TODO: better exception
-
- memcpy(buffer, m_Buffer.data() + offset, byteCount);
-}
-
-void
-MemoryOutStream::Write(const void* data, size_t byteCount, uint64_t offset)
-{
- RwLock::ExclusiveLockScope _(m_Lock);
-
- const size_t needEnd = offset + byteCount;
-
- if (needEnd > m_Buffer.size())
- m_Buffer.resize(needEnd);
-
- memcpy(m_Buffer.data() + offset, data, byteCount);
-}
-
-void
-MemoryOutStream::Flush()
-{
- // No-op
-}
-
-//////////////////////////////////////////////////////////////////////////
-
-TextWriter::TextWriter(OutStream& stream) : m_Stream(&stream)
-{
-}
-
-TextWriter::~TextWriter() = default;
-
-void
-TextWriter::Write(const void* data, size_t byteCount)
-{
- m_Stream->Write(data, byteCount, m_CurrentOffset);
- m_CurrentOffset += byteCount;
-}
-
-TextWriter&
-operator<<(TextWriter& Writer, const char* value)
-{
- if (value)
- Writer.Write(value, strlen(value));
- else
- Writer.Write("(null)", 6);
-
- return Writer;
-}
-
-TextWriter&
-operator<<(TextWriter& writer, const std::string_view& value)
-{
- writer.Write(value.data(), value.size());
-
- return writer;
-}
-
-TextWriter&
-operator<<(TextWriter& writer, bool value)
-{
- if (value)
- writer.Write("true", 4);
- else
- writer.Write("false", 5);
-
- return writer;
-}
-
-TextWriter&
-operator<<(TextWriter& writer, int8_t value)
-{
- char buffer[16];
-#if ZEN_PLATFORM_WINDOWS
- _itoa_s(value, buffer, 10);
-#else
- sprintf(buffer, "%d", value);
-#endif
- writer << buffer;
- return writer;
-}
-
-TextWriter&
-operator<<(TextWriter& writer, int16_t value)
-{
- char buffer[16];
-#if ZEN_PLATFORM_WINDOWS
- _itoa_s(value, buffer, 10);
-#else
- sprintf(buffer, "%d", value);
-#endif
- writer << buffer;
- return writer;
-}
-
-TextWriter&
-operator<<(TextWriter& writer, int32_t value)
-{
- char buffer[16];
-#if ZEN_PLATFORM_WINDOWS
- _itoa_s(value, buffer, 10);
-#else
- sprintf(buffer, "%d", value);
-#endif
- writer << buffer;
- return writer;
-}
-
-TextWriter&
-operator<<(TextWriter& writer, int64_t value)
-{
- char buffer[32];
-#if ZEN_PLATFORM_WINDOWS
- _i64toa_s(value, buffer, sizeof buffer, 10);
-#else
- sprintf(buffer, "%" PRId64, value);
-#endif
- writer << buffer;
- return writer;
-}
-
-TextWriter&
-operator<<(TextWriter& writer, uint8_t value)
-{
- char buffer[16];
-#if ZEN_PLATFORM_WINDOWS
- _ultoa_s(value, buffer, 10);
-#else
- sprintf(buffer, "%u", value);
-#endif
- writer << buffer;
- return writer;
-}
-
-TextWriter&
-operator<<(TextWriter& writer, uint16_t value)
-{
- char buffer[16];
-#if ZEN_PLATFORM_WINDOWS
- _ultoa_s(value, buffer, 10);
-#else
- sprintf(buffer, "%u", value);
-#endif
- writer << buffer;
- return writer;
-}
-
-TextWriter&
-operator<<(TextWriter& writer, uint32_t value)
-{
- char buffer[16];
-#if ZEN_PLATFORM_WINDOWS
- _ultoa_s(value, buffer, 10);
-#else
- sprintf(buffer, "%u", value);
-#endif
- writer << buffer;
- return writer;
-}
-
-TextWriter&
-operator<<(TextWriter& writer, uint64_t value)
-{
- char buffer[32];
-#if ZEN_PLATFORM_WINDOWS
- _ui64toa_s(value, buffer, sizeof buffer, 10);
-#else
- sprintf(buffer, "%" PRIu64, value);
-#endif
- writer << buffer;
- return writer;
-}
-
-void
-TextWriter::Writef(const char* formatString, ...)
-{
- va_list args;
- va_start(args, formatString);
-
- char* tempBuffer = nullptr;
- char buffer[4096];
- int rv = vsnprintf(buffer, sizeof buffer, formatString, args);
-
- ZEN_ASSERT(rv >= 0);
-
- if (uint32_t(rv) > sizeof buffer)
- {
- // Need more room -- allocate temporary buffer
-
- tempBuffer = (char*)Memory::Alloc(rv + 1, 8);
-
- int rv2 = vsnprintf(tempBuffer, rv + 1, formatString, args);
-
- ZEN_ASSERT(rv >= 0);
- ZEN_ASSERT(rv2 <= rv);
-
- rv = rv2;
- }
-
- m_Stream->Write(tempBuffer ? tempBuffer : buffer, rv, m_CurrentOffset);
- m_CurrentOffset += rv;
-
- if (tempBuffer)
- Memory::Free(tempBuffer);
-
- va_end(args);
-}
-
-//////////////////////////////////////////////////////////////////////////
-
-IndentTextWriter::IndentTextWriter(OutStream& stream) : TextWriter(stream)
-{
-}
-
-IndentTextWriter::~IndentTextWriter()
-{
-}
+ const size_t NeedEnd = Offset + ByteCount;
-void
-IndentTextWriter::Write(const void* data, size_t byteCount)
-{
- const uint8_t* src = reinterpret_cast<const uint8_t*>(data);
- int cur = m_LineCursor;
-
- while (byteCount)
+ if (NeedEnd > m_Buffer.size())
{
- char c = *src++;
-
- if (cur == 0)
- {
- const char indentSpaces[] =
- " "
- " ";
-
- cur = std::min<int>(m_IndentAmount, sizeof indentSpaces - 1);
- memcpy(m_LineBuffer, indentSpaces, cur);
- }
-
- m_LineBuffer[cur++] = c;
- --byteCount;
-
- if (c == '\n' || cur == sizeof m_LineBuffer)
- {
- TextWriter::Write(m_LineBuffer, cur);
-
- cur = 0;
- }
+ m_Buffer.resize(NeedEnd);
}
- m_LineCursor = cur;
+ memcpy(m_Buffer.data() + Offset, data, ByteCount);
}
//////////////////////////////////////////////////////////////////////////
@@ -287,58 +37,6 @@ stream_forcelink()
{
}
-TEST_CASE("BinaryWriter and BinaryWriter")
-{
- MemoryOutStream stream;
- BinaryWriter writer(stream);
-
- CHECK(writer.CurrentOffset() == 0);
-
- writer.Write("foo!", 4);
- CHECK(writer.CurrentOffset() == 4);
-
- writer << uint8_t(42) << uint16_t(42) << uint32_t(42) << uint64_t(42);
- writer << int8_t(42) << int16_t(42) << int32_t(42) << int64_t(42);
-
- CHECK(writer.CurrentOffset() == (4 + 15 * 2));
-
- // Read the data back
-
- MemoryInStream instream(stream.Data(), stream.Size());
- BinaryReader reader(instream);
- CHECK(reader.CurrentOffset() == 0);
-
- char buffer[4];
- reader.Read(buffer, 4);
- CHECK(reader.CurrentOffset() == 4);
-
- CHECK(memcmp(buffer, "foo!", 4) == 0);
-
- uint8_t ui8 = 0;
- uint16_t ui16 = 0;
- uint32_t ui32 = 0;
- uint64_t ui64 = 0;
- int8_t i8 = 0;
- int16_t i16 = 0;
- int32_t i32 = 0;
- int64_t i64 = 0;
-
- reader >> ui8 >> ui16 >> ui32 >> ui64;
- reader >> i8 >> i16 >> i32 >> i64;
-
- CHECK(reader.CurrentOffset() == (4 + 15 * 2));
-
- CHECK(ui8 == 42);
- CHECK(ui16 == 42);
- CHECK(ui32 == 42);
- CHECK(ui64 == 42);
-
- CHECK(i8 == 42);
- CHECK(i16 == 42);
- CHECK(i32 == 42);
- CHECK(i64 == 42);
-}
-
#endif
} // namespace zen
diff --git a/zencore/streamutil.cpp b/zencore/streamutil.cpp
deleted file mode 100644
index d3ed5ceaa..000000000
--- a/zencore/streamutil.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright Epic Games, Inc. All Rights Reserved.
-
-#include <zencore/streamutil.h>
-#include <zencore/string.h>
-
-namespace zen {
-
-BinaryWriter&
-operator<<(BinaryWriter& writer, const std::string_view& value)
-{
- writer.Write(value.data(), value.size());
- writer << uint8_t(0);
-
- return writer;
-}
-
-BinaryReader&
-operator>>(BinaryReader& reader, std::string& value)
-{
- for (;;)
- {
- uint8_t x;
- reader.Read(&x, 1);
-
- if (x == 0)
- return reader;
-
- value.push_back(char(x));
- }
-}
-
-BinaryWriter&
-operator<<(BinaryWriter& writer, const std::wstring_view& value)
-{
- // write as utf8
-
- ExtendableStringBuilder<128> utf8;
- WideToUtf8(value, utf8);
-
- writer.Write(utf8.c_str(), utf8.Size() + 1);
-
- return writer;
-}
-
-BinaryReader&
-operator>>(BinaryReader& reader, std::wstring& value)
-{
- // read as utf8
-
- std::string v8;
- reader >> v8;
-
- ExtendableWideStringBuilder<128> wstr;
- Utf8ToWide(v8, wstr);
-
- value = wstr.c_str();
-
- return reader;
-}
-
-TextWriter&
-operator<<(TextWriter& writer, const zen::SHA1& value)
-{
- zen::SHA1::String_t buffer;
- value.ToHexString(buffer);
-
- writer.Write(buffer, zen::SHA1::StringLength);
-
- return writer;
-}
-
-TextWriter&
-operator<<(TextWriter& writer, const zen::BLAKE3& value)
-{
- zen::BLAKE3::String_t buffer;
- value.ToHexString(buffer);
-
- writer.Write(buffer, zen::BLAKE3::StringLength);
-
- return writer;
-}
-
-TextWriter&
-operator<<(TextWriter& writer, const zen::IoHash& value)
-{
- zen::IoHash::String_t buffer;
- value.ToHexString(buffer);
-
- writer.Write(buffer, zen::IoHash::StringLength);
-
- return writer;
-}
-
-TextWriter&
-operator<<(TextWriter& writer, const std::wstring_view& value)
-{
- ExtendableStringBuilder<128> v8;
- WideToUtf8(value, v8);
-
- writer.Write(v8.c_str(), v8.Size());
- return writer;
-}
-
-} // namespace zen
diff --git a/zencore/uid.cpp b/zencore/uid.cpp
index d4b708288..86cdfae3a 100644
--- a/zencore/uid.cpp
+++ b/zencore/uid.cpp
@@ -99,11 +99,10 @@ Oid::ToString(char OutString[StringLength])
StringBuilderBase&
Oid::ToString(StringBuilderBase& OutString) const
{
- char str[StringLength + 1];
- ToHexBytes(reinterpret_cast<const uint8_t*>(OidBits), sizeof(Oid::OidBits), str);
- str[2 * sizeof(Oid)] = '\0';
+ String_t Str;
+ ToHexBytes(reinterpret_cast<const uint8_t*>(OidBits), sizeof(Oid::OidBits), Str);
- OutString.AppendRange(str, &str[25]);
+ OutString.AppendRange(Str, &Str[StringLength]);
return OutString;
}
diff --git a/zencore/zencore.cpp b/zencore/zencore.cpp
index 3eb43c558..19acdd1f5 100644
--- a/zencore/zencore.cpp
+++ b/zencore/zencore.cpp
@@ -35,31 +35,6 @@ namespace zen {
//////////////////////////////////////////////////////////////////////////
bool
-IsPointerToStack(const void* ptr)
-{
-#if ZEN_PLATFORM_WINDOWS
- ULONG_PTR low, high;
- GetCurrentThreadStackLimits(&low, &high);
-
- const uintptr_t intPtr = reinterpret_cast<uintptr_t>(ptr);
-
- return (intPtr - low) < (high - low);
-#elif ZEN_PLATFORM_LINUX
- pthread_t self = pthread_self();
-
- pthread_attr_t attr;
- pthread_getattr_np(self, &attr);
-
- void* low;
- size_t size;
- pthread_attr_getstack(&attr, &low, &size);
-
- return (uintptr_t(ptr) - uintptr_t(low)) < uintptr_t(size);
-#elif 0
-#endif
-}
-
-bool
IsDebuggerPresent()
{
#if ZEN_PLATFORM_WINDOWS
@@ -69,21 +44,36 @@ IsDebuggerPresent()
#endif
}
+std::optional<bool> InteractiveSessionFlag;
+
+void
+SetIsInteractiveSession(bool Value)
+{
+ InteractiveSessionFlag = Value;
+}
+
bool
IsInteractiveSession()
{
-#if ZEN_PLATFORM_WINDOWS
- DWORD dwSessionId = 0;
- if (ProcessIdToSessionId(GetCurrentProcessId(), &dwSessionId))
+ if (!InteractiveSessionFlag.has_value())
{
- return (dwSessionId != 0);
- }
-
- return false;
+#if ZEN_PLATFORM_WINDOWS
+ DWORD dwSessionId = 0;
+ if (ProcessIdToSessionId(GetCurrentProcessId(), &dwSessionId))
+ {
+ InteractiveSessionFlag = (dwSessionId != 0);
+ }
+ else
+ {
+ InteractiveSessionFlag = false;
+ }
#else
- // TODO: figure out what makes sense here
- return true;
+ // TODO: figure out what actually makes sense here
+ InteractiveSessionFlag = true;
#endif
+ }
+
+ return InteractiveSessionFlag.value();
}
//////////////////////////////////////////////////////////////////////////
diff --git a/zencore/zencore.vcxproj b/zencore/zencore.vcxproj
index 3adf779ed..421802d3f 100644
--- a/zencore/zencore.vcxproj
+++ b/zencore/zencore.vcxproj
@@ -115,6 +115,7 @@
<ClInclude Include="include\zencore\atomic.h" />
<ClInclude Include="include\zencore\base64.h" />
<ClInclude Include="include\zencore\blake3.h" />
+ <ClInclude Include="include\zencore\compactbinaryvalue.h" />
<ClInclude Include="include\zencore\compositebuffer.h" />
<ClInclude Include="include\zencore\crc32.h" />
<ClInclude Include="include\zencore\endian.h" />
@@ -140,7 +141,6 @@
<ClInclude Include="include\zencore\sharedbuffer.h" />
<ClInclude Include="include\zencore\stats.h" />
<ClInclude Include="include\zencore\stream.h" />
- <ClInclude Include="include\zencore\streamutil.h" />
<ClInclude Include="include\zencore\string.h" />
<ClInclude Include="include\zencore\targetver.h" />
<ClInclude Include="include\zencore\testing.h" />
@@ -183,7 +183,6 @@
<ClCompile Include="sharedbuffer.cpp" />
<ClCompile Include="stats.cpp" />
<ClCompile Include="stream.cpp" />
- <ClCompile Include="streamutil.cpp" />
<ClCompile Include="string.cpp" />
<ClCompile Include="testutils.cpp" />
<ClCompile Include="thread.cpp" />
diff --git a/zencore/zencore.vcxproj.filters b/zencore/zencore.vcxproj.filters
index 92aa0db1d..e701e9354 100644
--- a/zencore/zencore.vcxproj.filters
+++ b/zencore/zencore.vcxproj.filters
@@ -12,7 +12,6 @@
<ClInclude Include="include\zencore\timer.h" />
<ClInclude Include="include\zencore\thread.h" />
<ClInclude Include="include\zencore\string.h" />
- <ClInclude Include="include\zencore\streamutil.h" />
<ClInclude Include="include\zencore\stream.h" />
<ClInclude Include="include\zencore\stats.h" />
<ClInclude Include="include\zencore\blake3.h" />
@@ -45,6 +44,7 @@
<ClInclude Include="include\zencore\testing.h" />
<ClInclude Include="include\zencore\mpscqueue.h" />
<ClInclude Include="include\zencore\base64.h" />
+ <ClInclude Include="include\zencore\compactbinaryvalue.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="sha1.cpp" />
@@ -57,7 +57,6 @@
<ClCompile Include="refcount.cpp" />
<ClCompile Include="stats.cpp" />
<ClCompile Include="stream.cpp" />
- <ClCompile Include="streamutil.cpp" />
<ClCompile Include="string.cpp" />
<ClCompile Include="thread.cpp" />
<ClCompile Include="timer.cpp" />