$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r85690 - in trunk: boost/range libs/range/test
From: neil_at_[hidden]
Date: 2013-09-15 17:54:32
Author: neilgroves
Date: 2013-09-15 17:54:32 EDT (Sun, 15 Sep 2013)
New Revision: 85690
URL: http://svn.boost.org/trac/boost/changeset/85690
Log:
[boost][range] Ticket 8702 - size_type detection
Text files modified: 
   trunk/boost/range/size_type.hpp          |    13 ++-                                     
   trunk/libs/range/test/extension_size.cpp |   143 ++++++++++++++++++++++++++++++++++++++- 
   2 files changed, 147 insertions(+), 9 deletions(-)
Modified: trunk/boost/range/size_type.hpp
==============================================================================
--- trunk/boost/range/size_type.hpp	Sun Sep 15 15:54:19 2013	(r85689)
+++ trunk/boost/range/size_type.hpp	2013-09-15 17:54:32 EDT (Sun, 15 Sep 2013)	(r85690)
@@ -17,6 +17,7 @@
 
 #include <boost/range/config.hpp>
 #include <boost/range/difference_type.hpp>
+#include <boost/range/concepts.hpp>
 #ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 #include <boost/range/detail/size_type.hpp>
 #else
@@ -45,8 +46,8 @@
             template<typename C>
             static yes_type test(BOOST_DEDUCED_TYPENAME C::size_type x);
 
-            template<typename C, typename Arg>
-            static no_type test(Arg x);
+            template<typename C>
+            static no_type test(...);
 
         public:
             static const bool value = sizeof(test<T>(0)) == sizeof(yes_type);
@@ -74,12 +75,16 @@
     template< class T >
     struct range_size :
         detail::range_size<T>
-    { };
+    {
+        BOOST_RANGE_CONCEPT_ASSERT((boost::SinglePassRangeConcept<T>));
+    };
 
     template< class T >
     struct range_size<const T >
         : detail::range_size<T>
-    { };
+    {
+        BOOST_RANGE_CONCEPT_ASSERT((boost::SinglePassRangeConcept<T>));
+    };
 
 } // namespace boost
 
Modified: trunk/libs/range/test/extension_size.cpp
==============================================================================
--- trunk/libs/range/test/extension_size.cpp	Sun Sep 15 15:54:19 2013	(r85689)
+++ trunk/libs/range/test/extension_size.cpp	2013-09-15 17:54:32 EDT (Sun, 15 Sep 2013)	(r85690)
@@ -19,6 +19,7 @@
 #include <boost/range.hpp>
 #include <boost/test/test_tools.hpp>
 #include <boost/test/unit_test.hpp>
+#include <boost/static_assert.hpp>
 #include <list>
 #include <vector>
 
@@ -27,6 +28,13 @@
     class FooWithoutSize
     {
         typedef std::list<int> impl_t;
+        
+        BOOST_STATIC_ASSERT((
+            boost::is_same<
+                boost::range_size<std::list<int> >::type,
+                std::list<int>::size_type
+            >::value));
+        
         typedef impl_t::const_iterator const_iterator;
         typedef impl_t::iterator iterator;
 
@@ -39,12 +47,117 @@
     private:
         impl_t m_impl;
     };
-
-    inline boost::range_size<std::list<int> >::type
-    range_calculate_size(const FooWithoutSize& rng)
+    
+    template<typename SizeType>
+    class FooWithSize
     {
-        return 2u;
-    }
+    public:
+        typedef SizeType size_type;
+        typedef boost::uint8_t* iterator;
+        typedef const boost::uint8_t* const_iterator;
+        
+        const_iterator begin() const;
+        iterator begin();
+        const_iterator end() const;
+        iterator end();
+    };
+    
+    BOOST_STATIC_ASSERT((
+        boost::is_same<
+            boost::uint8_t,
+            boost::range_size<FooWithSize<boost::uint8_t> >::type
+        >::value
+    ));
+    
+    BOOST_STATIC_ASSERT((
+        boost::is_same<
+            boost::uint16_t,
+            boost::range_size<FooWithSize<boost::uint16_t> >::type
+        >::value
+    ));
+    
+    BOOST_STATIC_ASSERT((
+        boost::is_same<
+            boost::uint32_t,
+            boost::range_size<FooWithSize<boost::uint32_t> >::type
+        >::value
+    ));
+    
+    BOOST_STATIC_ASSERT((
+        boost::is_same<
+            boost::uint64_t,
+            boost::range_size<FooWithSize<boost::uint64_t> >::type
+        >::value
+    ));
+    
+    class UdtSizeType
+    {
+    public:
+        typedef boost::uint16_t value_type;
+        
+        UdtSizeType() : value_(0) { }
+        UdtSizeType(value_type value) : value_(value) { }
+        
+        operator value_type() const { return value_; }
+        
+    private:
+        value_type value_;
+    };
+    
+    BOOST_STATIC_ASSERT((
+        boost::is_same<
+            UdtSizeType,
+            boost::range_size<FooWithSize<UdtSizeType> >::type
+        >::value
+    ));
+    
+    class Foo2WithoutSize
+    {
+    public:
+        struct const_iterator
+        {
+            typedef std::forward_iterator_tag iterator_category;
+            typedef boost::int8_t difference_type;
+            typedef boost::int16_t value_type;
+            typedef value_type* pointer;
+            typedef value_type& reference;
+            
+            reference operator*() const;
+            pointer operator->() const;
+            const_iterator& operator++();
+            const_iterator operator++(int);
+            bool operator==(const const_iterator&) const;
+            bool operator!=(const const_iterator&) const;
+        };
+        
+        struct iterator : const_iterator
+        {
+            typedef const value_type* pointer;
+            typedef const value_type& reference;
+            
+            reference operator*() const;
+            pointer operator->() const;
+            
+            iterator& operator++();
+            iterator operator++(int);
+            
+            bool operator==(const iterator&) const;
+            bool operator!=(const iterator&) const;
+        };
+        
+        const_iterator begin() const;
+        iterator begin();
+        const_iterator end() const;
+        iterator end();
+    };
+    
+    BOOST_STATIC_ASSERT((
+        boost::is_same<
+            boost::uint8_t,
+            boost::range_size<
+                ::boost_range_extension_size_test::Foo2WithoutSize>::type
+        >::value
+    ));
 }
 
 namespace boost
@@ -60,6 +173,26 @@
     };
 }
 
+namespace boost_range_extension_size_test
+{
+    inline boost::range_size<FooWithoutSize>::type
+    range_calculate_size(const FooWithoutSize& rng)
+    {
+        return 2u;
+    }
+}
+
+BOOST_STATIC_ASSERT((
+    boost::is_same<
+        typename boost::make_unsigned<std::ptrdiff_t>::type,
+        typename boost::range_size<
+                    boost_range_extension_size_test::FooWithoutSize>::type
+    >::value
+));
+
+typedef boost::make_unsigned<std::ptrdiff_t>::type t1;
+typedef boost::range_size<boost_range_extension_size_test::FooWithoutSize>::type t1;
+
 namespace
 {