Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r56066 - in trunk/boost/property_tree: . detail
From: sebastian.redl_at_[hidden]
Date: 2009-09-06 10:35:37


Author: cornedbee
Date: 2009-09-06 10:35:37 EDT (Sun, 06 Sep 2009)
New Revision: 56066
URL: http://svn.boost.org/trac/boost/changeset/56066

Log:
Hopefully fix all MSVC errors, and maybe even the Borland errors.
Text files modified:
   trunk/boost/property_tree/detail/ptree_implementation.hpp | 19 ++++++++++++-----
   trunk/boost/property_tree/stream_translator.hpp | 41 ++++++++++++++++++++++++++++++++++++---
   2 files changed, 50 insertions(+), 10 deletions(-)

Modified: trunk/boost/property_tree/detail/ptree_implementation.hpp
==============================================================================
--- trunk/boost/property_tree/detail/ptree_implementation.hpp (original)
+++ trunk/boost/property_tree/detail/ptree_implementation.hpp 2009-09-06 10:35:37 EDT (Sun, 06 Sep 2009)
@@ -55,19 +55,22 @@
         iterator, typename subs::base_container::iterator, value_type>
     {
         friend class boost::iterator_core_access;
+ typedef boost::iterator_adaptor<
+ iterator, typename subs::base_container::iterator, value_type>
+ baset;
     public:
+ typedef typename baset::reference reference;
         iterator() {}
         explicit iterator(typename iterator::base_type b)
             : iterator::iterator_adaptor_(b)
         {}
- typename iterator::reference dereference() const
+ reference dereference() const
         {
             // multi_index doesn't allow modification of its values, because
             // indexes could sort by anything, and modification screws that up.
             // However, we only sort by the key, and it's protected against
             // modification in the value_type, so this const_cast is safe.
- return const_cast<typename iterator::reference>(
- *this->base_reference());
+ return const_cast<reference>(*this->base_reference());
         }
     };
     template <class K, class D, class C>
@@ -114,15 +117,19 @@
                                          value_type>
     {
         friend class boost::iterator_core_access;
+ typedef boost::iterator_adaptor<assoc_iterator,
+ typename subs::by_name_index::iterator,
+ value_type>
+ baset;
     public:
+ typedef typename baset::reference reference;
         assoc_iterator() {}
         explicit assoc_iterator(typename assoc_iterator::base_type b)
             : assoc_iterator::iterator_adaptor_(b)
         {}
- typename assoc_iterator::reference dereference() const
+ reference dereference() const
         {
- return const_cast<typename assoc_iterator::reference>(
- *this->base_reference());
+ return const_cast<reference>(*this->base_reference());
         }
     };
     template <class K, class D, class C>

Modified: trunk/boost/property_tree/stream_translator.hpp
==============================================================================
--- trunk/boost/property_tree/stream_translator.hpp (original)
+++ trunk/boost/property_tree/stream_translator.hpp 2009-09-06 10:35:37 EDT (Sun, 06 Sep 2009)
@@ -17,6 +17,7 @@
 #include <boost/optional/optional_io.hpp>
 #include <boost/utility/enable_if.hpp>
 #include <boost/type_traits/decay.hpp>
+#include <boost/type_traits/integral_constant.hpp>
 #include <sstream>
 #include <string>
 #include <locale>
@@ -52,12 +53,44 @@
         }
     };
 
+ // Ugly workaround for numeric_traits that don't have members when not
+ // specialized, e.g. MSVC.
+ namespace detail
+ {
+ template <bool is_specialized>
+ struct is_inexact_impl
+ {
+ template <typename T>
+ struct test
+ {
+ typedef boost::false_type type;
+ };
+ };
+ template <>
+ struct is_inexact_impl<true>
+ {
+ template <typename T>
+ struct test
+ {
+ typedef boost::integral_constant<bool,
+ !std::numeric_limits<T>::is_exact> type;
+ };
+ };
+
+ template <typename F>
+ struct is_inexact
+ {
+ typedef typename boost::decay<F>::type decayed;
+ typedef typename is_inexact_impl<
+ std::numeric_limits<decayed>::is_specialized
+ >::BOOST_NESTED_TEMPLATE test<decayed>::type type;
+ static const bool value = type::value;
+ };
+ }
+
     template <typename Ch, typename Traits, typename F>
     struct customize_stream<Ch, Traits, F,
- typename boost::enable_if_c<
- std::numeric_limits<typename boost::decay<F>::type>::is_specialized
- && !std::numeric_limits<typename boost::decay<F>::type>::is_exact
- >::type
+ typename boost::enable_if< detail::is_inexact<F> >::type
>
     {
         static void insert(std::basic_ostream<Ch, Traits>& s, const F& e) {


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