$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r70709 - in branches/release: boost boost/bimap boost/gil boost/graph boost/icl boost/intrusive boost/iterator boost/msm boost/numeric/ublas boost/property_tree boost/signals boost/spirit boost/spirit/home boost/spirit/home/karma boost/spirit/home/support boost/typeof boost/uuid boost/variant boost/wave libs/iterator libs/iterator/doc libs/iterator/test
From: dnljms_at_[hidden]
Date: 2011-03-29 17:17:13
Author: danieljames
Date: 2011-03-29 17:17:11 EDT (Tue, 29 Mar 2011)
New Revision: 70709
URL: http://svn.boost.org/trac/boost/changeset/70709
Log:
Iterator: merge several changes from trunk.
- Update iterator_facade test for #1019
  (header change already merged).
- Category of each iterator is reduced to a known category before we try to
  find a minimum. Fixes #1517.
- `function_input_iterator` from Dean Michael Berris. Fixes #2893
- Fix typo in `boost/iterator.hpp`. Fixes #3434.
- Always include `add_reference` header in iterator adaptor header.
Did not merge changes for #1427.
Added:
   branches/release/boost/iterator/function_input_iterator.hpp
      - copied, changed from r62615, /trunk/boost/iterator/function_input_iterator.hpp
   branches/release/libs/iterator/doc/function_input_iterator.html
      - copied unchanged from r62624, /trunk/libs/iterator/doc/function_input_iterator.html
   branches/release/libs/iterator/doc/function_input_iterator.rst
      - copied unchanged from r62624, /trunk/libs/iterator/doc/function_input_iterator.rst
   branches/release/libs/iterator/test/function_input_iterator_test.cpp
      - copied unchanged from r63145, /trunk/libs/iterator/test/function_input_iterator_test.cpp
Properties modified: 
   branches/release/boost/   (props changed)
   branches/release/boost/bimap/   (props changed)
   branches/release/boost/concept_check.hpp   (props changed)
   branches/release/boost/config.hpp   (props changed)
   branches/release/boost/gil/   (props changed)
   branches/release/boost/graph/   (props changed)
   branches/release/boost/icl/   (props changed)
   branches/release/boost/intrusive/   (props changed)
   branches/release/boost/iterator/   (props changed)
   branches/release/boost/iterator/iterator_facade.hpp   (props changed)
   branches/release/boost/msm/   (props changed)
   branches/release/boost/numeric/ublas/   (props changed)
   branches/release/boost/property_tree/   (props changed)
   branches/release/boost/signals/   (props changed)
   branches/release/boost/spirit/   (props changed)
   branches/release/boost/spirit/home/   (props changed)
   branches/release/boost/spirit/home/karma/   (props changed)
   branches/release/boost/spirit/home/support/attributes.hpp   (props changed)
   branches/release/boost/token_functions.hpp   (props changed)
   branches/release/boost/typeof/register_functions.hpp   (props changed)
   branches/release/boost/typeof/register_functions_iterate.hpp   (props changed)
   branches/release/boost/typeof/typeof.hpp   (props changed)
   branches/release/boost/typeof/unsupported.hpp   (props changed)
   branches/release/boost/uuid/   (props changed)
   branches/release/boost/variant/   (props changed)
   branches/release/boost/wave/   (props changed)
   branches/release/libs/iterator/   (props changed)
Text files modified: 
   branches/release/boost/iterator.hpp                         |     2                                         
   branches/release/boost/iterator/function_input_iterator.hpp |   106 ++++++++++++++++++++++++++++++++++++--- 
   branches/release/boost/iterator/iterator_adaptor.hpp        |     8 --                                      
   branches/release/boost/iterator/zip_iterator.hpp            |     2                                         
   branches/release/libs/iterator/doc/index.html               |    44 ++++++++--------                        
   branches/release/libs/iterator/doc/index.rst                |    14 ++++-                                   
   branches/release/libs/iterator/doc/sources.py               |     1                                         
   branches/release/libs/iterator/test/Jamfile.v2              |     1                                         
   branches/release/libs/iterator/test/iterator_facade.cpp     |     6 ++                                      
   branches/release/libs/iterator/test/zip_iterator_test.cpp   |    24 +++++++++                               
   10 files changed, 164 insertions(+), 44 deletions(-)
