Aleks11

CDynamicString | supplemented

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