// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #pragma once #include "Engine/Core/NonCopyable.h" #include "Engine/Core/Formatting.h" #include "Engine/Core/Types/String.h" #include "Engine/Core/Types/StringView.h" #include "Engine/Serialization/MemoryWriteStream.h" /// /// Useful tool to write many text data /// template class TextWriter : public Object, public NonCopyable { private: MemoryWriteStream _buffer; public: /// /// Init with default capacity /// /// Initial capacity in bytes TextWriter(uint32 capacity = 1024) : _buffer(capacity) { } /// /// Destructor /// ~TextWriter() { } public: /// /// Gets writer private buffer. /// FORCE_INLINE MemoryWriteStream* GetBuffer() { return &_buffer; } /// /// Gets writer private buffer. /// FORCE_INLINE const MemoryWriteStream* GetBuffer() const { return &_buffer; } public: /// /// Write line terminator sign /// template typename std::enable_if::value, void>::type WriteLine() { _buffer.WriteChar('\n'); } /// /// Write line terminator sign /// template typename std::enable_if::value, void>::type WriteLine() { _buffer.WriteUint16(TEXT('\n')); } /// /// Write single line of text to the buffer /// /// Data void WriteLine(const CharType* text) { _buffer.WriteBytes((void*)text, StringUtils::Length(text) * sizeof(CharType)); WriteLine(); } /// /// Format text and write line to the buffer /// template void WriteLine(const CharType* format, const Args& ... args) { fmt::basic_memory_buffer> w; fmt_flax::format(w, format, args...); const int32 len = (int32)w.size(); _buffer.WriteBytes((void*)w.data(), len * sizeof(CharType)); WriteLine(); } /// /// Write text to the buffer /// /// Data void Write(const StringViewBase& text) { _buffer.WriteBytes((void*)text.Get(), text.Length() * sizeof(CharType)); } /// /// Write text to the buffer /// /// Data void Write(const StringBase& text) { _buffer.WriteBytes((void*)text.Get(), text.Length() * sizeof(CharType)); } /// /// Write text to the buffer /// /// Data void Write(const CharType* text) { _buffer.WriteBytes((void*)text, StringUtils::Length(text) * sizeof(CharType)); } /// /// Format text and write it /// template void Write(const CharType* format, const Args& ... args) { fmt::basic_memory_buffer> w; fmt_flax::format(w, format, args...); const int32 len = (int32)w.size(); _buffer.WriteBytes((void*)w.data(), len * sizeof(CharType)); } public: /// /// Clear whole data /// void Clear() { _buffer.SetPosition(0); } public: // [Object] String ToString() const override { return String((CharType*)_buffer.GetHandle(), _buffer.GetPosition() / sizeof(CharType)); } }; typedef TextWriter TextWriterANSI; typedef TextWriter TextWriterUnicode;