// @topic T060m10d25x20 class DString -- using dynamic array of characters // @brief class DString implementation // DString.cpp #include "DString.h" DString::DString() : m_array( nullptr ), m_length( 0 ), m_capacity( INITIAL_CAPACITY ) { allocate( INITIAL_CAPACITY ); }//DString::DString DString::DString(char const* pstr) : m_array(nullptr), m_length( strlen( pstr ) ), m_capacity(INITIAL_CAPACITY) { allocate(m_length); strcpy(m_array, pstr); }//DString::DString // in a non-destructive manner // allocate block of characters of the requested size void DString::allocate( size_t capacity ) { if ( capacity < m_capacity ) return; char* new_block = new char[ capacity ]; if ( m_array != nullptr ) { // copy the existing content to the new block: for ( size_t idx = 0; idx < m_length; ++idx ) { new_block[idx] = m_array[idx]; } delete[] m_array; // free old block of characters } m_array = new_block; // remember new block of characters m_capacity = capacity; }//DString::allocate size_t DString::length() const { return m_length; }//DString::length size_t DString::capacity() const { return m_capacity; }//DString::capacity std::ostream& operator<<(std::ostream& cout, DString const& str) { for (size_t idx = 0; idx < str.length(); ++idx ) { cout << str.m_array[idx]; } return cout; }//operator<< std::istream& operator>>(std::istream& cin, DString& str) { str.m_length = 0; while ( cin ) { int ch = cin.get(); // extract a single character form cin if ( ch == '\n' ) break; // before storing a character, check the capacity: if (str.m_length >= str.m_capacity) { str.allocate( str.m_capacity*2 ); } str.m_array[str.m_length] = ch; ++str.m_length; } return cin; }//operator>>