3 #include "Core/Exceptions.h"
4 #include "IO/Buffer/Buffer.h"
5 #include "Core/CharArray/CharArray.h"
47 : m_pBuffer(nullptr), m_nSize(0), m_nAllocatedSize(0) {
64 this->
operator=(std::move(i_oWriteStream));
92 void push(
const void *i_pBuffer,
size_t i_nSize);
97 if (i_oStream.
size() > 0) {
104 void push(
const char *i_szString) {
105 return this->
push(i_szString, strlen(i_szString));
111 void push(
const std::string &i_oString,
const bool i_fZeroTerminated =
true) {
112 if (!i_oString.empty()) {
113 return this->
push(i_oString.c_str(), i_oString.size() + (i_fZeroTerminated));
120 void push(
const std::wstring &i_oString,
const bool i_fZeroTerminated =
true) {
121 if (!i_oString.empty()) {
122 return this->
push(i_oString.c_str(), i_oString.size() * 2 + (i_fZeroTerminated * 2));
129 template<
typename T,
typename std::enable_if_t<std::is_arithmetic_v<T>> * =
nullptr>
133 *
reinterpret_cast<T *
>((this->m_pBuffer + this->m_nSize)) = i_oValue;
134 this->m_nSize +=
sizeof(T);
140 template<
typename T,
typename std::enable_if_t<std::is_enum_v<T>> * =
nullptr>
144 *
reinterpret_cast<T *
>((this->m_pBuffer + this->m_nSize)) = i_oValue;
145 this->m_nSize +=
sizeof(T);
152 template<
size_t TSize>
162 void replace(
const size_t i_nPosition,
const void *i_pBuffer,
const size_t i_nSize)
const {
163 if (this->m_nSize >= i_nPosition + i_nSize) {
164 memcpy(this->m_pBuffer + i_nPosition, i_pBuffer, i_nSize);
166 throw IndexOutOfRangeException;
174 if (i_oStream.
size() > 0) {
182 void replace(
const size_t i_nPosition,
const char *i_szString)
const {
183 return this->
replace(i_nPosition, i_szString, strlen(i_szString));
189 void replace(
const size_t i_nPosition,
const std::string &i_oString)
const {
190 return this->
replace(i_nPosition, i_oString.c_str(), i_oString.size());
197 template<
typename T,
typename std::enable_if_t<std::is_arithmetic_v<T>> * =
nullptr>
198 void replace(
const size_t i_nPosition,
const T &i_oValue) {
199 if (this->m_nSize >= i_nPosition +
sizeof(T)) {
200 *
reinterpret_cast<T *
>((this->m_pBuffer + i_nPosition)) = i_oValue;
202 throw IndexOutOfRangeException;
210 template<
typename T,
typename std::enable_if_t<std::is_enum_v<T>> * =
nullptr>
211 void replace(
const size_t i_nPosition,
const T &i_oValue) {
212 if (this->m_nSize >= i_nPosition +
sizeof(T)) {
213 *
reinterpret_cast<T *
>((this->m_pBuffer + i_nPosition)) = i_oValue;
215 throw IndexOutOfRangeException;
223 return this->m_nAllocatedSize;
228 [[nodiscard]]
size_t size()
const {
229 return this->m_nSize;
234 [[nodiscard]]
const char *
buffer()
const {
235 return this->m_pBuffer;
244 this->
push(i_oOther.m_pBuffer, i_oOther.m_nSize);
252 this->deleteBuffer();
254 this->m_pBuffer = i_oOther.m_pBuffer;
255 this->m_nAllocatedSize = i_oOther.m_nAllocatedSize;
256 this->m_nSize = i_oOther.m_nSize;
258 i_oOther.m_pBuffer =
nullptr;
259 i_oOther.m_nAllocatedSize = 0;
260 i_oOther.m_nSize = 0;
274 size_t m_nAllocatedSize{};
A class for representing and manipulating a character array.
Definition: CharArray.h:41
char * begin()
Definition: CharArray.h:122
static constexpr size_t maxLength()
Definition: CharArray.h:153
size_t length() const
Definition: CharArray.h:148
A class for writing data to a buffer. This class provides functionality to write data to a buffer....
Definition: WriteStream.h:42
CWriteStream(const CWriteStream &i_oOther)
Copy constructor.
Definition: WriteStream.h:59
CWriteStream & operator=(CWriteStream &&i_oOther) noexcept
Move assignment operator.
Definition: WriteStream.h:251
void push(const void *i_pBuffer, size_t i_nSize)
Pushes the specified data to the buffer.
Definition: WriteStream.cpp:30
const char * buffer() const
Gets a const pointer to the buffer.
Definition: WriteStream.h:234
size_t allocatedSize() const
Gets the allocated size of the buffer.
Definition: WriteStream.h:222
void clear()
Clears the stream by setting the size to 0.
Definition: WriteStream.h:80
void replace(const size_t i_nPosition, const char *i_szString) const
Replaces a portion of the buffer with a null-terminated string.
Definition: WriteStream.h:182
void replace(const size_t i_nPosition, const void *i_pBuffer, const size_t i_nSize) const
Replaces a portion of the buffer with the specified data.
Definition: WriteStream.h:162
void replace(const size_t i_nPosition, const std::string &i_oString) const
Replaces a portion of the buffer with a std::string.
Definition: WriteStream.h:189
void push(const CWriteStream &i_oStream)
Pushes the data from another CWriteStream to the buffer.
Definition: WriteStream.h:96
CWriteStream(const size_t i_nSize)
Constructor with initial size.
Definition: WriteStream.h:52
size_t size() const
Gets the current size of the buffer.
Definition: WriteStream.h:228
void push(const char *i_szString)
Pushes a null-terminated string to the buffer.
Definition: WriteStream.h:104
void replace(const size_t i_nPosition, const T &i_oValue)
Replaces a portion of the buffer with a numeric value.
Definition: WriteStream.h:198
void replace(const size_t i_nPosition, const CWriteStream &i_oStream) const
Replaces a portion of the buffer with the data from another CWriteStream.
Definition: WriteStream.h:173
void push(const std::wstring &i_oString, const bool i_fZeroTerminated=true)
Pushes a std::wstring to the buffer.
Definition: WriteStream.h:120
void reallocate(size_t i_nSize)
Reallocates the buffer to the given size.
Definition: WriteStream.cpp:12
CWriteStream(CWriteStream &&i_oWriteStream) noexcept
Move constructor.
Definition: WriteStream.h:63
CWriteStream()
Default constructor.
Definition: WriteStream.h:46
virtual ~CWriteStream()
Destructor.
Definition: WriteStream.h:68
void push(const T &i_oValue)
Pushes a numeric value to the buffer.
Definition: WriteStream.h:130
void push(const std::string &i_oString, const bool i_fZeroTerminated=true)
Pushes a std::string to the buffer.
Definition: WriteStream.h:111
CWriteStream & operator=(const CWriteStream &i_oOther)
Copy assignment operator.
Definition: WriteStream.h:242
void push(const CCharArray< TSize > &i_oValue, const bool i_bMaxLength=true)
Pushes a CCharArray to the buffer.
Definition: WriteStream.h:153
The namespace encapsulating I/O related classes and functions in the Devel framework.