• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
25 namespace boost {
26 
27 namespace unit_test {
28 
29 // ************************************************************************** //
30 // **************          input_iterator_core_access          ************** //
31 // ************************************************************************** //
32 
33 class input_iterator_core_access
34 {
35 #if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
36 public:
37 #else
38     template <class I, class V, class R, class TC> friend class input_iterator_facade;
39 #endif
40 
41     template <class Facade>
get(Facade & f)42     static bool get( Facade& f )
43     {
44         return f.get();
45     }
46 
47 private:
48     // objects of this class are useless
49     input_iterator_core_access(); //undefined
50 };
51 
52 // ************************************************************************** //
53 // **************            input_iterator_facade             ************** //
54 // ************************************************************************** //
55 
56 template<typename Derived,
57          typename ValueType,
58          typename Reference = ValueType const&,
59          typename Traversal = single_pass_traversal_tag>
60 class input_iterator_facade : public iterator_facade<Derived,ValueType,Traversal,Reference>
61 {
62 public:
63     // Constructor
input_iterator_facade()64     input_iterator_facade() : m_valid( false ), m_value() {}
65 
66 protected: // provide access to the Derived
init()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 
77 private:
78     friend class boost::iterator_core_access;
79 
80     // iterator facade interface implementation
increment()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     }
dereference() const87     Reference           dereference() const
88     {
89         return m_value;
90     }
91 
92     // iterator facade interface implementation
equal(input_iterator_facade const & rhs) const93     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