| /*============================================================================= |
| 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_STREAM_MAY_05_2007_1228PM) |
| #define BOOST_SPIRIT_STREAM_MAY_05_2007_1228PM |
| |
| #if defined(_MSC_VER) |
| #pragma once |
| #endif |
| |
| #include <boost/spirit/home/qi/detail/string_parse.hpp> |
| #include <boost/spirit/home/qi/stream/detail/match_manip.hpp> |
| #include <boost/spirit/home/qi/stream/detail/iterator_source.hpp> |
| #include <boost/spirit/home/support/detail/hold_any.hpp> |
| |
| #include <iosfwd> |
| #include <sstream> |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| namespace boost { namespace spirit |
| { |
| /////////////////////////////////////////////////////////////////////////// |
| // Enablers |
| /////////////////////////////////////////////////////////////////////////// |
| template <> |
| struct use_terminal<qi::domain, tag::stream> // enables stream |
| : mpl::true_ {}; |
| |
| template <> |
| struct use_terminal<qi::domain, tag::wstream> // enables wstream |
| : mpl::true_ {}; |
| }} |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| namespace boost { namespace spirit { namespace qi |
| { |
| using spirit::stream; |
| using spirit::wstream; |
| |
| template <typename Char = char, typename T = spirit::hold_any> |
| struct stream_parser |
| : primitive_parser<stream_parser<Char, T> > |
| { |
| template <typename Context, typename Iterator> |
| struct attribute |
| { |
| typedef T type; |
| }; |
| |
| template <typename Iterator, typename Context |
| , typename Skipper, typename Attribute> |
| bool parse(Iterator& first, Iterator const& last |
| , Context& /*context*/, Skipper const& skipper |
| , Attribute& attr) const |
| { |
| typedef qi::detail::iterator_source<Iterator> source_device; |
| typedef boost::iostreams::stream<source_device> instream; |
| |
| qi::skip_over(first, last, skipper); |
| instream in(first, last); |
| in >> attr; // use existing operator>>() |
| return in.good() || in.eof(); |
| } |
| |
| template <typename Context> |
| info what(Context& /*context*/) const |
| { |
| return info("stream"); |
| } |
| }; |
| |
| template <typename T, typename Char = char> |
| struct typed_stream |
| : proto::terminal<stream_parser<Char, T> >::type |
| { |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////// |
| // Parser generators: make_xxx function (objects) |
| /////////////////////////////////////////////////////////////////////////// |
| template <typename Char> |
| struct make_stream |
| { |
| typedef stream_parser<Char> result_type; |
| result_type operator()(unused_type, unused_type) const |
| { |
| return result_type(); |
| } |
| }; |
| |
| template <typename Modifiers> |
| struct make_primitive<tag::stream, Modifiers> : make_stream<char> {}; |
| |
| template <typename Modifiers> |
| struct make_primitive<tag::wstream, Modifiers> : make_stream<wchar_t> {}; |
| }}} |
| |
| #endif |