diff options
Diffstat (limited to 'zencore')
| -rw-r--r-- | zencore/compactbinarypackage.cpp | 47 | ||||
| -rw-r--r-- | zencore/include/zencore/iobuffer.h | 29 | ||||
| -rw-r--r-- | zencore/include/zencore/refcount.h | 2 | ||||
| -rw-r--r-- | zencore/include/zencore/stream.h | 293 | ||||
| -rw-r--r-- | zencore/include/zencore/streamutil.h | 118 | ||||
| -rw-r--r-- | zencore/include/zencore/zencore.h | 8 | ||||
| -rw-r--r-- | zencore/stream.cpp | 312 | ||||
| -rw-r--r-- | zencore/streamutil.cpp | 104 | ||||
| -rw-r--r-- | zencore/uid.cpp | 7 | ||||
| -rw-r--r-- | zencore/zencore.cpp | 58 | ||||
| -rw-r--r-- | zencore/zencore.vcxproj | 3 | ||||
| -rw-r--r-- | zencore/zencore.vcxproj.filters | 3 |
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" /> |