$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r76447 - in branches/release: boost/property_tree boost/property_tree/detail libs/property_tree libs/property_tree/test
From: sebastian.redl_at_[hidden]
Date: 2012-01-13 07:20:41
Author: cornedbee
Date: 2012-01-13 07:20:39 EST (Fri, 13 Jan 2012)
New Revision: 76447
URL: http://svn.boost.org/trac/boost/changeset/76447
Log:
Merge [72000],[72001],[72003], [74691], [75587], [75589], [75590], and [75593]
from trunk.
Fixes bug 4840.
Fixes bug 5259.
Fixes bug 5281, I think.
Fixes bug 5944.
Fixes bug 5757.
Fixes bug 5710.
Fixes bug 5307, I think.
Properties modified: 
   branches/release/boost/property_tree/   (props changed)
   branches/release/libs/property_tree/   (props changed)
Text files modified: 
   branches/release/boost/property_tree/detail/exception_implementation.hpp |     4 ++--                                    
   branches/release/boost/property_tree/detail/ptree_implementation.hpp     |    35 ++++++++++++++++++++++-------------     
   branches/release/boost/property_tree/detail/rapidxml.hpp                 |    11 ++++++-----                             
   branches/release/boost/property_tree/detail/xml_parser_read_rapidxml.hpp |     9 ++++++---                               
   branches/release/boost/property_tree/detail/xml_parser_write.hpp         |     7 +++++--                                 
   branches/release/boost/property_tree/exceptions.hpp                      |    10 ++++++----                              
   branches/release/boost/property_tree/string_path.hpp                     |     3 +++                                     
   branches/release/libs/property_tree/test/Jamfile.v2                      |    19 ++++++++++++-------                     
   branches/release/libs/property_tree/test/test_property_tree.cpp          |     4 ++++                                    
   branches/release/libs/property_tree/test/test_property_tree.hpp          |    25 +++++++++++++++++++++++++               
   branches/release/libs/property_tree/test/test_xml_parser_common.hpp      |     7 +++++++                                 
   branches/release/libs/property_tree/test/xml_parser_test_data.hpp        |     5 +++++                                   
   12 files changed, 103 insertions(+), 36 deletions(-)
Modified: branches/release/boost/property_tree/detail/exception_implementation.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/exception_implementation.hpp	(original)
+++ branches/release/boost/property_tree/detail/exception_implementation.hpp	2012-01-13 07:20:39 EST (Fri, 13 Jan 2012)
@@ -53,7 +53,7 @@
     }
 
     template<class D> inline
-    D ptree_bad_data::data()
+    D ptree_bad_data::data() const
     {
         return boost::any_cast<D>(m_data);
     }
@@ -73,7 +73,7 @@
     }
 
     template<class P> inline
-    P ptree_bad_path::path()
+    P ptree_bad_path::path() const
     {
         return boost::any_cast<P>(m_path);
     }
Modified: branches/release/boost/property_tree/detail/ptree_implementation.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/ptree_implementation.hpp	(original)
+++ branches/release/boost/property_tree/detail/ptree_implementation.hpp	2012-01-13 07:20:39 EST (Fri, 13 Jan 2012)
@@ -14,10 +14,13 @@
 #include <boost/iterator/iterator_adaptor.hpp>
 #include <boost/iterator/reverse_iterator.hpp>
 #include <boost/assert.hpp>
+#include <boost/utility/swap.hpp>
 #include <memory>
 
-#if defined(BOOST_MSVC) && \
-    (_MSC_FULL_VER >= 160000000 && _MSC_FULL_VER < 170000000)
+#if (defined(BOOST_MSVC) && \
+     (_MSC_FULL_VER >= 160000000 && _MSC_FULL_VER < 170000000)) || \
+    (defined(BOOST_INTEL_WIN) && \
+     defined(BOOST_DINKUMWARE_STDLIB))
 #define BOOST_PROPERTY_TREE_PAIR_BUG
 #endif
 
@@ -33,28 +36,23 @@
         // class. Unfortunately this does break the interface.
         BOOST_STATIC_CONSTANT(unsigned,
             first_offset = offsetof(value_type, first));
+#endif
         typedef multi_index_container<value_type,
             multi_index::indexed_by<
                 multi_index::sequenced<>,
                 multi_index::ordered_non_unique<multi_index::tag<by_name>,
