$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r60666 - in branches/release: boost/iostreams boost/iostreams/filter libs/iostreams libs/iostreams/src libs/iostreams/test
From: daniel_james_at_[hidden]
Date: 2010-03-16 20:23:33
Author: danieljames
Date: 2010-03-16 20:23:32 EDT (Tue, 16 Mar 2010)
New Revision: 60666
URL: http://svn.boost.org/trac/boost/changeset/60666
Log:
Merge iostreams.
 - Fix write_device_impl<ostream_tag>. Fixes #3839
 - Fix error checks after calling SetFilePointer. Fixes #3953
 - Gzip filter shouldn't require its source to be peekable. Fixes #3723.
 - In `position_to_offset`, only cast to `stream_offset` after calculating
   `_Myoff`. Fixes #3969.
 - ptrdiff_t is in std. Fixes #2505.
Properties modified: 
   branches/release/boost/iostreams/   (props changed)
   branches/release/libs/iostreams/   (props changed)
Text files modified: 
   branches/release/boost/iostreams/filter/gzip.hpp                  |     6 +++-                                    
   branches/release/boost/iostreams/positioning.hpp                  |     6 +++-                                    
   branches/release/boost/iostreams/write.hpp                        |     2                                         
   branches/release/libs/iostreams/src/mapped_file.cpp               |    14 ++++++----                              
   branches/release/libs/iostreams/test/grep_test.cpp                |     2                                         
   branches/release/libs/iostreams/test/gzip_test.cpp                |    18 +++++++++++++                           
   branches/release/libs/iostreams/test/mapped_file_test.cpp         |    17 +++++++++++++                           
   branches/release/libs/iostreams/test/newline_test.cpp             |    52 ++++++++++++++++++++++++++++++--------- 
   branches/release/libs/iostreams/test/stream_offset_64bit_test.cpp |    17 ++++++++++++                            
   9 files changed, 109 insertions(+), 25 deletions(-)
Modified: branches/release/boost/iostreams/filter/gzip.hpp
==============================================================================
--- branches/release/boost/iostreams/filter/gzip.hpp	(original)
+++ branches/release/boost/iostreams/filter/gzip.hpp	2010-03-16 20:23:32 EDT (Tue, 16 Mar 2010)
@@ -32,6 +32,7 @@
 #include <boost/iostreams/detail/adapter/range_adapter.hpp>
 #include <boost/iostreams/detail/char_traits.hpp>
 #include <boost/iostreams/detail/ios.hpp> // failure.
+#include <boost/iostreams/detail/error.hpp>
 #include <boost/iostreams/operations.hpp>
 #include <boost/iostreams/device/back_inserter.hpp>
 #include <boost/iostreams/filter/zlib.hpp>
