/*============================================================================= Copyright (c) 2001-2010 Hartmut Kaiser 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) ==============================================================================*/ #if !defined(BOOST_SPIRIT_ITERATOR_ISTREAM_MAY_05_2007_0110PM) #define BOOST_SPIRIT_ITERATOR_ISTREAM_MAY_05_2007_0110PM #if defined(_MSC_VER) #pragma once #endif #include #include /////////////////////////////////////////////////////////////////////////////// namespace boost { namespace spirit { namespace qi { namespace detail { /////////////////////////////////////////////////////////////////////////// template struct iterator_source { typedef typename boost::detail::iterator_traits::value_type char_type; typedef boost::iostreams::source_tag category; iterator_source (Iterator& first_, Iterator const& last_) : first(first_), last(last_) {} // Read up to n characters from the input sequence into the buffer s, // returning the number of characters read, or -1 to indicate // end-of-sequence. std::streamsize read (char_type* s, std::streamsize n) { if (first == last) return -1; std::streamsize bytes_read = 0; while (n--) { *s = *first; ++s; ++bytes_read; if (++first == last) break; } return bytes_read; } Iterator& first; Iterator const& last; private: // silence MSVC warning C4512: assignment operator could not be generated iterator_source& operator= (iterator_source const&); }; }}}} #endif