blob: abe42dbafef4ee7bf6c52aa5abfdc7046e5ee0b8 [file] [log] [blame]
// Copyright (c) 2001-2009 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_FORMAT_MANIP_MAY_05_2007_1203PM)
#define BOOST_SPIRIT_FORMAT_MANIP_MAY_05_2007_1203PM
#include <boost/spirit/home/qi/parse.hpp>
#include <boost/spirit/home/support/unused.hpp>
#include <iterator>
#include <string>
///////////////////////////////////////////////////////////////////////////////
namespace boost { namespace spirit { namespace qi { namespace detail
{
///////////////////////////////////////////////////////////////////////////
template <
typename Expr,
typename Attribute = unused_type const,
typename Skipper = unused_type
>
struct match_manip
{
match_manip(Expr const& xpr, Attribute& a, Skipper const& s)
: expr(xpr), attr(a), skipper(s)
{}
Expr const& expr;
Attribute& attr;
Skipper const& skipper;
};
///////////////////////////////////////////////////////////////////////////
template<typename Char, typename Traits, typename Expr>
inline std::basic_istream<Char, Traits> &
operator>> (std::basic_istream<Char, Traits> &is,
match_manip<Expr> const& fm)
{
typedef std::istream_iterator<Char, Char, Traits> input_iterator;
input_iterator f(is);
input_iterator l;
if (!qi::parse (f, l, fm.expr))
{
is.setstate(std::ios_base::failbit);
}
return is;
}
///////////////////////////////////////////////////////////////////////////
template<typename Char, typename Traits, typename Expr, typename Attribute>
inline std::basic_istream<Char, Traits> &
operator>> (std::basic_istream<Char, Traits> &is,
match_manip<Expr, Attribute> const& fm)
{
typedef std::istream_iterator<Char, Char, Traits> input_iterator;
input_iterator f(is);
input_iterator l;
if (!qi::parse(f, l, fm.expr, fm.attr))
{
is.setstate(std::ios_base::failbit);
}
return is;
}
template<typename Char, typename Traits, typename Expr, typename Skipper>
inline std::basic_istream<Char, Traits> &
operator>> (std::basic_istream<Char, Traits> &is,
match_manip<Expr, unused_type, Skipper> const& fm)
{
typedef std::istream_iterator<Char, Char, Traits> input_iterator;
input_iterator f(is);
input_iterator l;
if (!qi::phrase_parse(f, l, fm.expr, fm.skipper))
{
is.setstate(std::ios_base::failbit);
}
return is;
}
///////////////////////////////////////////////////////////////////////////
template<
typename Char, typename Traits,
typename Expr, typename Attribute, typename Skipper
>
inline std::basic_istream<Char, Traits> &
operator>> (
std::basic_istream<Char, Traits> &is,
match_manip<Expr, Attribute, Skipper> const& fm)
{
typedef std::istream_iterator<Char, Char, Traits> input_iterator;
input_iterator f(is);
input_iterator l;
if (!qi::phrase_parse(f, l, fm.expr, fm.attr, fm.skipper))
{
is.setstate(std::ios_base::failbit);
}
return is;
}
}}}}
#endif