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