@@ -531,10 +532,11 @@
         {
             if (offset_) {
                 putback_[--offset_] = c;
-                return true;
             } else {
-                return boost::iostreams::putback(src_, c);
+                boost::throw_exception(
+                    boost::iostreams::detail::bad_putback());
             }
+            return true;
         }
         void putback(const string_type& s)
         {
Modified: branches/release/boost/iostreams/positioning.hpp
==============================================================================
--- branches/release/boost/iostreams/positioning.hpp	(original)
+++ branches/release/boost/iostreams/positioning.hpp	2010-03-16 20:23:32 EDT (Tue, 16 Mar 2010)
@@ -102,8 +102,10 @@
 inline stream_offset position_to_offset(std::streampos pos)
 {
     return fpos_t_to_offset(streampos_to_fpos_t(pos)) +
-           static_cast<stream_offset>(static_cast<std::streamoff>(pos)) -
-           static_cast<stream_offset>(_FPOSOFF(streampos_to_fpos_t(pos)));
+        static_cast<stream_offset>(
+            static_cast<std::streamoff>(pos) -
+            _FPOSOFF(streampos_to_fpos_t(pos))
+        );
 }
 
 # endif // # ifndef BOOST_IOSTREAMS_HAS_DINKUMWARE_FPOS 
Modified: branches/release/boost/iostreams/write.hpp
==============================================================================
--- branches/release/boost/iostreams/write.hpp	(original)
+++ branches/release/boost/iostreams/write.hpp	2010-03-16 20:23:32 EDT (Tue, 16 Mar 2010)
@@ -83,7 +83,7 @@
     {
         typedef typename char_type_of<T>::type          char_type;
         typedef BOOST_IOSTREAMS_CHAR_TRAITS(char_type)  traits_type;
-        return !traits_type::eq_int_type( t.rdbuf()->s.sputc(),
+        return !traits_type::eq_int_type( t.rdbuf()->sputc(c),
                                           traits_type::eof() );
     }
 
Modified: branches/release/libs/iostreams/src/mapped_file.cpp
==============================================================================
--- branches/release/libs/iostreams/src/mapped_file.cpp	(original)
+++ branches/release/libs/iostreams/src/mapped_file.cpp	2010-03-16 20:23:32 EDT (Tue, 16 Mar 2010)
@@ -128,12 +128,13 @@
         cleanup_and_throw("failed unmapping file");
 #ifdef BOOST_IOSTREAMS_WINDOWS
     stream_offset offset = ::SetFilePointer(handle_, 0, NULL, FILE_CURRENT);
-    if (::GetLastError() != NO_ERROR)
-        cleanup_and_throw("failed querying file pointer");
+    if (offset == INVALID_SET_FILE_POINTER && ::GetLastError() != NO_ERROR)
+         cleanup_and_throw("failed querying file pointer");
     LONG sizehigh = (new_size >> (sizeof(LONG) * 8));
     LONG sizelow = (new_size & 0xffffffff);
-    ::SetFilePointer(handle_, sizelow, &sizehigh, FILE_BEGIN);
-    if (::GetLastError() != NO_ERROR || !::SetEndOfFile(handle_))
+    DWORD result = ::SetFilePointer(handle_, sizelow, &sizehigh, FILE_BEGIN);
+    if ((result == INVALID_SET_FILE_POINTER && ::GetLastError() != NO_ERROR)
+        || !::SetEndOfFile(handle_))
         cleanup_and_throw("failed resizing mapped file");
     sizehigh = (offset >> (sizeof(LONG) * 8));
     sizelow = (offset & 0xffffffff);
@@ -197,8 +198,9 @@
     if (p.new_file_size != 0 && !readonly) {
         LONG sizehigh = (p.new_file_size >> (sizeof(LONG) * 8));
         LONG sizelow = (p.new_file_size & 0xffffffff);
-        ::SetFilePointer(handle_, sizelow, &sizehigh, FILE_BEGIN);
-        if (::GetLastError() != NO_ERROR || !::SetEndOfFile(handle_))
+        DWORD result = ::SetFilePointer(handle_, sizelow, &sizehigh, FILE_BEGIN);
+        if ((result == INVALID_SET_FILE_POINTER && ::GetLastError() != NO_ERROR)
+            || !::SetEndOfFile(handle_))
             cleanup_and_throw("failed setting file size");
     }
 
Modified: branches/release/libs/iostreams/test/grep_test.cpp
==============================================================================
--- branches/release/libs/iostreams/test/grep_test.cpp	(original)
+++ branches/release/libs/iostreams/test/grep_test.cpp	2010-03-16 20:23:32 EDT (Tue, 16 Mar 2010)
@@ -253,7 +253,7 @@
                   const std::string& output )
 {
     // Count lines in output
-    ptrdiff_t count = std::count(output.begin(), output.end(), '\n');
+    std::ptrdiff_t count = std::count(output.begin(), output.end(), '\n');
 
     // Test as input filter
     {
Modified: branches/release/libs/iostreams/test/gzip_test.cpp
==============================================================================
--- branches/release/libs/iostreams/test/gzip_test.cpp	(original)
+++ branches/release/libs/iostreams/test/gzip_test.cpp	2010-03-16 20:23:32 EDT (Tue, 16 Mar 2010)
@@ -83,10 +83,28 @@
     BOOST_CHECK(std::equal(data.begin(), data.end(), dest.begin() + dest.size() / 2));
 }
 
+void array_source_test()
+{
+    std::string data = "simple test string.";
+    std::string encoded;
+
+    filtering_ostream out;
+    out.push(gzip_compressor());
+    out.push(io::back_inserter(encoded));
+    io::copy(make_iterator_range(data), out);
+
+    std::string res;
+    io::array_source src(encoded.data(),encoded.length());
+    io::copy(io::compose(io::gzip_decompressor(), src), io::back_inserter(res));
+    
+    BOOST_CHECK_EQUAL(data, res);
+}
+
 test_suite* init_unit_test_suite(int, char* []) 
 {
     test_suite* test = BOOST_TEST_SUITE("gzip test");
     test->add(BOOST_TEST_CASE(&compression_test));
     test->add(BOOST_TEST_CASE(&multiple_member_test));
+    test->add(BOOST_TEST_CASE(&array_source_test));
     return test;
 }
Modified: branches/release/libs/iostreams/test/mapped_file_test.cpp
==============================================================================
--- branches/release/libs/iostreams/test/mapped_file_test.cpp	(original)
+++ branches/release/libs/iostreams/test/mapped_file_test.cpp	2010-03-16 20:23:32 EDT (Tue, 16 Mar 2010)
@@ -175,6 +175,23 @@
         );
     }
 
