Aleks11

CDynamicString

Aug 20th, 2013
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.21 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <memory.h>
  4.  
  5. #define DYNAMIC_STR_START_MEMORY_SIZE 4
  6.  
  7. class CDynamicString
  8. {
  9. public:
  10.     CDynamicString()
  11.     {
  12.         m_uStrLength = 0;
  13.         m_uMemLength = DYNAMIC_STR_START_MEMORY_SIZE;
  14.         m_pString = new char[m_uMemLength];
  15.     };
  16.  
  17.     CDynamicString(CDynamicString &_SrcDynStr)
  18.     {
  19.         m_uStrLength = _SrcDynStr.m_uStrLength;
  20.         m_uMemLength = _SrcDynStr.m_uMemLength;
  21.         m_pString = new char[m_uMemLength];
  22.  
  23.         memcpy(m_pString, _SrcDynStr.m_pString, m_uStrLength);
  24.     };
  25.  
  26.     CDynamicString(CDynamicString &&_SrcDynStr)
  27.     {
  28.         if (this != &_SrcDynStr)
  29.         {
  30.             m_pString = _SrcDynStr.m_pString;
  31.             m_uStrLength = _SrcDynStr.m_uStrLength;
  32.             m_uMemLength = _SrcDynStr.m_uMemLength;
  33.  
  34.             memset(&_SrcDynStr, 0, sizeof(CDynamicString));
  35.         }
  36.     };
  37.  
  38.     CDynamicString(char const *const _pSrcStr)
  39.     {
  40.         m_uMemLength = DYNAMIC_STR_START_MEMORY_SIZE;
  41.  
  42.         unsigned int nSrcStrLength = 0;
  43.         char const *pSrcStr = _pSrcStr;
  44.         while (*pSrcStr)
  45.         {
  46.             nSrcStrLength++;
  47.             pSrcStr++;
  48.         }
  49.  
  50.         nSrcStrLength++;
  51.  
  52.         if (nSrcStrLength > m_uMemLength)
  53.         {
  54.             while (nSrcStrLength > m_uMemLength)
  55.                 m_uMemLength <<= 1;
  56.         }
  57.  
  58.         m_uStrLength = nSrcStrLength;
  59.  
  60.         m_pString = new char[m_uMemLength];
  61.  
  62.         memcpy(m_pString, _pSrcStr, m_uStrLength);
  63.     };
  64.  
  65.     ~CDynamicString()
  66.     {
  67.         if (m_pString)
  68.             delete[] m_pString;
  69.     };
  70.  
  71.     const CDynamicString &operator=(const CDynamicString &_SrcDynStr)
  72.     {
  73.         if (this != &_SrcDynStr)
  74.         {
  75.             if (_SrcDynStr.m_uStrLength > m_uMemLength)
  76.             {
  77.                 while (_SrcDynStr.m_uStrLength > m_uMemLength)
  78.                     m_uMemLength <<= 1;
  79.  
  80.                 delete[] m_pString;
  81.  
  82.                 m_pString = new char[m_uMemLength];
  83.             }
  84.  
  85.             m_uStrLength = _SrcDynStr.m_uStrLength;
  86.  
  87.             memcpy(m_pString, _SrcDynStr.m_pString, m_uStrLength);
  88.         }
  89.  
  90.         return *this;
  91.     };
  92.  
  93.     const CDynamicString& operator=(CDynamicString &&_SrcDynStr)
  94.     {
  95.         if (this != &_SrcDynStr)
  96.         {
  97.             m_pString = _SrcDynStr.m_pString;
  98.             m_uStrLength = _SrcDynStr.m_uStrLength;
  99.             m_uMemLength = _SrcDynStr.m_uMemLength;
  100.  
  101.             memset(&_SrcDynStr, 0, sizeof(CDynamicString));
  102.         }
  103.  
  104.         return *this;
  105.     };
  106.  
  107.     friend const CDynamicString operator+(const CDynamicString &_SrcDynStr1, const CDynamicString &_SrcDynStr2)
  108.     {
  109.         CDynamicString tmp;
  110.         tmp.m_uStrLength = _SrcDynStr1.m_uStrLength + _SrcDynStr2.m_uStrLength - 1;
  111.  
  112.         if (tmp.m_uStrLength > tmp.m_uMemLength)
  113.         {
  114.             while (tmp.m_uStrLength > tmp.m_uMemLength)
  115.                 tmp.m_uMemLength <<= 1;
  116.  
  117.             delete[] tmp.m_pString;
  118.  
  119.             tmp.m_pString = new char[tmp.m_uMemLength];
  120.         }
  121.  
  122.         memcpy(tmp.m_pString, _SrcDynStr1.m_pString, _SrcDynStr1.m_uStrLength - 1);
  123.         memcpy(tmp.m_pString + _SrcDynStr1.m_uStrLength - 1, _SrcDynStr2.m_pString, _SrcDynStr2.m_uStrLength);
  124.  
  125.         return tmp;
  126.     }
  127.  
  128.     char const *const GetString() const
  129.     {
  130.         return m_pString;
  131.     };
  132.  
  133.     unsigned int const GetLength() const
  134.     {
  135.         return m_uStrLength;
  136.     };
  137. private:
  138.     char *m_pString;
  139.     unsigned int m_uStrLength;
  140.     unsigned int m_uMemLength;
  141. };
  142.  
  143. int main()
  144. {
  145.     CDynamicString str("myshgfhgfhdgfhdfhdfghgdfhgdfhgdfhgfhgdfhgdfhdftr");
  146.     CDynamicString str2("pri1010hgfhgdfhgdfhdfgd101010hgfdhgdfhgfhdfhfhdfgvet");
  147.     str = str + str2;
  148.  
  149.     printf("%s %d\n", str.GetString(), str.GetLength());
  150.  
  151.     _getch();
  152.     return 0;
  153. }
Advertisement
Add Comment
Please, Sign In to add comment