StringRef conversions to/ from std::string

This commit is contained in:
Phil Nash 2017-08-14 08:39:14 +01:00
parent 1aab791d67
commit c659e0fd3d
3 changed files with 54 additions and 3 deletions

View File

@ -60,8 +60,7 @@ namespace Catch {
StringRef::StringRef( String const& other ) noexcept StringRef::StringRef( String const& other ) noexcept
: m_start( other.c_str() ), : m_start( other.c_str() ),
m_size( other.size() ), m_size( other.size() )
m_data( nullptr )
{} {}
StringRef::StringRef( String&& str ) noexcept StringRef::StringRef( String&& str ) noexcept
@ -71,6 +70,10 @@ namespace Catch {
{ {
str.m_data = StringData::getEmpty(); str.m_data = StringData::getEmpty();
} }
StringRef::StringRef( std::string const& stdString ) noexcept
: m_start( stdString.c_str() ),
m_size( stdString.size() )
{}
StringRef::~StringRef() noexcept { StringRef::~StringRef() noexcept {
if( isOwned() ) if( isOwned() )
@ -81,6 +84,9 @@ namespace Catch {
swap( other ); swap( other );
return *this; return *this;
} }
StringRef::operator std::string() const {
return std::string( m_start, m_size );
}
void StringRef::swap( StringRef& other ) noexcept { void StringRef::swap( StringRef& other ) noexcept {
std::swap( m_start, other.m_start ); std::swap( m_start, other.m_start );

View File

@ -8,6 +8,7 @@
#define CATCH_STRINGREF_H_INCLUDED #define CATCH_STRINGREF_H_INCLUDED
#include <cstddef> #include <cstddef>
#include <string>
namespace Catch { namespace Catch {
@ -43,9 +44,11 @@ namespace Catch {
StringRef( char const* rawChars, size_type size ) noexcept; StringRef( char const* rawChars, size_type size ) noexcept;
StringRef( String const& other ) noexcept; StringRef( String const& other ) noexcept;
StringRef( String&& other ) noexcept; StringRef( String&& other ) noexcept;
StringRef( std::string const& stdString ) noexcept;
~StringRef() noexcept; ~StringRef() noexcept;
auto operator = ( StringRef other ) noexcept -> StringRef&; auto operator = ( StringRef other ) noexcept -> StringRef&;
operator std::string() const;
void swap( StringRef& other ) noexcept; void swap( StringRef& other ) noexcept;

View File

@ -150,4 +150,46 @@ TEST_CASE( "StringRef", "[Strings]" ) {
REQUIRE( data( copied ) == originalPointer ); REQUIRE( data( copied ) == originalPointer );
} }
} }
SECTION( "from std::string" ) {
std::string stdStr = "a standard string";
SECTION( "implicitly constructed" ) {
StringRef sr = stdStr;
REQUIRE( sr == "a standard string" );
REQUIRE( sr.size() == stdStr.size() );
}
SECTION( "explicitly constructed" ) {
StringRef sr( stdStr );
REQUIRE( sr == "a standard string" );
REQUIRE( sr.size() == stdStr.size() );
}
SECTION( "assigned" ) {
StringRef sr;
sr = stdStr;
REQUIRE( sr == "a standard string" );
REQUIRE( sr.size() == stdStr.size() );
}
}
SECTION( "to std::string" ) {
StringRef sr = "a stringref";
SECTION( "implicitly constructed" ) {
std::string stdStr = sr;
REQUIRE( stdStr == "a stringref" );
REQUIRE( stdStr.size() == sr.size() );
}
SECTION( "explicitly constructed" ) {
std::string stdStr( sr );
REQUIRE( stdStr == "a stringref" );
REQUIRE( stdStr.size() == sr.size() );
}
SECTION( "assigned" ) {
std::string stdStr;
stdStr = sr;
REQUIRE( stdStr == "a stringref" );
REQUIRE( stdStr.size() == sr.size() );
}
}
} }