1//  (C) Copyright Gennadiy Rozental 2004-2008.
2//  Distributed under the Boost Software License, Version 1.0.
3//  (See accompanying file LICENSE_1_0.txt or copy at
4//  http://www.boost.org/LICENSE_1_0.txt)
5
6//  See http://www.boost.org/libs/test for the library home page.
7//
8//  File        : $RCSfile$
9//
10//  Version     : $Revision: 49312 $
11//
12//  Description : Input iterator facade
13// ***************************************************************************
14
15#ifndef BOOST_INPUT_ITERATOR_FACADE_HPP_071894GER
16#define BOOST_INPUT_ITERATOR_FACADE_HPP_071894GER
17
18// Boost
19#include <boost/iterator/iterator_facade.hpp>
20
21#include <boost/test/detail/suppress_warnings.hpp>
22
23//____________________________________________________________________________//
24
25namespace boost {
26
27namespace unit_test {
28
29// ************************************************************************** //
30// **************          input_iterator_core_access          ************** //
31// ************************************************************************** //
32
33class input_iterator_core_access
34{
35#if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
36public:
37#else
38    template <class I, class V, class R, class TC> friend class input_iterator_facade;
39#endif
40
41    template <class Facade>
42    static bool get( Facade& f )
43    {
44        return f.get();
45    }
46
47private:
48    // objects of this class are useless
49    input_iterator_core_access(); //undefined
50};
51
52// ************************************************************************** //
53// **************            input_iterator_facade             ************** //
54// ************************************************************************** //
55
56template<typename Derived,
57         typename ValueType,
58         typename Reference = ValueType const&,
59         typename Traversal = single_pass_traversal_tag>
60class input_iterator_facade : public iterator_facade<Derived,ValueType,Traversal,Reference>
61{
62public:
63    // Constructor
64    input_iterator_facade() : m_valid( false ), m_value() {}
65
66protected: // provide access to the Derived
67    void                init()
68    {
69        m_valid = true;
70        increment();
71    }
72
73    // Data members
74    mutable bool        m_valid;
75    ValueType           m_value;
76
77private:
78    friend class boost::iterator_core_access;
79
80    // iterator facade interface implementation
81    void                increment()
82    {
83        // we make post-end incrementation indefinetly safe
84        if( m_valid )
85            m_valid = input_iterator_core_access::get( *static_cast<Derived*>(this) );
86    }
87    Reference           dereference() const
88    {
89        return m_value;
90    }
91
92    // iterator facade interface implementation
93    bool                equal( input_iterator_facade const& rhs ) const
94    {
95        // two invalid iterator equals, inequal otherwise
96        return !m_valid && !rhs.m_valid;
97    }
98};
99
100} // namespace unit_test
101
102} // namespace boost
103
104//____________________________________________________________________________//
105
106#include <boost/test/detail/enable_warnings.hpp>
107
108#endif // BOOST_INPUT_ITERATOR_FACADE_HPP_071894GER
109
110