mirror of
https://github.com/catchorg/Catch2.git
synced 2025-04-29 20:13:52 +00:00
* Empty strings are now direct constructed as `std::string()`, not as empty string literals. * `startsWith` and `endsWith` no longer construct new a string. This should be an improvement for libstdc++ when using older standards, as it doesn't use SSO but COW and thus even short strings are expensive to first create. * Various places now use char literal instead of string literals containing single char. ** `startsWith` and `endsWith` now also have overload that takes single char. Generally the performance improvements under VS2015 are small, as going from short string to char is mostly meaningless because of SSO (Catch doesn't push string handling that hard) and previous commit removed most string handling if tests pass, which is the expect case.
126 lines
4.2 KiB
C++
126 lines
4.2 KiB
C++
/*
|
|
* Created by Phil on 27/11/2013.
|
|
* Copyright 2013 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)
|
|
*/
|
|
#ifndef TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED
|
|
#define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED
|
|
|
|
#include "catch_common.h"
|
|
|
|
#include <algorithm>
|
|
|
|
namespace Catch {
|
|
|
|
bool startsWith( std::string const& s, std::string const& prefix ) {
|
|
return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin());
|
|
}
|
|
bool startsWith( std::string const& s, char prefix ) {
|
|
return !s.empty() && s.front() == prefix;
|
|
}
|
|
bool endsWith( std::string const& s, std::string const& suffix ) {
|
|
return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin());
|
|
}
|
|
bool endsWith( std::string const& s, char suffix ) {
|
|
return !s.empty() && s.back() == suffix;
|
|
}
|
|
bool contains( std::string const& s, std::string const& infix ) {
|
|
return s.find( infix ) != std::string::npos;
|
|
}
|
|
bool contains( std::string const& s, char infix ) {
|
|
return s.find(infix);
|
|
}
|
|
char toLowerCh(char c) {
|
|
return static_cast<char>( ::tolower( c ) );
|
|
}
|
|
void toLowerInPlace( std::string& s ) {
|
|
std::transform( s.begin(), s.end(), s.begin(), toLowerCh );
|
|
}
|
|
std::string toLower( std::string const& s ) {
|
|
std::string lc = s;
|
|
toLowerInPlace( lc );
|
|
return lc;
|
|
}
|
|
std::string trim( std::string const& str ) {
|
|
static char const* whitespaceChars = "\n\r\t ";
|
|
std::string::size_type start = str.find_first_not_of( whitespaceChars );
|
|
std::string::size_type end = str.find_last_not_of( whitespaceChars );
|
|
|
|
return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string();
|
|
}
|
|
|
|
bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) {
|
|
bool replaced = false;
|
|
std::size_t i = str.find( replaceThis );
|
|
while( i != std::string::npos ) {
|
|
replaced = true;
|
|
str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() );
|
|
if( i < str.size()-withThis.size() )
|
|
i = str.find( replaceThis, i+withThis.size() );
|
|
else
|
|
i = std::string::npos;
|
|
}
|
|
return replaced;
|
|
}
|
|
|
|
pluralise::pluralise( std::size_t count, std::string const& label )
|
|
: m_count( count ),
|
|
m_label( label )
|
|
{}
|
|
|
|
std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) {
|
|
os << pluraliser.m_count << " " << pluraliser.m_label;
|
|
if( pluraliser.m_count != 1 )
|
|
os << "s";
|
|
return os;
|
|
}
|
|
|
|
SourceLineInfo::SourceLineInfo() : line( 0 ){}
|
|
SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line )
|
|
: file( _file ),
|
|
line( _line )
|
|
{}
|
|
SourceLineInfo::SourceLineInfo( SourceLineInfo const& other )
|
|
: file( other.file ),
|
|
line( other.line )
|
|
{}
|
|
bool SourceLineInfo::empty() const {
|
|
return file.empty();
|
|
}
|
|
bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const {
|
|
return line == other.line && file == other.file;
|
|
}
|
|
bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const {
|
|
return line < other.line || ( line == other.line && file < other.file );
|
|
}
|
|
|
|
void seedRng( IConfig const& config ) {
|
|
if( config.rngSeed() != 0 )
|
|
std::srand( config.rngSeed() );
|
|
}
|
|
unsigned int rngSeed() {
|
|
return getCurrentContext().getConfig()->rngSeed();
|
|
}
|
|
|
|
std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) {
|
|
#ifndef __GNUG__
|
|
os << info.file << '(' << info.line << ')';
|
|
#else
|
|
os << info.file << ':' << info.line;
|
|
#endif
|
|
return os;
|
|
}
|
|
|
|
void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) {
|
|
std::ostringstream oss;
|
|
oss << locationInfo << ": Internal Catch error: '" << message << "'";
|
|
if( alwaysTrue() )
|
|
throw std::logic_error( oss.str() );
|
|
}
|
|
}
|
|
|
|
#endif // TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED
|
|
|