Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r84674 - in branches/release: boost/utility libs/utility/test
From: andrey.semashev_at_[hidden]
Date: 2013-06-07 13:33:25


Author: andysem
Date: 2013-06-07 13:33:25 EDT (Fri, 07 Jun 2013)
New Revision: 84674
URL: http://svn.boost.org/trac/boost/changeset/84674

Log:
Merged changes from trunk. Fixes operator<< handling of width specification.

Added:
   branches/release/boost/utility/string_ref_fwd.hpp (props changed)
      - copied unchanged from r84673, trunk/boost/utility/string_ref_fwd.hpp
   branches/release/libs/utility/test/string_ref_test_io.cpp (props changed)
      - copied unchanged from r84673, trunk/libs/utility/test/string_ref_test_io.cpp
Properties modified:
   branches/release/boost/utility/string_ref.hpp (contents, props changed)
Text files modified:
   branches/release/boost/utility/string_ref.hpp | 178 +++++++++++++++++++++-----------------
   branches/release/boost/utility/string_ref_fwd.hpp | 37 ++++++++
   branches/release/libs/utility/test/Jamfile.v2 | 1
   branches/release/libs/utility/test/string_ref_test_io.cpp | 183 ++++++++++++++++++++++++++++++++++++++++
   4 files changed, 320 insertions(+), 79 deletions(-)

Modified: branches/release/boost/utility/string_ref.hpp
==============================================================================
--- branches/release/boost/utility/string_ref.hpp Fri Jun 7 11:38:10 2013 (r84673)
+++ branches/release/boost/utility/string_ref.hpp 2013-06-07 13:33:25 EDT (Fri, 07 Jun 2013) (r84674)
@@ -17,11 +17,15 @@
 
 #include <boost/config.hpp>
 #include <boost/detail/workaround.hpp>
+#include <boost/utility/string_ref_fwd.hpp>
+#include <boost/throw_exception.hpp>
 
+#include <cstddef>
 #include <stdexcept>
 #include <algorithm>
-#include <functional>
+#include <iterator>
 #include <string>
+#include <iosfwd>
 
 namespace boost {
 
@@ -36,18 +40,6 @@
             };
         }
 
- 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;
-
-#ifndef BOOST_NO_CXX11_CHAR16_T
- typedef basic_string_ref<char16_t, std::char_traits<char16_t> > u16string_ref;
-#endif
-
-#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:
@@ -61,7 +53,7 @@
         typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
         typedef const_reverse_iterator reverse_iterator;
         typedef std::size_t size_type;
- typedef ptrdiff_t difference_type;
+ typedef std::ptrdiff_t difference_type;
         static BOOST_CONSTEXPR_OR_CONST size_type npos = size_type(-1);
 
         // construct/copy
@@ -119,7 +111,7 @@
 
         const charT& at(size_t pos) const {
             if ( pos >= len_ )
- throw std::out_of_range ( "boost::string_ref::at" );
+ BOOST_THROW_EXCEPTION( std::out_of_range ( "boost::string_ref::at" ) );
             return ptr_[pos];
             }
 
@@ -144,18 +136,12 @@
 
 
         // basic_string_ref string operations
