forked from catchorg/Catch2
		
	
		
			
	
	
		
			84 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			84 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *  Copyright 2016 Two Blue Cubes Ltd. All rights reserved.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *  Distributed under the Boost Software License, Version 1.0. (See accompanying
							 | 
						||
| 
								 | 
							
								 *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "catch_string.h"
							 | 
						||
| 
								 | 
							
								#include "catch_stringref.h"
							 | 
						||
| 
								 | 
							
								#include "catch_stringbuilder.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "catch_stringdata.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <ostream>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Catch {
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    String::String()
							 | 
						||
| 
								 | 
							
								    : m_data( StringData::getEmpty() )
							 | 
						||
| 
								 | 
							
								    {}
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    String::String( StringRef const& stringRef )
							 | 
						||
| 
								 | 
							
								    : m_data( StringData::create( stringRef ) )
							 | 
						||
| 
								 | 
							
								    {}
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    String::String( char const* rawString )
							 | 
						||
| 
								 | 
							
								    : String( StringRef( rawString ) )
							 | 
						||
| 
								 | 
							
								    {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    String::String( String const& other )
							 | 
						||
| 
								 | 
							
								    : m_data( other.m_data )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        m_data->addRef();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    String::String( String&& other )
							 | 
						||
| 
								 | 
							
								    : m_data( other.m_data )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        other.m_data = StringData::getEmpty();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    String::String( StringBuilder&& stringBuf )
							 | 
						||
| 
								 | 
							
								    : m_data( stringBuf.m_data )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        // const_cast is ok here because we are taking ownership
							 | 
						||
| 
								 | 
							
								        const_cast<StringData*>( m_data )->size = stringBuf.size();
							 | 
						||
| 
								 | 
							
								        stringBuf.m_data = StringData::getEmpty();
							 | 
						||
| 
								 | 
							
								        stringBuf.m_size = 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    String::~String() noexcept {
							 | 
						||
| 
								 | 
							
								        m_data->release();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    auto String::operator = ( String const& other ) -> String& {
							 | 
						||
| 
								 | 
							
								        m_data = other.m_data;
							 | 
						||
| 
								 | 
							
								        m_data->addRef();
							 | 
						||
| 
								 | 
							
								        return *this;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    auto String::empty() const noexcept -> bool {
							 | 
						||
| 
								 | 
							
								        return m_data->size == 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    auto String::size() const noexcept -> size_type {
							 | 
						||
| 
								 | 
							
								        return m_data->size;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    auto String::c_str() const noexcept -> char const* {
							 | 
						||
| 
								 | 
							
								        return m_data->chars;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    auto String::operator == ( StringRef const& other ) const noexcept -> bool {
							 | 
						||
| 
								 | 
							
								        return other == StringRef( *this );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    auto String::operator == ( char const* other ) const noexcept -> bool {
							 | 
						||
| 
								 | 
							
								        return StringRef( other ) == StringRef( *this );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    std::ostream& operator << ( std::ostream& os, String const& str ) {
							 | 
						||
| 
								 | 
							
								        os << str.c_str();
							 | 
						||
| 
								 | 
							
								        return os;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								} // namespace Catch
							 |