+    //--------------Writing to a pre-existing file---------------------------//
+    {
+        // Test for Bug #3953 - writing to a pre-existing mapped file.
+        boost::iostreams::test::test_file  first, test;
+
+        mapped_file_params p(first.name());
+        p.new_file_size = boost::iostreams::test::data_reps * boost::iostreams::test::data_length();
+        boost::iostreams::stream<mapped_file_sink> out;
+        out.open(mapped_file_sink(p));
+        boost::iostreams::test::write_data_in_chars(out);
+        out.close();
+        BOOST_CHECK_MESSAGE(
+            boost::iostreams::test::compare_files(first.name(), test.name()),
+            "failed writing to pre-existing mapped file in chars"
+        );
+    }
+    
     //--------------Random access with a mapped_file--------------------------//
 
     {
Modified: branches/release/libs/iostreams/test/newline_test.cpp
==============================================================================
--- branches/release/libs/iostreams/test/newline_test.cpp	(original)
+++ branches/release/libs/iostreams/test/newline_test.cpp	2010-03-16 20:23:32 EDT (Tue, 16 Mar 2010)
@@ -163,30 +163,58 @@
     BOOST_CHECK(test_input_filter(newline_filter(newline::mac), mixed, mac));
 }
 
+// Verify that a filter works as expected with both a non-blocking sink
+// and a normal output stream.
+//
+// test_output_filter only tests for a non-blocking sink.
+// TODO: Other tests should probably test with an output stream.
+
+template<typename Filter>
+bool my_test_output_filter(Filter filter, 
+                         const std::string& input, 
+                         const std::string& output)
+{
+    const std::streamsize default_increment = 5;
+
+    for ( int inc = default_increment;
+          inc < default_increment * 40; 
+          inc += default_increment )
+    {
+        io::array_source src(input.data(), input.data() + input.size());
+
+        std::ostringstream stream;
+        io::copy(src, compose(filter, stream));
+        if (stream.str() != output )
+            return false;
+
+    }
+    return test_output_filter(filter, input, output);
+}
+
 void write_newline_filter()
 {
     using namespace io;
 
         // Test converting to posix format.
 
-    BOOST_CHECK(test_output_filter(newline_filter(newline::posix), posix, posix));
-    BOOST_CHECK(test_output_filter(newline_filter(newline::posix), dos, posix));
-    BOOST_CHECK(test_output_filter(newline_filter(newline::posix), mac, posix));
-    BOOST_CHECK(test_output_filter(newline_filter(newline::posix), mixed, posix));
+    BOOST_CHECK(my_test_output_filter(newline_filter(newline::posix), posix, posix));
+    BOOST_CHECK(my_test_output_filter(newline_filter(newline::posix), dos, posix));
+    BOOST_CHECK(my_test_output_filter(newline_filter(newline::posix), mac, posix));
+    BOOST_CHECK(my_test_output_filter(newline_filter(newline::posix), mixed, posix));
 
         // Test converting to dos format.
 
-    BOOST_CHECK(test_output_filter(newline_filter(newline::dos), posix, dos));
-    BOOST_CHECK(test_output_filter(newline_filter(newline::dos), dos, dos));
-    BOOST_CHECK(test_output_filter(newline_filter(newline::dos), mac, dos));
-    BOOST_CHECK(test_output_filter(newline_filter(newline::dos), mixed, dos));
+    BOOST_CHECK(my_test_output_filter(newline_filter(newline::dos), posix, dos));
+    BOOST_CHECK(my_test_output_filter(newline_filter(newline::dos), dos, dos));
+    BOOST_CHECK(my_test_output_filter(newline_filter(newline::dos), mac, dos));
+    BOOST_CHECK(my_test_output_filter(newline_filter(newline::dos), mixed, dos));
 
         // Test converting to mac format.
 
-    BOOST_CHECK(test_output_filter(newline_filter(newline::mac), posix, mac));
-    BOOST_CHECK(test_output_filter(newline_filter(newline::mac), dos, mac));
-    BOOST_CHECK(test_output_filter(newline_filter(newline::mac), mac, mac));
-    BOOST_CHECK(test_output_filter(newline_filter(newline::mac), mixed, mac));
+    BOOST_CHECK(my_test_output_filter(newline_filter(newline::mac), posix, mac));
+    BOOST_CHECK(my_test_output_filter(newline_filter(newline::mac), dos, mac));
+    BOOST_CHECK(my_test_output_filter(newline_filter(newline::mac), mac, mac));
+    BOOST_CHECK(my_test_output_filter(newline_filter(newline::mac), mixed, mac));
 }
 
 void test_input_against_flags(int flags, const std::string& input, bool read)