Modified: branches/release/boost/iterator.hpp
==============================================================================
--- branches/release/boost/iterator.hpp	(original)
+++ branches/release/boost/iterator.hpp	2011-03-29 17:17:11 EDT (Tue, 29 Mar 2011)
@@ -1,4 +1,4 @@
-//  interator.hpp workarounds for non-conforming standard libraries  ---------//
+//  iterator.hpp workarounds for non-conforming standard libraries  ---------//
 
 //  (C) Copyright Beman Dawes 2000. Distributed under the Boost
 //  Software License, Version 1.0. (See accompanying file
Copied: branches/release/boost/iterator/function_input_iterator.hpp (from r62615, /trunk/boost/iterator/function_input_iterator.hpp)
==============================================================================
--- /trunk/boost/iterator/function_input_iterator.hpp	(original)
+++ branches/release/boost/iterator/function_input_iterator.hpp	2011-03-29 17:17:11 EDT (Tue, 29 Mar 2011)
@@ -7,23 +7,29 @@
 #ifndef BOOST_FUNCTION_INPUT_ITERATOR
 #define BOOST_FUNCTION_INPUT_ITERATOR
 
+#include <boost/mpl/if.hpp>
+#include <boost/function_types/is_function_pointer.hpp>
+#include <boost/function_types/is_function_reference.hpp>
+#include <boost/function_types/result_type.hpp>
 #include <boost/iterator/iterator_facade.hpp>
 
 namespace boost {
 
-    template <class Function, class Input>
+    namespace impl {
+
+        template <class Function, class Input>
         class function_input_iterator
-        : public iterator_facade<
+            : public iterator_facade<
             function_input_iterator<Function, Input>,
             typename Function::result_type,
             single_pass_traversal_tag,
             typename Function::result_type const &
             >
-    {
+        {
         public:
             function_input_iterator() {}
-            function_input_iterator(Function * f_, Input state_ = Input()) 
-                : f(f_), state(state_), value((*f)()) {}
+            function_input_iterator(Function & f_, Input state_ = Input()) 
+                : f(&f_), state(state_), value((*f)()) {}
 
             void increment() {
                 value = (*f)();
@@ -31,8 +37,8 @@
             }
 
             typename Function::result_type const & 
-            dereference() const {
-                return value;
+                dereference() const {
+                    return value;
             }
 
             bool equal(function_input_iterator const & other) const {
@@ -43,13 +49,93 @@
             Function * f;
             Input state;
             typename Function::result_type value;
+        };
+
+        template <class Function, class Input>
+        class function_pointer_input_iterator
+            : public iterator_facade<
+            function_pointer_input_iterator<Function, Input>,
+            typename function_types::result_type<Function>::type,
+            single_pass_traversal_tag,
+            typename function_types::result_type<Function>::type const &
+            >
+        {
+        public:
+            function_pointer_input_iterator() {}
+            function_pointer_input_iterator(Function &f_, Input state_ = Input())
+                : f(f_), state(state_), value((*f)()) 
+            {}
+
+            void increment() {
+                value = (*f)();
+                ++state;
+            }
+
+            typename function_types::result_type<Function>::type const &
+                dereference() const {
+                    return value;
+            }
+
+            bool equal(function_pointer_input_iterator const & other) const {
+                return f == other.f && state == other.state;
+            }
+
+        private:
+            Function f;
+            Input state;
+            typename function_types::result_type<Function>::type value;
+        };
+
+        template <class Function, class Input>
+        class function_reference_input_iterator
+            : public function_pointer_input_iterator<Function*,Input>
+        {
+        public:
+            function_reference_input_iterator(Function & f_, Input state_ = Input())
+                : function_pointer_input_iterator<Function*,Input>(&f_, state_)
+            {}
+        };
+
+    } // namespace impl
+
+    template <class Function, class Input>
+    class function_input_iterator 
+        : public mpl::if_<
+            function_types::is_function_pointer<Function>,
+            impl::function_pointer_input_iterator<Function,Input>,
+            typename mpl::if_<
+                function_types::is_function_reference<Function>,
+                impl::function_reference_input_iterator<Function,Input>,
+                impl::function_input_iterator<Function,Input>
+            >::type
+        >::type
+    {
+        typedef typename mpl::if_<
+            function_types::is_function_pointer<Function>,
+            impl::function_pointer_input_iterator<Function,Input>,
+            typename mpl::if_<
+                function_types::is_function_reference<Function>,
+                impl::function_reference_input_iterator<Function,Input>,
+                impl::function_input_iterator<Function,Input>
+            >::type
+        >::type base_type;
+    public:
+        function_input_iterator(Function & f, Input i)
+            : base_type(f, i) {}
     };
 
     template <class Function, class Input>
     inline function_input_iterator<Function, Input>
-    make_function_input_iterator(Function & f, Input state) {
-        typedef function_input_iterator<Function, Input> result_t;
-        return result_t(&f, state);
+        make_function_input_iterator(Function & f, Input state) {
+            typedef function_input_iterator<Function, Input> result_t;
+            return result_t(f, state);
+    }
+
+    template <class Function, class Input>
+    inline function_input_iterator<Function*, Input>
+        make_function_input_iterator(Function * f, Input state) {
+            typedef function_input_iterator<Function*, Input> result_t;
+            return result_t(f, state);
     }
 
     struct infinite {
Modified: branches/release/boost/iterator/iterator_adaptor.hpp
==============================================================================
--- branches/release/boost/iterator/iterator_adaptor.hpp	(original)
+++ branches/release/boost/iterator/iterator_adaptor.hpp	2011-03-29 17:17:11 EDT (Tue, 29 Mar 2011)
@@ -24,15 +24,9 @@
 
 #ifdef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY
 # include <boost/type_traits/remove_reference.hpp>
-
-# if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x610))
-#   include <boost/type_traits/add_reference.hpp>
-# endif
-
-#else
-# include <boost/type_traits/add_reference.hpp>
 #endif
 
+#include <boost/type_traits/add_reference.hpp>
 #include <boost/iterator/detail/config_def.hpp>
 
 #include <boost/iterator/iterator_traits.hpp>
Modified: branches/release/boost/iterator/zip_iterator.hpp
==============================================================================
--- branches/release/boost/iterator/zip_iterator.hpp	(original)
+++ branches/release/boost/iterator/zip_iterator.hpp	2011-03-29 17:17:11 EDT (Tue, 29 Mar 2011)
@@ -357,7 +357,7 @@
     {
       typedef typename tuple_impl_specific::tuple_meta_transform<
           IteratorTuple
-        , iterator_traversal<>
+        , pure_traversal_tag<iterator_traversal<> >
       >::type tuple_of_traversal_tags;
           
       typedef typename tuple_impl_specific::tuple_meta_accumulate<
Modified: branches/release/libs/iterator/doc/index.html
==============================================================================
--- branches/release/libs/iterator/doc/index.html	(original)
+++ branches/release/libs/iterator/doc/index.html	2011-03-29 17:17:11 EDT (Tue, 29 Mar 2011)
@@ -3,7 +3,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils 0.6: http://docutils.sourceforge.net/" />
 <title>The Boost.Iterator Library Boost</title>
 <link rel="stylesheet" href="../../../rst.css" type="text/css" />
 </head>
@@ -14,9 +14,6 @@
 <!-- Distributed under 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) -->
-<!-- Distributed under 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) -->
 <hr class="docutils" />
 <table class="docutils field-list" frame="void" rules="none">
 <col class="field-name" />
@@ -60,21 +57,21 @@
 <div class="contents topic" id="table-of-contents">
 <p class="topic-title first"><strong>Table of Contents</strong></p>
 <ul class="simple">
-<li><a class="reference internal" href="#new-style-iterators" id="id22">New-Style Iterators</a></li>
-<li><a class="reference internal" href="#iterator-facade-and-adaptor" id="id23">Iterator Facade and Adaptor</a></li>
-<li><a class="reference internal" href="#specialized-adaptors" id="id24">Specialized Adaptors</a></li>
-<li><a class="reference internal" href="#iterator-utilities" id="id25">Iterator Utilities</a><ul>
-<li><a class="reference internal" href="#traits" id="id26">Traits</a></li>
-<li><a class="reference internal" href="#testing-and-concept-checking" id="id27">Testing and Concept Checking</a></li>
+<li><a class="reference internal" href="#new-style-iterators" id="id23">New-Style Iterators</a></li>
+<li><a class="reference internal" href="#iterator-facade-and-adaptor" id="id24">Iterator Facade and Adaptor</a></li>
+<li><a class="reference internal" href="#specialized-adaptors" id="id25">Specialized Adaptors</a></li>
+<li><a class="reference internal" href="#iterator-utilities" id="id26">Iterator Utilities</a><ul>
+<li><a class="reference internal" href="#traits" id="id27">Traits</a></li>
+<li><a class="reference internal" href="#testing-and-concept-checking" id="id28">Testing and Concept Checking</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#upgrading-from-the-old-boost-iterator-adaptor-library" id="id28">Upgrading from the old Boost Iterator Adaptor Library</a></li>
-<li><a class="reference internal" href="#history" id="id29">History</a></li>
+<li><a class="reference internal" href="#upgrading-from-the-old-boost-iterator-adaptor-library" id="id29">Upgrading from the old Boost Iterator Adaptor Library</a></li>
+<li><a class="reference internal" href="#history" id="id30">History</a></li>
 </ul>
 </div>
 <hr class="docutils" />
 <div class="section" id="new-style-iterators">
-<h1><a class="toc-backref" href="#id22">New-Style Iterators</a></h1>
+<h1><a class="toc-backref" href="#id23">New-Style Iterators</a></h1>
 <p>The iterator categories defined in C++98 are extremely limiting
 because they bind together two orthogonal concepts: traversal and
 element access.  For example, because a random access iterator is
@@ -93,7 +90,7 @@
 <a class="reference external" href="new-iter-concepts.html">Standard Proposal For New-Style Iterators</a> (<a class="reference external" href="new-iter-concepts.pdf">PDF</a>)</blockquote>
 </div>
 <div class="section" id="iterator-facade-and-adaptor">
-<h1><a class="toc-backref" href="#id23">Iterator Facade and Adaptor</a></h1>
+<h1><a class="toc-backref" href="#id24">Iterator Facade and Adaptor</a></h1>
 <p>Writing standard-conforming iterators is tricky, but the need comes
 up often.  In order to ease the implementation of new iterators,
 the Boost.Iterator library provides the <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> class template,
@@ -120,7 +117,7 @@
 <p>for more details.</p>
 </div>
 <div class="section" id="specialized-adaptors">
-<h1><a class="toc-backref" href="#id24">Specialized Adaptors</a></h1>
+<h1><a class="toc-backref" href="#id25">Specialized Adaptors</a></h1>
 <p>The iterator library supplies a useful suite of standard-conforming
 iterator templates based on the Boost <a class="reference internal" href="#iterator-facade-and-adaptor">iterator facade and adaptor</a>.</p>
 <ul class="simple">
@@ -128,6 +125,9 @@
 Implements a "lazy sequence"</li>
 <li><a class="reference external" href="filter_iterator.html"><tt class="docutils literal"><span class="pre">filter_iterator</span></tt></a> (<a class="reference external" href="filter_iterator.pdf">PDF</a>): an iterator over the subset of elements of some
 sequence which satisfy a given predicate</li>
+<li><a class="reference external" href="function_input_iterator.html"><tt class="docutils literal"><span class="pre">function_input_iterator</span></tt></a> (<a class="reference external" href="function_input_iterator.pdf">PDF</a>): an input iterator wrapping a generator (nullary
+function object); each time the iterator is dereferenced, the function object
+is called to get the value to return.</li>
 <li><a class="reference external" href="function_output_iterator.html"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt></a> (<a class="reference external" href="function_output_iterator.pdf">PDF</a>): an output iterator wrapping a unary function
 object; each time an element is written into the dereferenced
 iterator, it is passed as a parameter to the function object.</li>
@@ -149,9 +149,9 @@
 </ul>
 </div>
 <div class="section" id="iterator-utilities">
-<h1><a class="toc-backref" href="#id25">Iterator Utilities</a></h1>
+<h1><a class="toc-backref" href="#id26">Iterator Utilities</a></h1>
 <div class="section" id="traits">
-<h2><a class="toc-backref" href="#id26">Traits</a></h2>
+<h2><a class="toc-backref" href="#id27">Traits</a></h2>
 <ul class="simple">
 <li><a class="reference external" href="pointee.html"><tt class="docutils literal"><span class="pre">pointee.hpp</span></tt></a> (<a class="reference external" href="pointee.pdf">PDF</a>): Provides the capability to deduce the referent types
 of pointers, smart pointers and iterators in generic code.  Used
@@ -165,7 +165,7 @@
 <!-- comment! __ interoperable.pdf -->
 </div>
 <div class="section" id="testing-and-concept-checking">
-<h2><a class="toc-backref" href="#id27">Testing and Concept Checking</a></h2>
+<h2><a class="toc-backref" href="#id28">Testing and Concept Checking</a></h2>
 <ul class="simple">
 <li><a class="reference external" href="iterator_concepts.html"><tt class="docutils literal"><span class="pre">iterator_concepts.hpp</span></tt></a> (<a class="reference external" href="iterator_concepts.pdf">PDF</a>): Concept checking classes for the new iterator concepts.</li>
 <li><a class="reference external" href="iterator_archetypes.html"><tt class="docutils literal"><span class="pre">iterator_archetypes.hpp</span></tt></a> (<a class="reference external" href="iterator_archetypes.pdf">PDF</a>): Concept archetype classes for the new iterators concepts.</li>
@@ -173,7 +173,7 @@
 </div>
 </div>
 <div class="section" id="upgrading-from-the-old-boost-iterator-adaptor-library">
-<h1><a class="toc-backref" href="#id28">Upgrading from the old Boost Iterator Adaptor Library</a></h1>
+<h1><a class="toc-backref" href="#id29">Upgrading from the old Boost Iterator Adaptor Library</a></h1>
 <p id="upgrading">If you have been using the old Boost Iterator Adaptor library to
 implement iterators, you probably wrote a <tt class="docutils literal"><span class="pre">Policies</span></tt> class which
 captures the core operations of your iterator.  In the new library
@@ -183,7 +183,7 @@
 <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> specialization you needed; in the new library
 design you don't need a type generator (though may want to keep it
 around as a compatibility aid for older code) because, due to the
-use of the Curiously Recurring Template Pattern (CRTP) <a class="citation-reference" href="#cop95" id="id21">[Cop95]</a>,
+use of the Curiously Recurring Template Pattern (CRTP) <a class="citation-reference" href="#cop95" id="id22">[Cop95]</a>,
 you can now define the iterator class yourself and acquire
 functionality through inheritance from <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> or
 <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>.  As a result, you also get much finer control
@@ -198,7 +198,7 @@
 <tt class="docutils literal"><span class="pre">projection_iterator</span></tt> used to.</p>
 </div>
 <div class="section" id="history">
-<h1><a class="toc-backref" href="#id29">History</a></h1>
+<h1><a class="toc-backref" href="#id30">History</a></h1>
 <p>In 2000 Dave Abrahams was writing an iterator for a container of
 pointers, which would access the pointed-to elements when
 dereferenced.  Naturally, being a library writer, he decided to
@@ -226,7 +226,7 @@
 <table class="docutils citation" frame="void" id="cop95" rules="none">
 <colgroup><col class="label" /><col /></colgroup>
 <tbody valign="top">
-<tr><td class="label"><a class="fn-backref" href="#id21">[Cop95]</a></td><td>[Coplien, 1995] Coplien, J., Curiously Recurring Template
+<tr><td class="label"><a class="fn-backref" href="#id22">[Cop95]</a></td><td>[Coplien, 1995] Coplien, J., Curiously Recurring Template
 Patterns, C++ Report, February 1995, pp. 24-27.</td></tr>
 </tbody>
 </table>
Modified: branches/release/libs/iterator/doc/index.rst
==============================================================================
--- branches/release/libs/iterator/doc/index.rst	(original)
+++ branches/release/libs/iterator/doc/index.rst	2011-03-29 17:17:11 EDT (Tue, 29 Mar 2011)
@@ -138,7 +138,11 @@
 * |filter|_ (PDF__): an iterator over the subset of elements of some
   sequence which satisfy a given predicate
 
-* |function|_ (PDF__): an output iterator wrapping a unary function
+* |function_input|_ (PDF__): an input iterator wrapping a generator (nullary
+  function object); each time the iterator is dereferenced, the function object
+  is called to get the value to return.
+
+* |function_output|_ (PDF__): an output iterator wrapping a unary function
   object; each time an element is written into the dereferenced
   iterator, it is passed as a parameter to the function object.
 
@@ -171,8 +175,12 @@
 .. _filter: filter_iterator.html
 __ filter_iterator.pdf
 
-.. |function| replace:: ``function_output_iterator``
-.. _function: function_output_iterator.html
+.. |function_input| replace:: ``function_input_iterator``
+.. _function_input: function_input_iterator.html
+__ function_input_iterator.pdf
+
+.. |function_output| replace:: ``function_output_iterator``
+.. _function_output: function_output_iterator.html
 __ function_output_iterator.pdf
 
 .. |indirect| replace:: ``indirect_iterator``
Modified: branches/release/libs/iterator/doc/sources.py
==============================================================================
--- branches/release/libs/iterator/doc/sources.py	(original)
+++ branches/release/libs/iterator/doc/sources.py	2011-03-29 17:17:11 EDT (Tue, 29 Mar 2011)
@@ -6,6 +6,7 @@
 'counting_iterator.rst',
 'facade-and-adaptor.rst',
 'filter_iterator.rst',
+'function_input_iterator.rst',
 'function_output_iterator.rst',
 'index.rst',
 'indirect_iterator.rst',
Modified: branches/release/libs/iterator/test/Jamfile.v2
==============================================================================
--- branches/release/libs/iterator/test/Jamfile.v2	(original)
+++ branches/release/libs/iterator/test/Jamfile.v2	2011-03-29 17:17:11 EDT (Tue, 29 Mar 2011)
@@ -43,5 +43,6 @@
     [ run iterator_traits_test.cpp ]
     [ run permutation_iterator_test.cpp : : : # <stlport-iostream>on 
     ]
+    [ run function_input_iterator_test.cpp ]
       
 ;
Modified: branches/release/libs/iterator/test/iterator_facade.cpp
==============================================================================
--- branches/release/libs/iterator/test/iterator_facade.cpp	(original)
+++ branches/release/libs/iterator/test/iterator_facade.cpp	2011-03-29 17:17:11 EDT (Tue, 29 Mar 2011)
@@ -87,6 +87,10 @@
     }
 };
 
+template <class T, class U>
+void same_type(U const&)
+{ BOOST_MPL_ASSERT((boost::is_same<T,U>)); }
+
 int main()
 {
     int state = 0;
@@ -101,6 +105,8 @@
     input_iter p;
     (*p).mutator();
     p->mutator();
+
+    same_type<input_iter::pointer>(p.operator->());
     
     return boost::report_errors();
 }
Modified: branches/release/libs/iterator/test/zip_iterator_test.cpp
==============================================================================
--- branches/release/libs/iterator/test/zip_iterator_test.cpp	(original)
+++ branches/release/libs/iterator/test/zip_iterator_test.cpp	2011-03-29 17:17:11 EDT (Tue, 29 Mar 2011)
@@ -46,6 +46,7 @@
 #include <vector>
 #include <list>
 #include <set>
+#include <string>
 #include <functional>
 #include <boost/tuple/tuple.hpp>
 #include <boost/iterator/transform_iterator.hpp>
@@ -60,6 +61,27 @@
         typename boost::iterator_traversal<It>::type
     >
 {};
+
+
+/// Tests for https://svn.boost.org/trac/boost/ticket/1517
+int to_value(int const &v)
+{
+    return v;
+}
+
+void category_test()
+{
+    std::list<int> rng1;
+    std::string rng2;
+
+    boost::make_zip_iterator(
+        boost::make_tuple(
+            boost::make_transform_iterator(rng1.begin(), &to_value), // BidirectionalInput
+            rng2.begin() // RandomAccess
+        )
+    );
+}
+///
   
 /////////////////////////////////////////////////////////////////////////////
 //
@@ -70,6 +92,8 @@
 int main( void )
 {
 
+  category_test();
+
   std::cout << "\n"
             << "***********************************************\n"
             << "*                                             *\n"