text: //  Boost string_algo library find_iterator.hpp header file  ---------------------------//
  
  //  Copyright Pavol Droba 2002-2003.
  //
  // Distributed under the Boost Software License, Version 1.0.
  //    (See accompanying file LICENSE_1_0.txt or copy at
  //          http://www.boost.org/LICENSE_1_0.txt)
  
  //  See http://www.boost.org/ for updates, documentation, and revision history.
  
  #ifndef BOOST_STRING_FIND_ITERATOR_DETAIL_HPP
  #define BOOST_STRING_FIND_ITERATOR_DETAIL_HPP
  
  #include <boost/algorithm/string/config.hpp>
  #include <boost/range/iterator_range_core.hpp>
  #include <boost/iterator/iterator_facade.hpp>
  #include <boost/iterator/iterator_categories.hpp>
  #include <boost/function.hpp>
  
  namespace boost {
      namespace algorithm { 
          namespace detail {
  
  //  find_iterator base -----------------------------------------------//
  
              // Find iterator base
              template<typename IteratorT>
              class find_iterator_base
              {
              protected:
                  // typedefs
                  typedef IteratorT input_iterator_type;
                  typedef iterator_range<IteratorT> match_type;
                  typedef function2<
                      match_type, 
                      input_iterator_type, 
                      input_iterator_type> finder_type;
                  
              protected:
              // Protected construction/destruction
  
                  // Default constructor
                  find_iterator_base() {}
                  // Copy construction
                  find_iterator_base( const find_iterator_base& Other ) :
                      m_Finder(Other.m_Finder) {}
                  
                  // Constructor
                  template<typename FinderT>
                  find_iterator_base( FinderT Finder, int ) :
                      m_Finder(Finder) {}
  
                  // Destructor
                  ~find_iterator_base() {}
  
                  // Find operation
                  match_type do_find( 
                      input_iterator_type Begin,
                      input_iterator_type End ) const
                  {
                      if (!m_Finder.empty())
                      {
                          return m_Finder(Begin,End);
                      }
                      else
                      {
                          return match_type(End,End);
                      }
                  }
  
                  // Check
                  bool is_null() const
                  {
                      return m_Finder.empty();
                  }
  
              private:
                  // Finder
                  finder_type m_Finder;
              };
  
         } // namespace detail
      } // namespace algorithm
  } // namespace boost
  
  
  #endif  // BOOST_STRING_FIND_ITERATOR_DETAIL_HPP
  