Modified: branches/release/libs/iostreams/test/stream_offset_64bit_test.cpp
==============================================================================
--- branches/release/libs/iostreams/test/stream_offset_64bit_test.cpp	(original)
+++ branches/release/libs/iostreams/test/stream_offset_64bit_test.cpp	2010-03-16 20:23:32 EDT (Tue, 16 Mar 2010)
@@ -56,15 +56,30 @@
               << hex
               << static_cast<unsigned int>(off >> 32) 
               << " and (off & 0xFFFFFFFF) == 0x"
-              << static_cast<unsigned int>(off & 0xFFFFFFFF);
+              << static_cast<unsigned int>(off & 0xFFFFFFFF)
+	      << std::endl;
             BOOST_REQUIRE_MESSAGE(0, s.str().c_str());
         }
     }
 }
 
+void stream_offset_64bit_test2()
+{
+    boost::int64_t val = boost::int64_t(1) << 31;
+    std::streampos pos = boost::iostreams::offset_to_position(val);
+    pos -= 2;
+    BOOST_CHECK_EQUAL(val - 2, boost::iostreams::position_to_offset(pos));
+
+    val = -val;
+    pos = boost::iostreams::offset_to_position(val);
+    pos += 2;
+    BOOST_CHECK_EQUAL(val + 2, boost::iostreams::position_to_offset(pos));
+}
+
 test_suite* init_unit_test_suite(int, char* [])
 {
     test_suite* test = BOOST_TEST_SUITE("stream_offset 64-bit test");
     test->add(BOOST_TEST_CASE(&stream_offset_64bit_test));
+    test->add(BOOST_TEST_CASE(&stream_offset_64bit_test2));
     return test;
 }