// 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;