// Copyright Catch2 Authors // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE.txt or copy at // https://www.boost.org/LICENSE_1_0.txt) // SPDX-License-Identifier: BSL-1.0 #include #include #include #include #include namespace Catch { StringRef::StringRef( char const* rawChars ) noexcept : StringRef( rawChars, std::strlen(rawChars) ) {} bool StringRef::operator<(StringRef rhs) const noexcept { if (m_size < rhs.m_size) { return strncmp(m_start, rhs.m_start, m_size) <= 0; } return strncmp(m_start, rhs.m_start, rhs.m_size) < 0; } int StringRef::compare( StringRef rhs ) const { auto cmpResult = strncmp( m_start, rhs.m_start, std::min( m_size, rhs.m_size ) ); // This means that strncmp found a difference before the strings // ended, and we can return it directly if ( cmpResult != 0 ) { return cmpResult; } // If strings are equal up to length, then their comparison results on // their size if ( m_size < rhs.m_size ) { return -1; } else if ( m_size > rhs.m_size ) { return 1; } else { return 0; } } auto operator << ( std::ostream& os, StringRef str ) -> std::ostream& { return os.write(str.data(), static_cast(str.size())); } std::string operator+(StringRef lhs, StringRef rhs) { std::string ret; ret.reserve(lhs.size() + rhs.size()); ret += lhs; ret += rhs; return ret; } auto operator+=( std::string& lhs, StringRef rhs ) -> std::string& { lhs.append(rhs.data(), rhs.size()); return lhs; } } // namespace Catch