| #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 |