+#if defined(BOOST_PROPERTY_TREE_PAIR_BUG)
                     multi_index::member_offset<value_type, const key_type,
                                         first_offset>,
-                    key_compare
-                >
-            >
-        > base_container;
 #else
-        typedef multi_index_container<value_type,
-            multi_index::indexed_by<
-                multi_index::sequenced<>,
-                multi_index::ordered_non_unique<multi_index::tag<by_name>,
                     multi_index::member<value_type, const key_type,
                                         &value_type::first>,
+#endif
                     key_compare
                 >
             >
         > base_container;
-#endif
+
         // The by-name lookup index.
         typedef typename base_container::template index<by_name>::type
             by_name_index;
@@ -213,7 +211,7 @@
     template<class K, class D, class C> inline
     void basic_ptree<K, D, C>::swap(basic_ptree<K, D, C> &rhs)
     {
-        m_data.swap(rhs.m_data);
+        boost::swap(m_data, rhs.m_data);
         // Void pointers, no ADL necessary
         std::swap(m_children, rhs.m_children);
     }
@@ -384,10 +382,21 @@
         subs::ch(this).reverse();
     }
 
+    namespace impl
+    {
+        struct by_first
+        {
+            template <typename P>
+            bool operator ()(const P& lhs, const P& rhs) const {
+              return lhs.first < rhs.first;
+            };
+        };
+    }
+
     template<class K, class D, class C> inline
     void basic_ptree<K, D, C>::sort()
     {
-        subs::ch(this).sort();
+        sort(impl::by_first());
     }
 
     template<class K, class D, class C>
Modified: branches/release/boost/property_tree/detail/rapidxml.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/rapidxml.hpp	(original)
+++ branches/release/boost/property_tree/detail/rapidxml.hpp	2012-01-13 07:20:39 EST (Fri, 13 Jan 2012)
@@ -369,8 +369,9 @@
     public:
 
         //! \cond internal
-        typedef void *(alloc_func)(std::size_t);       // Type of user-defined function used to allocate memory
-        typedef void (free_func)(void *);              // Type of user-defined function used to free memory
+        // Prefixed names to work around weird MSVC lookup bug.
+        typedef void *(boost_ptree_raw_alloc_func)(std::size_t);       // Type of user-defined function used to allocate memory
+        typedef void (boost_ptree_raw_free_func)(void *);              // Type of user-defined function used to free memory
         //! \endcond
         
         //! Constructs empty pool with default allocator functions.
@@ -536,7 +537,7 @@
         //! </code><br>
         //! \param af Allocation function, or 0 to restore default function
         //! \param ff Free function, or 0 to restore default function
-        void set_allocator(alloc_func *af, free_func *ff)
+        void set_allocator(boost_ptree_raw_alloc_func *af, boost_ptree_raw_free_func *ff)
         {
             BOOST_ASSERT(m_begin == m_static_memory && m_ptr == align(m_begin));    // Verify that no memory is allocated yet
             m_alloc_func = af;
@@ -617,8 +618,8 @@
         char *m_ptr;                                        // First free byte in current pool
         char *m_end;                                        // One past last available byte in current pool
         char m_static_memory[BOOST_PROPERTY_TREE_RAPIDXML_STATIC_POOL_SIZE];    // Static raw memory
-        alloc_func *m_alloc_func;                           // Allocator function, or 0 if default is to be used
-        free_func *m_free_func;                             // Free function, or 0 if default is to be used
+        boost_ptree_raw_alloc_func *m_alloc_func;           // Allocator function, or 0 if default is to be used
+        boost_ptree_raw_free_func *m_free_func;             // Free function, or 0 if default is to be used
     };
 
     ///////////////////////////////////////////////////////////////////////////
Modified: branches/release/boost/property_tree/detail/xml_parser_read_rapidxml.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/xml_parser_read_rapidxml.hpp	(original)
+++ branches/release/boost/property_tree/detail/xml_parser_read_rapidxml.hpp	2012-01-13 07:20:39 EST (Fri, 13 Jan 2012)
@@ -44,7 +44,8 @@
                     {
                         Ptree &pt_attr = pt_attr_root.push_back(
                             std::make_pair(attr->name(), Ptree()))->second;
-                        pt_attr.data() = attr->value();
+                        pt_attr.data() = std::basic_string<Ch>(attr->value(),
+                                                            attr->value_size());
                     }
                 }
 
