?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #include "MemoryOutStream.h"
  2.  
  3. #ifdef UNITTEST_MEMORYOUTSTREAM_IS_STD_OSTRINGSTREAM
  4.  
  5. namespace UnitTest {
  6.  
  7.    char const* MemoryOutStream::GetText() const
  8.    {
  9.       m_text = this->str();
  10.       return m_text.c_str();
  11.    }
  12.  
  13.    void MemoryOutStream::Clear()
  14.    {
  15.       this->str(std::string());
  16.       m_text = this->str();
  17.    }
  18.  
  19. #ifdef UNITTEST_COMPILER_IS_MSVC6
  20.  
  21.    #define snprintf _snprintf
  22.  
  23.    template<typename ValueType>
  24.    std::ostream& FormatToStream(std::ostream& stream, char const* format, ValueType const& value)
  25.    {
  26.       using namespace std;
  27.  
  28.       const size_t BUFFER_SIZE=32;
  29.       char txt[BUFFER_SIZE];
  30.       snprintf(txt, BUFFER_SIZE, format, value);
  31.       return stream << txt;
  32.    }
  33.  
  34.    std::ostream& operator<<(std::ostream& stream, __int64 const n)
  35.    {
  36.       return FormatToStream(stream, "%I64d", n);
  37.    }
  38.  
  39.    std::ostream& operator<<(std::ostream& stream, unsigned __int64 const n)
  40.    {
  41.       return FormatToStream(stream, "%I64u", n);
  42.    }
  43.  
  44. #endif
  45.  
  46. }
  47.  
  48. #else
  49.  
  50. #include <cstring>
  51. #include <cstdio>
  52.  
  53. #if _MSC_VER
  54. #define snprintf _snprintf
  55. #endif
  56.  
  57. namespace UnitTest {
  58.  
  59.    namespace {
  60.  
  61.       template<typename ValueType>
  62.       void FormatToStream(MemoryOutStream& stream, char const* format, ValueType const& value)
  63.       {
  64.          using namespace std;
  65.  
  66.          const size_t BUFFER_SIZE=32;
  67.          char txt[BUFFER_SIZE];
  68.          snprintf(txt, BUFFER_SIZE, format, value);
  69.          stream << txt;
  70.       }
  71.  
  72.       int RoundUpToMultipleOfPow2Number (int n, int pow2Number)
  73.       {
  74.          return (n + (pow2Number - 1)) & ~(pow2Number - 1);
  75.       }
  76.  
  77.    }
  78.  
  79.  
  80.    MemoryOutStream::MemoryOutStream(int const size)
  81.       : m_capacity (0)
  82.       , m_buffer (0)
  83.  
  84.    {
  85.       GrowBuffer(size);
  86.    }
  87.  
  88.    MemoryOutStream::~MemoryOutStream()
  89.    {
  90.       delete [] m_buffer;
  91.    }
  92.  
  93.    void MemoryOutStream::Clear()
  94.    {
  95.       m_buffer[0] = '\0';
  96.    }
  97.  
  98.    char const* MemoryOutStream::GetText() const
  99.    {
  100.       return m_buffer;
  101.    }
  102.  
  103.    MemoryOutStream& MemoryOutStream::operator <<(char const* txt)
  104.    {
  105.       using namespace std;
  106.  
  107.       int const bytesLeft = m_capacity - (int)strlen(m_buffer);
  108.       int const bytesRequired = (int)strlen(txt) + 1;
  109.  
  110.       if (bytesRequired > bytesLeft)
  111.       {
  112.          int const requiredCapacity = bytesRequired + m_capacity - bytesLeft;
  113.          GrowBuffer(requiredCapacity);
  114.       }
  115.  
  116.       strcat(m_buffer, txt);
  117.       return *this;
  118.    }
  119.  
  120.    MemoryOutStream& MemoryOutStream::operator <<(int const n)
  121.    {
  122.       FormatToStream(*this, "%i", n);
  123.       return *this;
  124.    }
  125.  
  126.    MemoryOutStream& MemoryOutStream::operator <<(long const n)
  127.    {
  128.       FormatToStream(*this, "%li", n);
  129.       return *this;
  130.    }
  131.  
  132.    MemoryOutStream& MemoryOutStream::operator <<(unsigned long const n)
  133.    {
  134.       FormatToStream(*this, "%lu", n);
  135.       return *this;
  136.    }
  137.  
  138. #ifdef UNITTEST_COMPILER_IS_MSVC6
  139.    MemoryOutStream& MemoryOutStream::operator <<(__int64 const n)
  140. #else
  141.    MemoryOutStream& MemoryOutStream::operator <<(long long const n)
  142. #endif
  143.    {
  144. #ifdef UNITTEST_WIN32
  145.       FormatToStream(*this, "%I64d", n);
  146. #else
  147.       FormatToStream(*this, "%lld", n);
  148. #endif
  149.  
  150.       return *this;
  151.    }
  152.  
  153. #ifdef UNITTEST_COMPILER_IS_MSVC6
  154.    MemoryOutStream& MemoryOutStream::operator <<(unsigned __int64 const n)
  155. #else
  156.    MemoryOutStream& MemoryOutStream::operator <<(unsigned long long const n)
  157. #endif
  158.    {
  159. #ifdef UNITTEST_WIN32
  160.       FormatToStream(*this, "%I64u", n);
  161. #else
  162.       FormatToStream(*this, "%llu", n);
  163. #endif
  164.  
  165.       return *this;
  166.    }
  167.  
  168.    MemoryOutStream& MemoryOutStream::operator <<(float const f)
  169.    {
  170.       FormatToStream(*this, "%0.6f", f);
  171.       return *this;
  172.    }
  173.  
  174.    MemoryOutStream& MemoryOutStream::operator <<(void const* p)
  175.    {
  176.       FormatToStream(*this, "%p", p);
  177.       return *this;
  178.    }
  179.  
  180.    MemoryOutStream& MemoryOutStream::operator <<(unsigned int const s)
  181.    {
  182.       FormatToStream(*this, "%u", s);
  183.       return *this;
  184.    }
  185.  
  186.    MemoryOutStream& MemoryOutStream::operator <<(double const d)
  187.    {
  188.       FormatToStream(*this, "%0.6f", d);
  189.       return *this;
  190.    }
  191.  
  192.    int MemoryOutStream::GetCapacity() const
  193.    {
  194.       return m_capacity;
  195.    }
  196.  
  197.  
  198.    void MemoryOutStream::GrowBuffer(int const desiredCapacity)
  199.    {
  200.       int const newCapacity = RoundUpToMultipleOfPow2Number(desiredCapacity, GROW_CHUNK_SIZE);
  201.  
  202.       using namespace std;
  203.  
  204.       char* buffer = new char[newCapacity];
  205.       if (m_buffer)
  206.          strcpy(buffer, m_buffer);
  207.       else
  208.          strcpy(buffer, "");
  209.  
  210.       delete [] m_buffer;
  211.       m_buffer = buffer;
  212.       m_capacity = newCapacity;
  213.    }
  214.  
  215. }
  216.  
  217.  
  218. #endif
  219.