Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r83403 - in branches/release: . boost boost/utility libs libs/utility libs/utility/test
From: eric_at_[hidden]
Date: 2013-03-10 17:18:51


Author: eric_niebler
Date: 2013-03-10 17:18:49 EDT (Sun, 10 Mar 2013)
New Revision: 83403
URL: http://svn.boost.org/trac/boost/changeset/83403

Log:
merge [82901], [82902], and [83147] from trunk
Properties modified:
   branches/release/ (props changed)
   branches/release/boost/ (props changed)
   branches/release/boost/utility/ (props changed)
   branches/release/libs/ (props changed)
   branches/release/libs/utility/ (props changed)
Text files modified:
   branches/release/boost/utility/string_ref.hpp | 264 +++++++++++++++++++++++++++++----------
   branches/release/libs/utility/test/string_ref_test1.cpp | 26 +-
   branches/release/libs/utility/test/string_ref_test2.cpp | 108 ++++++++++++---
   3 files changed, 295 insertions(+), 103 deletions(-)

Modified: branches/release/boost/utility/string_ref.hpp
==============================================================================
--- branches/release/boost/utility/string_ref.hpp (original)
+++ branches/release/boost/utility/string_ref.hpp 2013-03-10 17:18:49 EDT (Sun, 10 Mar 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>
@@ -35,7 +35,7 @@
             charT ch_;
             };
         }
-
+
     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;
@@ -47,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:
@@ -63,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) {}
@@ -76,7 +76,7 @@
             len_ = rhs.len_;
             return *this;
             }
-
+
         basic_string_ref(const charT* str)
             : ptr_(str), len_(traits::length(str)) {}
 
@@ -93,7 +93,11 @@
             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_ );
+ }
+
         // iterators
         BOOST_CONSTEXPR const_iterator begin() const { return ptr_; }
         BOOST_CONSTEXPR const_iterator cbegin() const { return ptr_; }
@@ -103,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]; }
 
@@ -118,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) {
@@ -131,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 {
@@ -153,78 +157,78 @@
                 basic_string_ref ( data() + pos, n == npos || pos + n > size() ? size() - pos : n );
 #endif
             }
-
+
         int compare(basic_string_ref x) const {
- int cmp = traits::compare ( ptr_, x.ptr_, (std::min)(len_, x.len_));
+ 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 );
+ 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
- ( this->cbegin (), this->cend (), s.cbegin (), s.cend (), traits::eq );
+ 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 ))
@@ -237,55 +241,181 @@
         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
+
+
+// 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, 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;
+ }
+
+// 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, 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;
+ }
+
+// Less than
     template<typename charT, typename traits>
     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, 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;
+ }
+
+// Greater than
     template<typename charT, typename traits>
     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, 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;
+ }
+
+// Less than or equal to
     template<typename charT, typename traits>
     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, 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;
+ }
+
+// Greater than or equal to
     template<typename charT, typename traits>
     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, 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>&
@@ -299,7 +429,7 @@
 #endif
         return os;
         }
-
+
 #if 0
     // numeric conversions
     //
@@ -309,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: branches/release/libs/utility/test/string_ref_test1.cpp
==============================================================================
--- branches/release/libs/utility/test/string_ref_test1.cpp (original)
+++ branches/release/libs/utility/test/string_ref_test1.cpp 2013-03-10 17:18:49 EDT (Sun, 10 Mar 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: branches/release/libs/utility/test/string_ref_test2.cpp
==============================================================================
--- branches/release/libs/utility/test/string_ref_test2.cpp (original)
+++ branches/release/libs/utility/test/string_ref_test2.cpp 2013-03-10 17:18:49 EDT (Sun, 10 Mar 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;
@@ -95,22 +95,32 @@
     const char *p;
 
 // Look for each character in the string(searching from the start)
- p = arg;
- sr1 = arg;
- while ( *p ) {
- string_ref::size_type pos = sr1.find(*p);
- BOOST_CHECK ( pos != string_ref::npos && ( pos <= ptr_diff ( p, arg )));
- ++p;
- }
-
+ p = arg;
+ sr1 = arg;
+ while ( *p ) {
+ string_ref::size_type pos = sr1.find(*p);
+ 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;
     while ( *p ) {
- string_ref::size_type pos = sr1.rfind(*p);
- BOOST_CHECK ( pos != string_ref::npos && pos < sr1.size () && ( pos >= ptr_diff ( p, arg )));
- ++p;
- }
+ string_ref::size_type pos = sr1.rfind(*p);
+ BOOST_CHECK ( pos != string_ref::npos && pos < sr1.size () && ( pos >= ptr_diff ( p, arg )));
+ ++p;
+ }
+
+// 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++;
+ }
 
     sr1 = arg;
     p = arg;
@@ -156,7 +166,7 @@
         sr1.remove_suffix (1);
         --p;
         }
-
+
 // Find everything at the start
     sr1 = arg;
     p = arg;
@@ -177,7 +187,7 @@
         sr1.remove_suffix (1);
         --p;
         }
-
+
 // Basic sanity checking for "find_first_of / find_first_not_of"
     sr1 = arg;
     sr2 = arg;
@@ -202,7 +212,7 @@
         BOOST_CHECK ( pos2 != pos1 );
         ++p;
         }
-
+
 // Basic sanity checking for "find_last_of / find_last_not_of"
     sr1 = arg;
     sr2 = arg;
@@ -224,13 +234,63 @@
                 BOOST_CHECK ( sr1[i] == *p );
             BOOST_CHECK ( sr1 [ pos2 ] != *p );
             }
-
+
         BOOST_CHECK ( pos2 != pos1 );
         ++p;
         }
 
     }
 
+
+void to_string ( const char *arg ) {
+ string_ref sr1;
+ std::string str1;
+ std::string str2;
+
+ str1.assign ( arg );
+ sr1 = arg;
+// str2 = sr1.to_string<std::allocator<char> > ();
+ 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 );
+#endif
+ }
+
+void compare ( const char *arg ) {
+ string_ref sr1;
+ std::string str1;
+ std::string str2 = str1;
+
+ 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 [] = {
     "",
     "0",
@@ -240,16 +300,18 @@
     "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 );
 
         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