Home | History | Annotate | Download | only in iterator
      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>
     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
     64     input_iterator_facade() : m_valid( false ), m_value() {}
     65 
     66 protected: // 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 
     77 private:
     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