|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r83147 - in trunk: boost/utility libs/utility/test
From: eric_at_[hidden]
Date: 2013-02-25 01:30:02
Author: eric_niebler
Date: 2013-02-25 01:30:00 EST (Mon, 25 Feb 2013)
New Revision: 83147
URL: http://svn.boost.org/trac/boost/changeset/83147
Log:
fix breakage of string_ref logical ops, detabify, remove trailing whitespace
Text files modified:
trunk/boost/utility/string_ref.hpp | 254 +++++++++++++++++++++++++--------------
trunk/libs/utility/test/string_ref_test1.cpp | 26 ++--
trunk/libs/utility/test/string_ref_test2.cpp | 111 ++++++++--------
3 files changed, 228 insertions(+), 163 deletions(-)
Modified: trunk/boost/utility/string_ref.hpp
==============================================================================
--- trunk/boost/utility/string_ref.hpp (original)
+++ trunk/boost/utility/string_ref.hpp 2013-02-25 01:30:00 EST (Mon, 25 Feb 2013)
@@ -1,11 +1,11 @@
-/*
+/*
Copyright (c) Marshall Clow 2012-2012.
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)
For more information, see http://www.boost.org
-
+
Based on the StringRef implementation in LLVM (http://llvm.org) and
N3422 by Jeffrey Yasskin
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3442.html
@@ -24,7 +24,7 @@
#include <string>
namespace boost {
-
+
namespace detail {
// A helper functor because sometimes we don't have lambdas
template <typename charT, typename traits>
@@ -34,10 +34,8 @@
bool operator () ( charT val ) const { return traits::eq ( ch_, val ); }
charT ch_;
};
-
- template<typename T> struct __identity { typedef T type; };
}
-
+
template<typename charT, typename traits> class basic_string_ref;
typedef basic_string_ref<char, std::char_traits<char> > string_ref;
typedef basic_string_ref<wchar_t, std::char_traits<wchar_t> > wstring_ref;
@@ -49,7 +47,7 @@
#ifndef BOOST_NO_CXX11_CHAR32_T
typedef basic_string_ref<char32_t, std::char_traits<char32_t> > u32string_ref;
#endif
-
+
template<typename charT, typename traits>
class basic_string_ref {
public:
@@ -65,7 +63,7 @@
typedef std::size_t size_type;
typedef ptrdiff_t difference_type;
static BOOST_CONSTEXPR_OR_CONST size_type npos = size_type(-1);
-
+
// construct/copy
BOOST_CONSTEXPR basic_string_ref ()
: ptr_(NULL), len_(0) {}
@@ -78,7 +76,7 @@
len_ = rhs.len_;
return *this;
}
-
+
basic_string_ref(const charT* str)
: ptr_(str), len_(traits::length(str)) {}
@@ -95,7 +93,7 @@
return std::basic_string<charT, traits, Allocator> ( ptr_, len_ );
}
#endif
-
+
std::basic_string<charT, traits> to_string () const {
return std::basic_string<charT, traits> ( ptr_, len_ );
}
@@ -109,13 +107,13 @@
const_reverse_iterator crbegin() const { return const_reverse_iterator (end()); }
const_reverse_iterator rend() const { return const_reverse_iterator (begin()); }
const_reverse_iterator crend() const { return const_reverse_iterator (begin()); }
-
+
// capacity
BOOST_CONSTEXPR size_type size() const { return len_; }
BOOST_CONSTEXPR size_type length() const { return len_; }
BOOST_CONSTEXPR size_type max_size() const { return len_; }
BOOST_CONSTEXPR bool empty() const { return len_ == 0; }
-
+
// element access
BOOST_CONSTEXPR const charT& operator[](size_type pos) const { return ptr_[pos]; }
@@ -124,11 +122,11 @@
throw std::out_of_range ( "boost::string_ref::at" );
return ptr_[pos];
}
-
+
BOOST_CONSTEXPR const charT& front() const { return ptr_[0]; }
BOOST_CONSTEXPR const charT& back() const { return ptr_[len_-1]; }
BOOST_CONSTEXPR const charT* data() const { return ptr_; }
-
+
// modifiers
void clear() { len_ = 0; }
void remove_prefix(size_type n) {
@@ -137,14 +135,14 @@
ptr_ += n;
len_ -= n;
}
-
+
void remove_suffix(size_type n) {
if ( n > len_ )
n = len_;
len_ -= n;
}
-
-
+
+
// basic_string_ref string operations
BOOST_CONSTEXPR
basic_string_ref substr(size_type pos, size_type n=npos) const {
@@ -159,78 +157,78 @@
basic_string_ref ( data() + pos, n == npos || pos + n > size() ? size() - pos : n );
#endif
}
-
+
int compare(basic_string_ref x) const {
const int cmp = traits::compare ( ptr_, x.ptr_, (std::min)(len_, x.len_));
return cmp != 0 ? cmp : ( len_ == x.len_ ? 0 : len_ < x.len_ ? -1 : 1 );
}
-
+
bool starts_with(charT c) const { return !empty() && traits::eq ( c, front()); }
bool starts_with(basic_string_ref x) const {
return len_ >= x.len_ && traits::compare ( ptr_, x.ptr_, x.len_ ) == 0;
}
-
+
bool ends_with(charT c) const { return !empty() && traits::eq ( c, back()); }
bool ends_with(basic_string_ref x) const {
return len_ >= x.len_ && traits::compare ( ptr_ + len_ - x.len_, x.ptr_, x.len_ ) == 0;
}
size_type find(basic_string_ref s) const {
- const_iterator iter = std::search ( this->cbegin (), this->cend (),
+ const_iterator iter = std::search ( this->cbegin (), this->cend (),
s.cbegin (), s.cend (), traits::eq );
return iter == this->cend () ? npos : std::distance ( this->cbegin (), iter );
}
-
+
size_type find(charT c) const {
- const_iterator iter = std::find_if ( this->cbegin (), this->cend (),
+ const_iterator iter = std::find_if ( this->cbegin (), this->cend (),
detail::string_ref_traits_eq<charT, traits> ( c ));
return iter == this->cend () ? npos : std::distance ( this->cbegin (), iter );
}
-
+
size_type rfind(basic_string_ref s) const {
- const_reverse_iterator iter = std::search ( this->crbegin (), this->crend (),
+ const_reverse_iterator iter = std::search ( this->crbegin (), this->crend (),
s.crbegin (), s.crend (), traits::eq );
return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter );
}
size_type rfind(charT c) const {
- const_reverse_iterator iter = std::find_if ( this->crbegin (), this->crend (),
+ const_reverse_iterator iter = std::find_if ( this->crbegin (), this->crend (),
detail::string_ref_traits_eq<charT, traits> ( c ));
return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter );
}
-
+
size_type find_first_of(charT c) const { return find (c); }
size_type find_last_of (charT c) const { return rfind (c); }
-
+
size_type find_first_of(basic_string_ref s) const {
- const_iterator iter = std::find_first_of
+ const_iterator iter = std::find_first_of
( this->cbegin (), this->cend (), s.cbegin (), s.cend (), traits::eq );
return iter == this->cend () ? npos : std::distance ( this->cbegin (), iter );
}
-
+
size_type find_last_of(basic_string_ref s) const {
- const_reverse_iterator iter = std::find_first_of
+ const_reverse_iterator iter = std::find_first_of
( this->crbegin (), this->crend (), s.cbegin (), s.cend (), traits::eq );
return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter);
}
-
+
size_type find_first_not_of(basic_string_ref s) const {
- const_iterator iter = find_not_of ( this->cbegin (), this->cend (), s );
+ const_iterator iter = find_not_of ( this->cbegin (), this->cend (), s );
return iter == this->cend () ? npos : std::distance ( this->cbegin (), iter );
}
-
+
size_type find_first_not_of(charT c) const {
for ( const_iterator iter = this->cbegin (); iter != this->cend (); ++iter )
if ( !traits::eq ( c, *iter ))
return std::distance ( this->cbegin (), iter );
return npos;
}
-
+
size_type find_last_not_of(basic_string_ref s) const {
- const_reverse_iterator iter = find_not_of ( this->crbegin (), this->crend (), s );
+ const_reverse_iterator iter = find_not_of ( this->crbegin (), this->crend (), s );
return iter == this->crend () ? npos : reverse_distance ( this->crbegin (), iter );
}
-
+
size_type find_last_not_of(charT c) const {
for ( const_reverse_iterator iter = this->crbegin (); iter != this->crend (); ++iter )
if ( !traits::eq ( c, *iter ))
@@ -243,55 +241,75 @@
size_type reverse_distance ( r_iter first, r_iter last ) const {
return len_ - 1 - std::distance ( first, last );
}
-
+
template <typename Iterator>
Iterator find_not_of ( Iterator first, Iterator last, basic_string_ref s ) const {
- for ( ; first != last ; ++first )
- if ( 0 == traits::find ( s.ptr_, s.len_, *first ))
- return first;
- return last;
- }
-
-
-
+ for ( ; first != last ; ++first )
+ if ( 0 == traits::find ( s.ptr_, s.len_, *first ))
+ return first;
+ return last;
+ }
+
+
+
const charT *ptr_;
std::size_t len_;
};
-
-// Comparison operators (3 for each operation)
+
+// Comparison operators
// Equality
template<typename charT, typename traits>
bool operator==(basic_string_ref<charT, traits> x, basic_string_ref<charT, traits> y) {
if ( x.size () != y.size ()) return false;
return x.compare(y) == 0;
}
+
+ template<typename charT, typename traits, typename Allocator>
+ bool operator==(basic_string_ref<charT, traits> x, const std::basic_string<charT, traits, Allocator> & y) {
+ return x == basic_string_ref<charT, traits>(y);
+ }
+
+ template<typename charT, typename traits, typename Allocator>
+ bool operator==(const std::basic_string<charT, traits, Allocator> & x, basic_string_ref<charT, traits> y) {
+ return basic_string_ref<charT, traits>(x) == y;
+ }
+
template<typename charT, typename traits>
- bool operator==(basic_string_ref<charT, traits> x, typename detail::__identity<basic_string_ref<charT, traits> >::type y) {
- if ( x.size () != y.size ()) return false;
- return x.compare(y) == 0;
+ bool operator==(basic_string_ref<charT, traits> x, const charT * y) {
+ return x == basic_string_ref<charT, traits>(y);
}
+
template<typename charT, typename traits>
- bool operator==(typename detail::__identity<basic_string_ref<charT, traits> >::type x, basic_string_ref<charT, traits> y) {
- if ( x.size () != y.size ()) return false;
- return x.compare(y) == 0;
+ bool operator==(const charT * x, basic_string_ref<charT, traits> y) {
+ return basic_string_ref<charT, traits>(x) == y;
}
-
+
// Inequality
template<typename charT, typename traits>
bool operator!=(basic_string_ref<charT, traits> x, basic_string_ref<charT, traits> y) {
if ( x.size () != y.size ()) return true;
return x.compare(y) != 0;
}
+
+ template<typename charT, typename traits, typename Allocator>
+ bool operator!=(basic_string_ref<charT, traits> x, const std::basic_string<charT, traits, Allocator> & y) {
+ return x != basic_string_ref<charT, traits>(y);
+ }
+
+ template<typename charT, typename traits, typename Allocator>
+ bool operator!=(const std::basic_string<charT, traits, Allocator> & x, basic_string_ref<charT, traits> y) {
+ return basic_string_ref<charT, traits>(x) != y;
+ }
+
template<typename charT, typename traits>
- bool operator!=(basic_string_ref<charT, traits> x, typename detail::__identity<basic_string_ref<charT, traits> >::type y) {
- if ( x.size () != y.size ()) return true;
- return x.compare(y) != 0;
+ bool operator!=(basic_string_ref<charT, traits> x, const charT * y) {
+ return x != basic_string_ref<charT, traits>(y);
}
+
template<typename charT, typename traits>
- bool operator!=(typename detail::__identity<basic_string_ref<charT, traits> >::type x, basic_string_ref<charT, traits> y) {
- if ( x.size () != y.size ()) return true;
- return x.compare(y) != 0;
+ bool operator!=(const charT * x, basic_string_ref<charT, traits> y) {
+ return basic_string_ref<charT, traits>(x) != y;
}
// Less than
@@ -299,13 +317,25 @@
bool operator<(basic_string_ref<charT, traits> x, basic_string_ref<charT, traits> y) {
return x.compare(y) < 0;
}
+
+ template<typename charT, typename traits, typename Allocator>
+ bool operator<(basic_string_ref<charT, traits> x, const std::basic_string<charT, traits, Allocator> & y) {
+ return x < basic_string_ref<charT, traits>(y);
+ }
+
+ template<typename charT, typename traits, typename Allocator>
+ bool operator<(const std::basic_string<charT, traits, Allocator> & x, basic_string_ref<charT, traits> y) {
+ return basic_string_ref<charT, traits>(x) < y;
+ }
+
template<typename charT, typename traits>
- bool operator<(basic_string_ref<charT, traits> x, typename detail::__identity<basic_string_ref<charT, traits> >::type y) {
- return x.compare(y) < 0;
+ bool operator<(basic_string_ref<charT, traits> x, const charT * y) {
+ return x < basic_string_ref<charT, traits>(y);
}
+
template<typename charT, typename traits>
- bool operator<(typename detail::__identity<basic_string_ref<charT, traits> >::type x, basic_string_ref<charT, traits> y) {
- return x.compare(y) < 0;
+ bool operator<(const charT * x, basic_string_ref<charT, traits> y) {
+ return basic_string_ref<charT, traits>(x) < y;
}
// Greater than
@@ -313,13 +343,25 @@
bool operator>(basic_string_ref<charT, traits> x, basic_string_ref<charT, traits> y) {
return x.compare(y) > 0;
}
+
+ template<typename charT, typename traits, typename Allocator>
+ bool operator>(basic_string_ref<charT, traits> x, const std::basic_string<charT, traits, Allocator> & y) {
+ return x > basic_string_ref<charT, traits>(y);
+ }
+
+ template<typename charT, typename traits, typename Allocator>
+ bool operator>(const std::basic_string<charT, traits, Allocator> & x, basic_string_ref<charT, traits> y) {
+ return basic_string_ref<charT, traits>(x) > y;
+ }
+
template<typename charT, typename traits>
- bool operator>(basic_string_ref<charT, traits> x, typename detail::__identity<basic_string_ref<charT, traits> >::type y) {
- return x.compare(y) > 0;
+ bool operator>(basic_string_ref<charT, traits> x, const charT * y) {
+ return x > basic_string_ref<charT, traits>(y);
}
+
template<typename charT, typename traits>
- bool operator>(typename detail::__identity<basic_string_ref<charT, traits> >::type x, basic_string_ref<charT, traits> y) {
- return x.compare(y) > 0;
+ bool operator>(const charT * x, basic_string_ref<charT, traits> y) {
+ return basic_string_ref<charT, traits>(x) > y;
}
// Less than or equal to
@@ -327,13 +369,25 @@
bool operator<=(basic_string_ref<charT, traits> x, basic_string_ref<charT, traits> y) {
return x.compare(y) <= 0;
}
+
+ template<typename charT, typename traits, typename Allocator>
+ bool operator<=(basic_string_ref<charT, traits> x, const std::basic_string<charT, traits, Allocator> & y) {
+ return x <= basic_string_ref<charT, traits>(y);
+ }
+
+ template<typename charT, typename traits, typename Allocator>
+ bool operator<=(const std::basic_string<charT, traits, Allocator> & x, basic_string_ref<charT, traits> y) {
+ return basic_string_ref<charT, traits>(x) <= y;
+ }
+
template<typename charT, typename traits>
- bool operator<=(basic_string_ref<charT, traits> x, typename detail::__identity<basic_string_ref<charT, traits> >::type y) {
- return x.compare(y) <= 0;
+ bool operator<=(basic_string_ref<charT, traits> x, const charT * y) {
+ return x <= basic_string_ref<charT, traits>(y);
}
+
template<typename charT, typename traits>
- bool operator<=(typename detail::__identity<basic_string_ref<charT, traits> >::type x, basic_string_ref<charT, traits> y) {
- return x.compare(y) <= 0;
+ bool operator<=(const charT * x, basic_string_ref<charT, traits> y) {
+ return basic_string_ref<charT, traits>(x) <= y;
}
// Greater than or equal to
@@ -341,17 +395,27 @@
bool operator>=(basic_string_ref<charT, traits> x, basic_string_ref<charT, traits> y) {
return x.compare(y) >= 0;
}
- template<typename charT, typename traits>
- bool operator>=(basic_string_ref<charT, traits> x, typename detail::__identity<basic_string_ref<charT, traits> >::type y) {
- return x.compare(y) >= 0;
+
+ template<typename charT, typename traits, typename Allocator>
+ bool operator>=(basic_string_ref<charT, traits> x, const std::basic_string<charT, traits, Allocator> & y) {
+ return x >= basic_string_ref<charT, traits>(y);
}
+
+ template<typename charT, typename traits, typename Allocator>
+ bool operator>=(const std::basic_string<charT, traits, Allocator> & x, basic_string_ref<charT, traits> y) {
+ return basic_string_ref<charT, traits>(x) >= y;
+ }
+
template<typename charT, typename traits>
- bool operator>=(typename detail::__identity<basic_string_ref<charT, traits> >::type x, basic_string_ref<charT, traits> y) {
- return x.compare(y) >= 0;
+ bool operator>=(basic_string_ref<charT, traits> x, const charT * y) {
+ return x >= basic_string_ref<charT, traits>(y);
}
+ template<typename charT, typename traits>
+ bool operator>=(const charT * x, basic_string_ref<charT, traits> y) {
+ return basic_string_ref<charT, traits>(x) >= y;
+ }
-
// Inserter
template<class charT, class traits>
std::basic_ostream<charT, traits>&
@@ -365,7 +429,7 @@
#endif
return os;
}
-
+
#if 0
// numeric conversions
//
@@ -375,63 +439,63 @@
int stoi (string_ref str, size_t* idx=0, int base=10) {
return std::stoi ( std::string(str), idx, base );
}
-
+
long stol (string_ref str, size_t* idx=0, int base=10) {
return std::stol ( std::string(str), idx, base );
}
-
+
unsigned long stoul (string_ref str, size_t* idx=0, int base=10) {
return std::stoul ( std::string(str), idx, base );
}
-
+
long long stoll (string_ref str, size_t* idx=0, int base=10) {
return std::stoll ( std::string(str), idx, base );
}
-
+
unsigned long long stoull (string_ref str, size_t* idx=0, int base=10) {
return std::stoull ( std::string(str), idx, base );
}
-
+
float stof (string_ref str, size_t* idx=0) {
return std::stof ( std::string(str), idx );
}
-
+
double stod (string_ref str, size_t* idx=0) {
return std::stod ( std::string(str), idx );
}
-
+
long double stold (string_ref str, size_t* idx=0) {
return std::stold ( std::string(str), idx );
}
-
+
int stoi (wstring_ref str, size_t* idx=0, int base=10) {
return std::stoi ( std::wstring(str), idx, base );
}
-
+
long stol (wstring_ref str, size_t* idx=0, int base=10) {
return std::stol ( std::wstring(str), idx, base );
}
-
+
unsigned long stoul (wstring_ref str, size_t* idx=0, int base=10) {
return std::stoul ( std::wstring(str), idx, base );
}
-
+
long long stoll (wstring_ref str, size_t* idx=0, int base=10) {
return std::stoll ( std::wstring(str), idx, base );
}
-
+
unsigned long long stoull (wstring_ref str, size_t* idx=0, int base=10) {
return std::stoull ( std::wstring(str), idx, base );
}
-
+
float stof (wstring_ref str, size_t* idx=0) {
return std::stof ( std::wstring(str), idx );
}
-
+
double stod (wstring_ref str, size_t* idx=0) {
return std::stod ( std::wstring(str), idx );
}
-
+
long double stold (wstring_ref str, size_t* idx=0) {
return std::stold ( std::wstring(str), idx );
}
Modified: trunk/libs/utility/test/string_ref_test1.cpp
==============================================================================
--- trunk/libs/utility/test/string_ref_test1.cpp (original)
+++ trunk/libs/utility/test/string_ref_test1.cpp 2013-02-25 01:30:00 EST (Mon, 25 Feb 2013)
@@ -1,4 +1,4 @@
-/*
+/*
Copyright (c) Marshall Clow 2012-2012.
Distributed under the Boost Software License, Version 1.0. (See accompanying
@@ -33,30 +33,30 @@
string_ref sr3 ( p, 0 );
string_ref sr4 ( p );
sr4.clear ();
-
+
BOOST_CHECK ( sr1 == sr2 );
BOOST_CHECK ( sr1 == sr3 );
BOOST_CHECK ( sr2 == sr3 );
- BOOST_CHECK ( sr1 == sr4 );
+ BOOST_CHECK ( sr1 == sr4 );
}
// make sure that substrings work just like strings
void test_substr ( const std::string &str ) {
const size_t sz = str.size ();
string_ref ref ( str );
-
+
// Substrings at the end
for ( size_t i = 0; i <= sz; ++ i )
interop ( str.substr ( i ), ref.substr ( i ));
-
+
// Substrings at the beginning
for ( size_t i = 0; i <= sz; ++ i )
interop ( str.substr ( 0, i ), ref.substr ( 0, i ));
-
+
// All possible substrings
for ( size_t i = 0; i < sz; ++i )
for ( size_t j = i; j < sz; ++j )
- interop ( str.substr ( i, j ), ref.substr ( i, j ));
+ interop ( str.substr ( i, j ), ref.substr ( i, j ));
}
// make sure that removing prefixes and suffixes work just like strings
@@ -64,20 +64,20 @@
const size_t sz = str.size ();
std::string work;
string_ref ref;
-
+
for ( size_t i = 1; i <= sz; ++i ) {
work = str;
- ref = str;
+ ref = str;
while ( ref.size () >= i ) {
interop ( work, ref );
work.erase ( 0, i );
ref.remove_prefix (i);
}
}
-
+
for ( size_t i = 1; i < sz; ++ i ) {
work = str;
- ref = str;
+ ref = str;
while ( ref.size () >= i ) {
interop ( work, ref );
work.erase ( work.size () - i, i );
@@ -93,7 +93,7 @@
"0123456789",
NULL
};
-
+
BOOST_AUTO_TEST_CASE( test_main )
{
const char **p = &test_strings[0];
@@ -103,7 +103,7 @@
test_substr ( *p );
test_remove ( *p );
null_tests ( *p );
-
+
p++;
}
}
Modified: trunk/libs/utility/test/string_ref_test2.cpp
==============================================================================
--- trunk/libs/utility/test/string_ref_test2.cpp (original)
+++ trunk/libs/utility/test/string_ref_test2.cpp 2013-02-25 01:30:00 EST (Mon, 25 Feb 2013)
@@ -1,4 +1,4 @@
-/*
+/*
Copyright (c) Marshall Clow 2012-2012.
Distributed under the Boost Software License, Version 1.0. (See accompanying
@@ -46,7 +46,7 @@
BOOST_CHECK ( !sr2.ends_with ( ++ch ));
BOOST_CHECK ( sr2.ends_with ( string_ref ()));
}
-
+
void starts_with ( const char *arg ) {
const size_t sz = strlen ( arg );
string_ref sr ( arg );
@@ -85,9 +85,9 @@
// This helper function eliminates signed vs. unsigned warnings
string_ref::size_type ptr_diff ( const char *res, const char *base ) {
- BOOST_CHECK ( res >= base );
- return static_cast<string_ref::size_type> ( res - base );
- }
+ BOOST_CHECK ( res >= base );
+ return static_cast<string_ref::size_type> ( res - base );
+ }
void find ( const char *arg ) {
string_ref sr1;
@@ -102,7 +102,7 @@
BOOST_CHECK ( pos != string_ref::npos && ( pos <= ptr_diff ( p, arg )));
++p;
}
-
+
// Look for each character in the string (searching from the end)
p = arg;
sr1 = arg;
@@ -115,13 +115,13 @@
// Look for pairs on characters (searching from the start)
sr1 = arg;
p = arg;
- while ( *p && *(p+1)) {
- string_ref sr3 ( p, 2 );
- string_ref::size_type pos = sr1.find ( sr3 );
- BOOST_CHECK ( pos != string_ref::npos && pos <= static_cast<string_ref::size_type>( p - arg ));
- p++;
- }
-
+ while ( *p && *(p+1)) {
+ string_ref sr3 ( p, 2 );
+ string_ref::size_type pos = sr1.find ( sr3 );
+ BOOST_CHECK ( pos != string_ref::npos && pos <= static_cast<string_ref::size_type>( p - arg ));
+ p++;
+ }
+
sr1 = arg;
p = arg;
// for all possible chars, see if we find them in the right place.
@@ -166,7 +166,7 @@
sr1.remove_suffix (1);
--p;
}
-
+
// Find everything at the start
sr1 = arg;
p = arg;
@@ -187,7 +187,7 @@
sr1.remove_suffix (1);
--p;
}
-
+
// Basic sanity checking for "find_first_of / find_first_not_of"
sr1 = arg;
sr2 = arg;
@@ -212,7 +212,7 @@
BOOST_CHECK ( pos2 != pos1 );
++p;
}
-
+
// Basic sanity checking for "find_last_of / find_last_not_of"
sr1 = arg;
sr2 = arg;
@@ -234,7 +234,7 @@
BOOST_CHECK ( sr1[i] == *p );
BOOST_CHECK ( sr1 [ pos2 ] != *p );
}
-
+
BOOST_CHECK ( pos2 != pos1 );
++p;
}
@@ -244,50 +244,51 @@
void to_string ( const char *arg ) {
string_ref sr1;
- std::string str1;
- std::string str2;
+ std::string str1;
+ std::string str2;
- str1.assign ( arg );
- sr1 = arg;
+ str1.assign ( arg );
+ sr1 = arg;
// str2 = sr1.to_string<std::allocator<char> > ();
- str2 = sr1.to_string ();
- BOOST_CHECK ( str1 == str2 );
+ str2 = sr1.to_string ();
+ BOOST_CHECK ( str1 == str2 );
#ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
- std::string str3 = static_cast<std::string> ( sr1 );
- BOOST_CHECK ( str1 == str3 );
+ std::string str3 = static_cast<std::string> ( sr1 );
+ BOOST_CHECK ( str1 == str3 );
#endif
}
void compare ( const char *arg ) {
string_ref sr1;
- std::string str1;
- std::string str2 = str1;
+ std::string str1;
+ std::string str2 = str1;
- str1.assign ( arg );
- sr1 = arg;
- BOOST_CHECK ( sr1 == str1); // compare string and string_ref
- BOOST_CHECK ( str1 == sr1 ); // compare string_ref and string
- BOOST_CHECK ( sr1 == arg ); // compare string_ref and pointer
- BOOST_CHECK ( arg == sr1 ); // compare pointer and string_ref
-
- if ( sr1.size () > 0 ) {
- (*str1.rbegin())++;
- BOOST_CHECK ( sr1 != str1 );
- BOOST_CHECK ( str1 != sr1 );
- BOOST_CHECK ( sr1 < str1 );
- BOOST_CHECK ( sr1 <= str1 );
- BOOST_CHECK ( str1 > sr1 );
- BOOST_CHECK ( str1 >= sr1 );
-
- (*str1.rbegin()) -= 2;
- BOOST_CHECK ( sr1 != str1 );
- BOOST_CHECK ( str1 != sr1 );
- BOOST_CHECK ( sr1 > str1 );
- BOOST_CHECK ( sr1 >= str1 );
- BOOST_CHECK ( str1 < sr1 );
- BOOST_CHECK ( str1 <= sr1 );
- }
+ str1.assign ( arg );
+ sr1 = arg;
+ BOOST_CHECK ( sr1 == sr1); // compare string_ref and string_ref
+ BOOST_CHECK ( sr1 == str1); // compare string and string_ref
+ BOOST_CHECK ( str1 == sr1 ); // compare string_ref and string
+ BOOST_CHECK ( sr1 == arg ); // compare string_ref and pointer
+ BOOST_CHECK ( arg == sr1 ); // compare pointer and string_ref
+
+ if ( sr1.size () > 0 ) {
+ (*str1.rbegin())++;
+ BOOST_CHECK ( sr1 != str1 );
+ BOOST_CHECK ( str1 != sr1 );
+ BOOST_CHECK ( sr1 < str1 );
+ BOOST_CHECK ( sr1 <= str1 );
+ BOOST_CHECK ( str1 > sr1 );
+ BOOST_CHECK ( str1 >= sr1 );
+
+ (*str1.rbegin()) -= 2;
+ BOOST_CHECK ( sr1 != str1 );
+ BOOST_CHECK ( str1 != sr1 );
+ BOOST_CHECK ( sr1 > str1 );
+ BOOST_CHECK ( sr1 >= str1 );
+ BOOST_CHECK ( str1 < sr1 );
+ BOOST_CHECK ( str1 <= sr1 );
+ }
}
const char *test_strings [] = {
@@ -299,19 +300,19 @@
"abc\0asdfadsfasf",
NULL
};
-
+
BOOST_AUTO_TEST_CASE( test_main )
{
const char **p = &test_strings[0];
-
+
while ( *p != NULL ) {
starts_with ( *p );
ends_with ( *p );
reverse ( *p );
find ( *p );
to_string ( *p );
- compare ( *p );
-
+ compare ( *p );
+
p++;
}
}
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk