mirror of
https://github.com/holub/mame
synced 2025-05-13 01:24:20 +03:00
219 lines
4.0 KiB
C++
219 lines
4.0 KiB
C++
#include "MemoryOutStream.h"
|
|
|
|
#ifdef UNITTEST_MEMORYOUTSTREAM_IS_STD_OSTRINGSTREAM
|
|
|
|
namespace UnitTest {
|
|
|
|
char const* MemoryOutStream::GetText() const
|
|
{
|
|
m_text = this->str();
|
|
return m_text.c_str();
|
|
}
|
|
|
|
void MemoryOutStream::Clear()
|
|
{
|
|
this->str(std::string());
|
|
m_text = this->str();
|
|
}
|
|
|
|
#ifdef UNITTEST_COMPILER_IS_MSVC6
|
|
|
|
#define snprintf _snprintf
|
|
|
|
template<typename ValueType>
|
|
std::ostream& FormatToStream(std::ostream& stream, char const* format, ValueType const& value)
|
|
{
|
|
using namespace std;
|
|
|
|
const size_t BUFFER_SIZE=32;
|
|
char txt[BUFFER_SIZE];
|
|
snprintf(txt, BUFFER_SIZE, format, value);
|
|
return stream << txt;
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& stream, __int64 const n)
|
|
{
|
|
return FormatToStream(stream, "%I64d", n);
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& stream, unsigned __int64 const n)
|
|
{
|
|
return FormatToStream(stream, "%I64u", n);
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
#include <cstring>
|
|
#include <cstdio>
|
|
|
|
#if _MSC_VER
|
|
#define snprintf _snprintf
|
|
#endif
|
|
|
|
namespace UnitTest {
|
|
|
|
namespace {
|
|
|
|
template<typename ValueType>
|
|
void FormatToStream(MemoryOutStream& stream, char const* format, ValueType const& value)
|
|
{
|
|
using namespace std;
|
|
|
|
const size_t BUFFER_SIZE=32;
|
|
char txt[BUFFER_SIZE];
|
|
snprintf(txt, BUFFER_SIZE, format, value);
|
|
stream << txt;
|
|
}
|
|
|
|
int RoundUpToMultipleOfPow2Number (int n, int pow2Number)
|
|
{
|
|
return (n + (pow2Number - 1)) & ~(pow2Number - 1);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
MemoryOutStream::MemoryOutStream(int const size)
|
|
: m_capacity (0)
|
|
, m_buffer (0)
|
|
|
|
{
|
|
GrowBuffer(size);
|
|
}
|
|
|
|
MemoryOutStream::~MemoryOutStream()
|
|
{
|
|
delete [] m_buffer;
|
|
}
|
|
|
|
void MemoryOutStream::Clear()
|
|
{
|
|
m_buffer[0] = '\0';
|
|
}
|
|
|
|
char const* MemoryOutStream::GetText() const
|
|
{
|
|
return m_buffer;
|
|
}
|
|
|
|
MemoryOutStream& MemoryOutStream::operator <<(char const* txt)
|
|
{
|
|
using namespace std;
|
|
|
|
int const bytesLeft = m_capacity - (int)strlen(m_buffer);
|
|
int const bytesRequired = (int)strlen(txt) + 1;
|
|
|
|
if (bytesRequired > bytesLeft)
|
|
{
|
|
int const requiredCapacity = bytesRequired + m_capacity - bytesLeft;
|
|
GrowBuffer(requiredCapacity);
|
|
}
|
|
|
|
strcat(m_buffer, txt);
|
|
return *this;
|
|
}
|
|
|
|
MemoryOutStream& MemoryOutStream::operator <<(int const n)
|
|
{
|
|
FormatToStream(*this, "%i", n);
|
|
return *this;
|
|
}
|
|
|
|
MemoryOutStream& MemoryOutStream::operator <<(long const n)
|
|
{
|
|
FormatToStream(*this, "%li", n);
|
|
return *this;
|
|
}
|
|
|
|
MemoryOutStream& MemoryOutStream::operator <<(unsigned long const n)
|
|
{
|
|
FormatToStream(*this, "%lu", n);
|
|
return *this;
|
|
}
|
|
|
|
#ifdef UNITTEST_COMPILER_IS_MSVC6
|
|
MemoryOutStream& MemoryOutStream::operator <<(__int64 const n)
|
|
#else
|
|
MemoryOutStream& MemoryOutStream::operator <<(long long const n)
|
|
#endif
|
|
{
|
|
#ifdef UNITTEST_WIN32
|
|
FormatToStream(*this, "%I64d", n);
|
|
#else
|
|
FormatToStream(*this, "%lld", n);
|
|
#endif
|
|
|
|
return *this;
|
|
}
|
|
|
|
#ifdef UNITTEST_COMPILER_IS_MSVC6
|
|
MemoryOutStream& MemoryOutStream::operator <<(unsigned __int64 const n)
|
|
#else
|
|
MemoryOutStream& MemoryOutStream::operator <<(unsigned long long const n)
|
|
#endif
|
|
{
|
|
#ifdef UNITTEST_WIN32
|
|
FormatToStream(*this, "%I64u", n);
|
|
#else
|
|
FormatToStream(*this, "%llu", n);
|
|
#endif
|
|
|
|
return *this;
|
|
}
|
|
|
|
MemoryOutStream& MemoryOutStream::operator <<(float const f)
|
|
{
|
|
FormatToStream(*this, "%0.6f", f);
|
|
return *this;
|
|
}
|
|
|
|
MemoryOutStream& MemoryOutStream::operator <<(void const* p)
|
|
{
|
|
FormatToStream(*this, "%p", p);
|
|
return *this;
|
|
}
|
|
|
|
MemoryOutStream& MemoryOutStream::operator <<(unsigned int const s)
|
|
{
|
|
FormatToStream(*this, "%u", s);
|
|
return *this;
|
|
}
|
|
|
|
MemoryOutStream& MemoryOutStream::operator <<(double const d)
|
|
{
|
|
FormatToStream(*this, "%0.6f", d);
|
|
return *this;
|
|
}
|
|
|
|
int MemoryOutStream::GetCapacity() const
|
|
{
|
|
return m_capacity;
|
|
}
|
|
|
|
|
|
void MemoryOutStream::GrowBuffer(int const desiredCapacity)
|
|
{
|
|
int const newCapacity = RoundUpToMultipleOfPow2Number(desiredCapacity, GROW_CHUNK_SIZE);
|
|
|
|
using namespace std;
|
|
|
|
char* buffer = new char[newCapacity];
|
|
if (m_buffer)
|
|
strcpy(buffer, m_buffer);
|
|
else
|
|
strcpy(buffer, "");
|
|
|
|
delete [] m_buffer;
|
|
m_buffer = buffer;
|
|
m_capacity = newCapacity;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
#endif
|