Chris@16: #ifndef BOOST_ARCHIVE_ITERATORS_HEAD_ITERATOR_HPP Chris@16: #define BOOST_ARCHIVE_ITERATORS_HEAD_ITERATOR_HPP Chris@16: Chris@16: // MS compatible compilers support #pragma once Chris@101: #if defined(_MSC_VER) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 Chris@16: // head_iterator.hpp Chris@16: Chris@16: // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . Chris@16: // Use, modification and distribution is subject to the Boost Software Chris@16: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org for updates, documentation, and revision history. Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace archive { Chris@16: namespace iterators { Chris@16: Chris@16: template Chris@16: class head_iterator Chris@16: : public boost::iterator_adaptor< Chris@16: head_iterator, Chris@16: Base, Chris@16: use_default, Chris@16: single_pass_traversal_tag Chris@16: > Chris@16: { Chris@16: private: Chris@16: friend class iterator_core_access; Chris@16: typedef boost::iterator_adaptor< Chris@16: head_iterator, Chris@16: Base, Chris@16: use_default, Chris@16: single_pass_traversal_tag Chris@16: > super_t; Chris@16: Chris@16: typedef head_iterator this_t; Chris@16: typedef super_t::value_type value_type; Chris@16: typedef super_t::reference reference_type; Chris@16: Chris@16: reference_type dereference_impl(){ Chris@16: if(! m_end){ Chris@16: while(! m_predicate(* this->base_reference())) Chris@16: ++ this->base_reference(); Chris@16: m_end = true; Chris@16: } Chris@16: return * this->base_reference(); Chris@16: } Chris@16: Chris@16: reference_type dereference() const { Chris@16: return const_cast(this)->dereference_impl(); Chris@16: } Chris@16: Chris@16: void increment(){ Chris@16: ++base_reference(); Chris@16: } Chris@16: Predicate m_predicate; Chris@16: bool m_end; Chris@16: public: Chris@16: template Chris@16: head_iterator(Predicate f, T start) : Chris@16: super_t(Base(start)), Chris@16: m_predicate(f), Chris@16: m_end(false) Chris@16: {} Chris@16: Chris@16: }; Chris@16: Chris@16: } // namespace iterators Chris@16: } // namespace archive Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_ARCHIVE_ITERATORS_HEAD_ITERATOR_HPP