Listing 4
template< typename C , typename T , typename A > C const *basic_string_view<C, T, A>::c_str() const { stlsoft_assert(is_valid()); if(NULL != m_cstr) { return m_cstr; } else if(0 == m_length) { return empty_string_(); } else { // Must allocate the m_cstr member char_type *s = allocate(1 + length(), NULL); traits_type::copy(s, m_base, m_length); s[m_length] = '\0'; m_cstr = s; stlsoft_assert(is_valid()); return m_cstr; } } template<typename C, typename T, typename A> class_type &basic_string_view<C, T, A>::operator =(class_type const &rhs) { stlsoft_assert(is_valid()); refresh(); m_length = rhs.m_length; m_base = rhs.m_base; return *this; } template< typename C , typename T , typename A > void basic_string_view<C, T, A>::refresh() { stlsoft_assert(is_valid()); if(NULL != m_cstr) { deallocate(m_cstr); m_cstr = NULL; } stlsoft_assert(is_valid()); } template< typename C , typename T , typename A > /* static */ C const *basic_string_view<C, T, A>::empty_string_() { // This array initialized to 0, which conveniently happens to // be the empty string, by the module/application load, so is // guaranteed to be valid, and there are no race conditions. static char_type s_empty[1]; stlsoft_assert(s_empty[0] == '\0'); // Paranoid check return s_empty; }