Squashed 'third_party/boostorg/serialization/' content from commit 738695b

Change-Id: I48528198ad1f62b90288d249eb2243d4db02fd5d
git-subtree-dir: third_party/boostorg/serialization
git-subtree-split: 738695b70733f9d592a570fb17a505d6a029b48a
diff --git a/performance/performance_codecvt_null.cpp b/performance/performance_codecvt_null.cpp
new file mode 100644
index 0000000..70dd573
--- /dev/null
+++ b/performance/performance_codecvt_null.cpp
@@ -0,0 +1,136 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// test_codecvt_null.cpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// Use, modification and distribution is subject to 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)
+
+// should pass compilation and execution.  Note: compilation with compilers
+// which use wchar_t as 2 byte objects will emit warnings.  These should be
+// ignored.
+
+#include <algorithm>
+#include <fstream>
+#include <iostream>
+#include <iterator>
+#include <locale>
+#include <vector>
+#include <cstddef>
+
+#include <cstdio> // remove
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::remove;
+}
+#endif
+
+#include "test_tools.hpp"
+
+#include <boost/archive/add_facet.hpp>
+#include <boost/archive/codecvt_null.hpp>
+#include <boost/archive/iterators/ostream_iterator.hpp>
+#include <boost/archive/iterators/istream_iterator.hpp>
+
+template<std::size_t S>
+struct test_data
+{
+    static wchar_t wchar_encoding[];
+};
+
+template<>
+wchar_t test_data<2>::wchar_encoding[] = {
+    0x0001,
+    0x007f,
+    0x0080,
+    0x07ff,
+    0x0800,
+    0x7fff
+};
+
+template<>
+wchar_t test_data<4>::wchar_encoding[] = {
+    0x00000001,
+    0x0000007f,
+    0x00000080,
+    0x000007ff,
+    0x00000800,
+    0x0000ffff,
+    0x00010000,
+    0x0010ffff,
+    0x001fffff,
+    0x00200000,
+    0x03ffffff,
+    0x04000000,
+    0x7fffffff
+};
+
+#include <iostream>
+
+int test_main( int /* argc */, char* /* argv */[] ) {
+    const char * testfile = boost::archive::tmpnam(NULL);
+    BOOST_REQUIRE(NULL != testfile);
+
+    std::locale old_loc;
+    std::locale * null_locale = 
+        boost::archive::add_facet(old_loc, new boost::archive::codecvt_null<wchar_t>);
+
+    typedef test_data<sizeof(wchar_t)> td;
+    {
+        std::wofstream ofs;
+        ofs.imbue(*null_locale);
+        ofs.open(testfile, std::ios::binary);
+        std::copy(
+            td::wchar_encoding,
+            #if ! defined(__BORLANDC__)
+                // borland 5.60 complains about this
+                td::wchar_encoding + sizeof(td::wchar_encoding)/sizeof(wchar_t),
+            #else
+                // so use this instead
+                td::wchar_encoding + 6,
+            #endif
+            boost::archive::iterators::ostream_iterator<wchar_t>(ofs)
+        );
+    }
+    bool ok = false;
+    {
+        std::wifstream ifs;
+        ifs.imbue(*null_locale);
+        ifs.open(testfile, std::ios::binary);
+        ok = std::equal(
+            td::wchar_encoding,
+            #if ! defined(__BORLANDC__)
+                // borland 5.60 complains about this
+                td::wchar_encoding + sizeof(td::wchar_encoding)/sizeof(wchar_t),
+            #else
+                // so use this instead
+                td::wchar_encoding + 6,
+            #endif
+            boost::archive::iterators::istream_iterator<wchar_t>(ifs)
+        );
+    }
+
+    BOOST_CHECK(ok);
+    {
+        std::wofstream ofs("testfile2");
+        ofs.imbue(*null_locale);
+        int i = 10;
+        ofs << i;
+        ofs.close();
+        
+        std::wifstream ifs("testfile2");
+        ifs.imbue(*null_locale);
+        int i2;
+        ifs >> i2;
+        std::cout << "i=" << i << std::endl;
+        std::cout << "i2=" << i2 << std::endl;
+        BOOST_CHECK(i == i2);
+        ifs.close();
+    }
+ 
+    delete null_locale;
+    std::remove(testfile);
+    return EXIT_SUCCESS;
+}
+