@@ -63,7 +64,8 @@
                     pt.push_back(std::make_pair(xmltext<Ch>(),
                                                 Ptree(node->value())));
                 else
-                    pt.data() += node->value();
+                    pt.data() += std::basic_string<Ch>(node->value(),
+                                                       node->value_size());
             }
             break;
 
@@ -72,7 +74,8 @@
             {
                 if (!(flags & no_comments))
                     pt.push_back(std::make_pair(xmlcomment<Ch>(),
-                                                Ptree(node->value())));
+                                    Ptree(std::basic_string<Ch>(node->value(),
+                                                         node->value_size()))));
             }
             break;
 
Modified: branches/release/boost/property_tree/detail/xml_parser_write.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/xml_parser_write.hpp	(original)
+++ branches/release/boost/property_tree/detail/xml_parser_write.hpp	2012-01-13 07:20:39 EST (Fri, 13 Jan 2012)
@@ -115,8 +115,11 @@
                 // Write attributes
                 if (optional<const Ptree &> attribs = pt.get_child_optional(xmlattr<Ch>()))
                     for (It it = attribs.get().begin(); it != attribs.get().end(); ++it)
-                        stream << Ch(' ') << it->first << Ch('=') << 
-                                  Ch('"') << it->second.template get_value<std::basic_string<Ch> >() << Ch('"');
+                        stream << Ch(' ') << it->first << Ch('=')
+                               << Ch('"')
+                               << encode_char_entities(
+                                    it->second.template get_value<std::basic_string<Ch> >())
+                               << Ch('"');
 
                 if ( has_attrs_only )
                 {
Modified: branches/release/boost/property_tree/exceptions.hpp
==============================================================================
--- branches/release/boost/property_tree/exceptions.hpp	(original)
+++ branches/release/boost/property_tree/exceptions.hpp	2012-01-13 07:20:39 EST (Fri, 13 Jan 2012)
@@ -51,8 +51,9 @@
         ~ptree_bad_data() throw();
 
         /// Retrieve the data associated with this error. This is the source
-        /// value that failed to be translated.
-        template<class T> T data();
+        /// value that failed to be translated. You need to explicitly
+        /// specify its type.
+        template<class T> T data() const;
     private:
         boost::any m_data;
     };
@@ -71,8 +72,9 @@
 
         ~ptree_bad_path() throw();
 
-        /// Retrieve the invalid path.
-        template<class T> T path();
+        /// Retrieve the invalid path. You need to explicitly specify the
+        /// type of path.
+        template<class T> T path() const;
     private:
         boost::any m_path;
     };
Modified: branches/release/boost/property_tree/string_path.hpp
==============================================================================
--- branches/release/boost/property_tree/string_path.hpp	(original)
+++ branches/release/boost/property_tree/string_path.hpp	2012-01-13 07:20:39 EST (Fri, 13 Jan 2012)
@@ -122,6 +122,9 @@
         /// Test if the path contains a single element, i.e. no separators.
         bool single() const;
 
+        /// Get the separator used by this path.
+        char_type separator() const { return m_separator; }
+
         std::string dump() const {
             return detail::dump_sequence(m_value);
         }
Modified: branches/release/libs/property_tree/test/Jamfile.v2
==============================================================================
--- branches/release/libs/property_tree/test/Jamfile.v2	(original)
+++ branches/release/libs/property_tree/test/Jamfile.v2	2012-01-13 07:20:39 EST (Fri, 13 Jan 2012)
@@ -10,12 +10,17 @@
 import testing ;
 
 test-suite "property_tree"
-   : [ run test_property_tree.cpp /boost/serialization//boost_serialization ]
-     [ run test_info_parser.cpp ]
-     [ run test_json_parser.cpp ]
-     [ run test_ini_parser.cpp ]
-     [ run test_xml_parser_rapidxml.cpp ]
+   : [ run test_property_tree.cpp /boost/serialization//boost_serialization
+       : : : <define>_SCL_SECURE_NO_WARNINGS=1 ]
+     [ run test_info_parser.cpp
+       : : : <define>_SCL_SECURE_NO_WARNINGS=1 ]
+     [ run test_json_parser.cpp
+       : : : <define>_SCL_SECURE_NO_WARNINGS=1 ]
+     [ run test_ini_parser.cpp
+       : : : <define>_SCL_SECURE_NO_WARNINGS=1 ]
+     [ run test_xml_parser_rapidxml.cpp
+       : : : <define>_SCL_SECURE_NO_WARNINGS=1 ]
 
-     [ run test_multi_module1.cpp test_multi_module2.cpp ]
-     #[ run test_registry_parser.cpp ]
+     [ run test_multi_module1.cpp test_multi_module2.cpp
+       : : : <define>_SCL_SECURE_NO_WARNINGS=1 ]
 ;
Modified: branches/release/libs/property_tree/test/test_property_tree.cpp
==============================================================================
--- branches/release/libs/property_tree/test/test_property_tree.cpp	(original)
+++ branches/release/libs/property_tree/test/test_property_tree.cpp	2012-01-13 07:20:39 EST (Fri, 13 Jan 2012)
@@ -166,6 +166,7 @@
         test_serialization(pt);
         test_bool(pt);
         test_char(pt);
+        test_sort(pt);
         test_leaks(pt);                  // must be a final test
     }
 #if 0