- BOOST_CONSTEXPR
         basic_string_ref substr(size_type pos, size_type n=npos) const {
-#if BOOST_WORKAROUND(BOOST_MSVC, <= 1600)
- // Looks like msvc 8 and 9 have a codegen bug when one branch of
- // a conditional operator is a throw expression. -EAN 2012/12/04
- if ( pos > size()) throw std::out_of_range ( "string_ref::substr" );
- if ( n == npos || pos + n > size()) n = size () - pos;
+ if ( pos > size())
+ BOOST_THROW_EXCEPTION( std::out_of_range ( "string_ref::substr" ) );
+ if ( n == npos || pos + n > size())
+ n = size () - pos;
             return basic_string_ref ( data() + pos, n );
-#else
- return pos > size() ? throw std::out_of_range ( "string_ref::substr" ) :
- basic_string_ref ( data() + pos, n == npos || pos + n > size() ? size() - pos : n );
-#endif
             }
 
         int compare(basic_string_ref x) const {
@@ -260,173 +246,207 @@
 // Comparison operators
 // Equality
     template<typename charT, typename traits>
- bool operator==(basic_string_ref<charT, traits> x, basic_string_ref<charT, traits> y) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline bool operator>=(const charT * x, basic_string_ref<charT, traits> y) {
         return basic_string_ref<charT, traits>(x) >= y;
         }
 
+ namespace detail {
+
+ template<class charT, class traits>
+ inline void insert_fill_chars(std::basic_ostream<charT, traits>& os, std::size_t n) {
+ enum { chunk_size = 8 };
+ charT fill_chars[chunk_size];
+ std::fill_n(fill_chars, static_cast< std::size_t >(chunk_size), os.fill());
+ for (; n >= chunk_size && os.good(); n -= chunk_size)
+ os.write(fill_chars, static_cast< std::size_t >(chunk_size));
+ if (n > 0 && os.good())
+ os.write(fill_chars, n);
+ }
+
+ template<class charT, class traits>
+ void insert_aligned(std::basic_ostream<charT, traits>& os, const basic_string_ref<charT,traits>& str) {
+ const std::size_t size = str.size();
+ const std::size_t alignment_size = static_cast< std::size_t >(os.width()) - size;
+ const bool align_left = (os.flags() & std::basic_ostream<charT, traits>::adjustfield) == std::basic_ostream<charT, traits>::left;
+ if (!align_left) {
+ detail::insert_fill_chars(os, alignment_size);
+ if (os.good())
+ os.write(str.data(), size);
+ }
+ else {
+ os.write(str.data(), size);
+ if (os.good())
+ detail::insert_fill_chars(os, alignment_size);
+ }
+ }
+
+ } // namespace detail
+
     // Inserter
     template<class charT, class traits>
- std::basic_ostream<charT, traits>&
+ inline std::basic_ostream<charT, traits>&
     operator<<(std::basic_ostream<charT, traits>& os, const basic_string_ref<charT,traits>& str) {
-#ifdef BOOST_NO_CXX11_RANGE_BASED_FOR
- for ( typename basic_string_ref<charT, traits>::const_iterator iter = str.begin (); iter != str.end (); ++iter )
- os << *iter;
-#else
- for ( charT x : str )
- os << x;
-#endif
+ if (os.good()) {
+ const std::size_t size = str.size();
+ const std::size_t w = static_cast< std::size_t >(os.width());
+ if (w <= size)
+ os.write(str.data(), size);
+ else
+ detail::insert_aligned(os, str);
+ os.width(0);
+ }
         return os;
         }
 
@@ -436,67 +456,67 @@
     // These are short-term implementations.
     // In a production environment, I would rather avoid the copying.
     //
- int stoi (string_ref str, size_t* idx=0, int base=10) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline 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) {
+ inline long double stold (wstring_ref str, size_t* idx=0) {
         return std::stold ( std::wstring(str), idx );
         }
 #endif

Copied: branches/release/boost/utility/string_ref_fwd.hpp (from r84673, trunk/boost/utility/string_ref_fwd.hpp)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ branches/release/boost/utility/string_ref_fwd.hpp 2013-06-07 13:33:25 EDT (Fri, 07 Jun 2013) (r84674, copy of r84673, trunk/boost/utility/string_ref_fwd.hpp)
@@ -0,0 +1,37 @@
+/*
+ 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
+
+*/
+
+#ifndef BOOST_STRING_REF_FWD_HPP
+#define BOOST_STRING_REF_FWD_HPP
+
+#include <boost/config.hpp>
+#include <string>
+
+namespace boost {
+
+ template<typename charT, typename traits = std::char_traits<charT> > 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;
+
+#ifndef BOOST_NO_CXX11_CHAR16_T
+ typedef basic_string_ref<char16_t, std::char_traits<char16_t> > u16string_ref;
+#endif
+
+#ifndef BOOST_NO_CXX11_CHAR32_T
+ typedef basic_string_ref<char32_t, std::char_traits<char32_t> > u32string_ref;
+#endif
+
+}
+
+#endif

Modified: branches/release/libs/utility/test/Jamfile.v2
==============================================================================
--- branches/release/libs/utility/test/Jamfile.v2 Fri Jun 7 11:38:10 2013 (r84673)
+++ branches/release/libs/utility/test/Jamfile.v2 2013-06-07 13:33:25 EDT (Fri, 07 Jun 2013) (r84674)
@@ -38,6 +38,7 @@
         [ run ../shared_iterator_test.cpp ]
         [ run string_ref_test1.cpp unit_test_framework ]
         [ run string_ref_test2.cpp unit_test_framework ]
+ [ run string_ref_test_io.cpp unit_test_framework ]
         [ run ../value_init_test.cpp ]
         [ run ../value_init_workaround_test.cpp ]
         [ run ../initialized_test.cpp ]

Copied: branches/release/libs/utility/test/string_ref_test_io.cpp (from r84673, trunk/libs/utility/test/string_ref_test_io.cpp)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ branches/release/libs/utility/test/string_ref_test_io.cpp 2013-06-07 13:33:25 EDT (Fri, 07 Jun 2013) (r84674, copy of r84673, trunk/libs/utility/test/string_ref_test_io.cpp)
@@ -0,0 +1,183 @@
+/*
+ * Copyright Andrey Semashev 2013.
+ * 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)
+ */
+/*!
+ * \file string_ref_test_io.cpp
+ * \author Andrey Semashev
+ * \date 26.05.2013
+ *
+ * \brief This header contains tests for stream operations of \c basic_string_ref.
+ */
+
+#define BOOST_TEST_MODULE string_ref_test_io
+
+#include <boost/utility/string_ref.hpp>
+
+#include <iomanip>
+#include <sstream>
+#include <algorithm>
+#include <iterator>
+#include <string>
+
+#include <boost/config.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/test/unit_test.hpp>
+
+typedef boost::mpl::vector<
+ char
+#if !defined(BOOST_NO_STD_WSTRING) && !defined(BOOST_NO_STD_WSTREAMBUF) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+ , wchar_t
+#endif
+/* Current implementations seem to be missing codecvt facets to convert chars to char16_t and char32_t even though the types are available.
+#if !defined(BOOST_NO_CXX11_CHAR16_T)
+ , char16_t
+#endif
+#if !defined(BOOST_NO_CXX11_CHAR32_T)
+ , char32_t
+#endif
+*/
+>::type char_types;
+
+static const char* test_strings[] =
+{
+ "begin",
+ "abcd",
+ "end"
+};
+
+//! The context with test data for particular character type
+template< typename CharT >
+struct context
+{
+ typedef CharT char_type;
+ typedef std::basic_string< char_type > string_type;
+ typedef std::basic_ostringstream< char_type > ostream_type;
+
+ string_type begin, abcd, end;
+
+ context()
+ {
+ boost::string_ref str = test_strings[0];
+ std::copy(str.begin(), str.end(), std::back_inserter(begin));
+
+ str = test_strings[1];
+ std::copy(str.begin(), str.end(), std::back_inserter(abcd));
+
+ str = test_strings[2];
+ std::copy(str.begin(), str.end(), std::back_inserter(end));
+ }
+};
+
+// Test regular output
+BOOST_AUTO_TEST_CASE_TEMPLATE(string_ref_output, CharT, char_types)
+{
+ typedef CharT char_type;
+ typedef std::basic_string< char_type > string_type;
+ typedef std::basic_ostringstream< char_type > ostream_type;
+ typedef boost::basic_string_ref< char_type > string_ref_type;
+
+ context< char_type > ctx;
+
+ ostream_type strm;
+ strm << string_ref_type(ctx.abcd);
+ BOOST_CHECK(strm.str() == ctx.abcd);
+}
+
+// Test support for padding
+BOOST_AUTO_TEST_CASE_TEMPLATE(padding, CharT, char_types)
+{
+ typedef CharT char_type;
+ typedef std::basic_string< char_type > string_type;
+ typedef std::basic_ostringstream< char_type > ostream_type;
+ typedef boost::basic_string_ref< char_type > string_ref_type;
+
+ context< char_type > ctx;
+
+ // Test for padding
+ {
+ ostream_type strm_ref;
+ strm_ref << ctx.begin << std::setw(8) << string_ref_type(ctx.abcd) << ctx.end;
+
+ ostream_type strm_correct;
+ strm_correct << ctx.begin << std::setw(8) << ctx.abcd << ctx.end;
+
+ BOOST_CHECK(strm_ref.str() == strm_correct.str());
+ }
+
+ // Test for long padding
+ {
+ ostream_type strm_ref;
+ strm_ref << ctx.begin << std::setw(100) << string_ref_type(ctx.abcd) << ctx.end;
+
+ ostream_type strm_correct;
+ strm_correct << ctx.begin << std::setw(100) << ctx.abcd << ctx.end;
+
+ BOOST_CHECK(strm_ref.str() == strm_correct.str());
+ }
+
+ // Test that short width does not truncate the string
+ {
+ ostream_type strm_ref;
+ strm_ref << ctx.begin << std::setw(1) << string_ref_type(ctx.abcd) << ctx.end;
+
+ ostream_type strm_correct;
+ strm_correct << ctx.begin << std::setw(1) << ctx.abcd << ctx.end;
+
+ BOOST_CHECK(strm_ref.str() == strm_correct.str());
+ }
+}
+
+// Test support for padding fill
+BOOST_AUTO_TEST_CASE_TEMPLATE(padding_fill, CharT, char_types)
+{
+ typedef CharT char_type;
+ typedef std::basic_string< char_type > string_type;
+ typedef std::basic_ostringstream< char_type > ostream_type;
+ typedef boost::basic_string_ref< char_type > string_ref_type;
+
+ context< char_type > ctx;
+
+ ostream_type strm_ref;
+ strm_ref << ctx.begin << std::setfill(static_cast< char_type >('x')) << std::setw(8) << string_ref_type(ctx.abcd) << ctx.end;
+
+ ostream_type strm_correct;
+ strm_correct << ctx.begin << std::setfill(static_cast< char_type >('x')) << std::setw(8) << ctx.abcd << ctx.end;
+
+ BOOST_CHECK(strm_ref.str() == strm_correct.str());
+}
+
+// Test support for alignment
+BOOST_AUTO_TEST_CASE_TEMPLATE(alignment, CharT, char_types)
+{
+ typedef CharT char_type;
+ typedef std::basic_string< char_type > string_type;
+ typedef std::basic_ostringstream< char_type > ostream_type;
+ typedef boost::basic_string_ref< char_type > string_ref_type;
+
+ context< char_type > ctx;
+
+ // Left alignment
+ {
+ ostream_type strm_ref;
+ strm_ref << ctx.begin << std::left << std::setw(8) << string_ref_type(ctx.abcd) << ctx.end;
+
+ ostream_type strm_correct;
+ strm_correct << ctx.begin << std::left << std::setw(8) << ctx.abcd << ctx.end;
+
+ BOOST_CHECK(strm_ref.str() == strm_correct.str());
+ }
+
+ // Right alignment
+ {
+ ostream_type strm_ref;
+ strm_ref << ctx.begin << std::right << std::setw(8) << string_ref_type(ctx.abcd) << ctx.end;
+
+ ostream_type strm_correct;
+ strm_correct << ctx.begin << std::right << std::setw(8) << ctx.abcd << ctx.end;
+
+ BOOST_CHECK(strm_ref.str() == strm_correct.str());
+ }
+}


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