1 /*
2  *  Copyright 2016 Two Blue Cubes Ltd. All rights reserved.
3  *
4  *  Distributed under the Boost Software License, Version 1.0. (See accompanying
5  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6  */
7 
8 #include "catch_enforce.h"
9 #include "catch_stringref.h"
10 
11 #include <algorithm>
12 #include <ostream>
13 #include <cstring>
14 #include <cstdint>
15 
16 namespace Catch {
StringRef(char const * rawChars)17     StringRef::StringRef( char const* rawChars ) noexcept
18     : StringRef( rawChars, static_cast<StringRef::size_type>(std::strlen(rawChars) ) )
19     {}
20 
c_str() const21     auto StringRef::c_str() const -> char const* {
22         CATCH_ENFORCE(isNullTerminated(), "Called StringRef::c_str() on a non-null-terminated instance");
23         return m_start;
24     }
data() const25     auto StringRef::data() const noexcept -> char const* {
26         return m_start;
27     }
28 
substr(size_type start,size_type size) const29     auto StringRef::substr( size_type start, size_type size ) const noexcept -> StringRef {
30         if (start < m_size) {
31             return StringRef(m_start + start, (std::min)(m_size - start, size));
32         } else {
33             return StringRef();
34         }
35     }
operator ==(StringRef const & other) const36     auto StringRef::operator == ( StringRef const& other ) const noexcept -> bool {
37         return m_size == other.m_size
38             && (std::memcmp( m_start, other.m_start, m_size ) == 0);
39     }
40 
operator <<(std::ostream & os,StringRef const & str)41     auto operator << ( std::ostream& os, StringRef const& str ) -> std::ostream& {
42         return os.write(str.data(), str.size());
43     }
44 
operator +=(std::string & lhs,StringRef const & rhs)45     auto operator+=( std::string& lhs, StringRef const& rhs ) -> std::string& {
46         lhs.append(rhs.data(), rhs.size());
47         return lhs;
48     }
49 
50 } // namespace Catch
51