@@ -199,6 +200,7 @@
         test_serialization(pt);
         test_bool(pt);
         test_char(pt);
+        test_sort(pt);
         test_leaks(pt);                  // must be a final test
     }
 #endif
@@ -232,6 +234,7 @@
         test_serialization(pt);
         test_bool(pt);
         test_char(pt);
+        test_sort(pt);
         test_leaks(pt);                  // must be a final test
     }
 
@@ -265,6 +268,7 @@
         test_serialization(pt);
         test_bool(pt);
         test_char(pt);
+        test_sort(pt);
         test_leaks(pt);                  // must be a final test
     }
 #endif
Modified: branches/release/libs/property_tree/test/test_property_tree.hpp
==============================================================================
--- branches/release/libs/property_tree/test/test_property_tree.hpp	(original)
+++ branches/release/libs/property_tree/test/test_property_tree.hpp	2012-01-13 07:20:39 EST (Fri, 13 Jan 2012)
@@ -1290,6 +1290,31 @@
 
 }
 
+void test_sort(PTREE *)
+{
+  PTREE pt;
+  pt.put(T("one"), T("v1"));
+  pt.put(T("two"), T("v2"));
+  pt.put(T("three"), T("v3"));
+  pt.put(T("four"), T("v4"));
+
+  pt.sort();
+
+  PTREE::iterator it = pt.begin();
+  BOOST_CHECK(std::distance(it, pt.end()) == 4);
+  BOOST_CHECK(it->first == T("four"));
+  BOOST_CHECK(it->second.data() == T("v4"));
+  ++it;
+  BOOST_CHECK(it->first == T("one"));
+  BOOST_CHECK(it->second.data() == T("v1"));
+  ++it;
+  BOOST_CHECK(it->first == T("three"));
+  BOOST_CHECK(it->second.data() == T("v3"));
+  ++it;
+  BOOST_CHECK(it->first == T("two"));
+  BOOST_CHECK(it->second.data() == T("v2"));
+}
+
 void test_leaks(PTREE *)
 {
     //BOOST_CHECK(PTREE::debug_get_instances_count() == 0);
Modified: branches/release/libs/property_tree/test/test_xml_parser_common.hpp
==============================================================================
--- branches/release/libs/property_tree/test/test_xml_parser_common.hpp	(original)
+++ branches/release/libs/property_tree/test/test_xml_parser_common.hpp	2012-01-13 07:20:39 EST (Fri, 13 Jan 2012)
@@ -139,6 +139,13 @@
         3, 4 * umlautsize<char_type>(), 13
     );
 
+    generic_parser_test_ok<Ptree, ReadFuncWS, WriteFuncWS>
+    (
+        ReadFuncWS(), WriteFuncWS(), bug_data_pr4840, NULL,
+        "testpr4840.xml", NULL, "testpr4840out.xml",
+        4, 13, 15
+    );
+
 }
 
 #endif
Modified: branches/release/libs/property_tree/test/xml_parser_test_data.hpp
==============================================================================
--- branches/release/libs/property_tree/test/xml_parser_test_data.hpp	(original)
+++ branches/release/libs/property_tree/test/xml_parser_test_data.hpp	2012-01-13 07:20:39 EST (Fri, 13 Jan 2012)
@@ -773,4 +773,9 @@
     "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
     "<name>\xD0\xAE\xD0\xBD\xD0\xB8\xD1\x82</name>";
 
+// Quoting attributes
+const char *bug_data_pr4840 =
+    "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+    "<start a=\"hello "world"\"/>";
+
 #endif