blob: 972830aa7c39bd1ca64f2342b752724876240021 [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_KARMA_GENERATE_FEB_20_2007_0959AM)
#define BOOST_SPIRIT_KARMA_GENERATE_FEB_20_2007_0959AM
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#pragma once // MS compatible compilers support #pragma once
#endif
#include <boost/spirit/home/karma/meta_grammar.hpp>
#include <boost/spirit/home/karma/delimit.hpp>
#include <boost/spirit/home/karma/detail/output_iterator.hpp>
#include <boost/spirit/home/support/unused.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/mpl/bool.hpp>
///////////////////////////////////////////////////////////////////////////////
namespace boost { namespace spirit { namespace karma
{
///////////////////////////////////////////////////////////////////////////
template <typename OutputIterator, typename Expr>
inline bool
generate(OutputIterator target_sink, Expr const& xpr)
{
typedef spirit::traits::is_component<karma::domain, Expr> is_component;
// report invalid expression error as early as possible
BOOST_MPL_ASSERT_MSG(is_component::value,
xpr_is_not_convertible_to_a_generator,
(OutputIterator, Expr));
// wrap user supplied iterator into our own output iterator
detail::output_iterator<OutputIterator> sink(target_sink);
typedef
typename result_of::as_component<karma::domain, Expr>::type
component;
typedef typename component::director director;
component c = spirit::as_component(karma::domain(), xpr);
return director::generate(c, sink, unused, unused, unused);
}
///////////////////////////////////////////////////////////////////////////
template <typename OutputIterator, typename Expr>
inline bool
generate(detail::output_iterator<OutputIterator>& sink, Expr const& xpr)
{
typedef spirit::traits::is_component<karma::domain, Expr> is_component;
// report invalid expression error as early as possible
BOOST_MPL_ASSERT_MSG(is_component::value,
xpr_is_not_convertible_to_a_generator,
(OutputIterator, Expr));
typedef
typename result_of::as_component<karma::domain, Expr>::type
component;
typedef typename component::director director;
component c = spirit::as_component(karma::domain(), xpr);
return director::generate(c, sink, unused, unused, unused);
}
///////////////////////////////////////////////////////////////////////////
template <typename OutputIterator, typename Expr, typename Parameter>
inline bool
generate(OutputIterator target_sink, Expr const& xpr, Parameter const& param)
{
typedef spirit::traits::is_component<karma::domain, Expr> is_component;
// report invalid expression error as early as possible
BOOST_MPL_ASSERT_MSG(is_component::value,
xpr_is_not_convertible_to_a_generator,
(OutputIterator, Expr, Parameter));
// wrap user supplied iterator into our own output iterator
detail::output_iterator<OutputIterator> sink(target_sink);
typedef
typename result_of::as_component<karma::domain, Expr>::type
component;
typedef typename component::director director;
component c = spirit::as_component(karma::domain(), xpr);
return director::generate(c, sink, unused, unused, param);
}
///////////////////////////////////////////////////////////////////////////
template <typename OutputIterator, typename Expr, typename Parameter>
inline bool
generate(detail::output_iterator<OutputIterator>& sink, Expr const& xpr,
Parameter const& param)
{
typedef spirit::traits::is_component<karma::domain, Expr> is_component;
// report invalid expression error as early as possible
BOOST_MPL_ASSERT_MSG(is_component::value,
xpr_is_not_convertible_to_a_generator,
(OutputIterator, Expr, Parameter));
typedef
typename result_of::as_component<karma::domain, Expr>::type
component;
typedef typename component::director director;
component c = spirit::as_component(karma::domain(), xpr);
return director::generate(c, sink, unused, unused, param);
}
///////////////////////////////////////////////////////////////////////////
template <typename OutputIterator, typename Expr, typename Delimiter>
inline bool
generate_delimited(OutputIterator target_sink, Expr const& xpr,
Delimiter const& delimiter)
{
typedef
spirit::traits::is_component<karma::domain, Expr>
expr_is_component;
typedef
spirit::traits::is_component<karma::domain, Delimiter>
delimiter_is_component;
// report invalid expression errors as early as possible
BOOST_MPL_ASSERT_MSG(expr_is_component::value,
xpr_is_not_convertible_to_a_generator,
(OutputIterator, Expr, Delimiter));
BOOST_MPL_ASSERT_MSG(delimiter_is_component::value,
delimiter_is_not_convertible_to_a_generator,
(OutputIterator, Expr, Delimiter));
// wrap user supplied iterator into our own output iterator
detail::output_iterator<OutputIterator> sink(target_sink);
typedef
typename result_of::as_component<karma::domain, Expr>::type
component;
typedef typename component::director director;
typedef
typename result_of::as_component<karma::domain, Delimiter>::type
delim_component;
component c = spirit::as_component(karma::domain(), xpr);
delim_component d = spirit::as_component(karma::domain(), delimiter);
return director::generate(c, sink, unused, d, unused);
}
///////////////////////////////////////////////////////////////////////////
template <typename OutputIterator, typename Expr, typename Delimiter>
inline bool
generate_delimited(detail::output_iterator<OutputIterator>& sink,
Expr const& xpr, Delimiter const& delimiter)
{
typedef
spirit::traits::is_component<karma::domain, Expr>
expr_is_component;
typedef
spirit::traits::is_component<karma::domain, Delimiter>
delimiter_is_component;
// report invalid expression errors as early as possible
BOOST_MPL_ASSERT_MSG(expr_is_component::value,
xpr_is_not_convertible_to_a_generator,
(OutputIterator, Expr, Delimiter));
BOOST_MPL_ASSERT_MSG(delimiter_is_component::value,
delimiter_is_not_convertible_to_a_generator,
(OutputIterator, Expr, Delimiter));
typedef
typename result_of::as_component<karma::domain, Expr>::type
component;
typedef typename component::director director;
typedef
typename result_of::as_component<karma::domain, Delimiter>::type
delim_component;
component c = spirit::as_component(karma::domain(), xpr);
delim_component d = spirit::as_component(karma::domain(), delimiter);
return director::generate(c, sink, unused, d, unused);
}
///////////////////////////////////////////////////////////////////////////
template <typename OutputIterator, typename Expr, typename Parameter,
typename Delimiter>
inline bool
generate_delimited(OutputIterator target_sink, Expr const& xpr,
Parameter const& param, Delimiter const& delimiter)
{
typedef
spirit::traits::is_component<karma::domain, Expr>
expr_is_component;
typedef
spirit::traits::is_component<karma::domain, Delimiter>
delimiter_is_component;
// report invalid expression errors as early as possible
BOOST_MPL_ASSERT_MSG(expr_is_component::value,
xpr_is_not_convertible_to_a_generator,
(OutputIterator, Expr, Parameter, Delimiter));
BOOST_MPL_ASSERT_MSG(delimiter_is_component::value,
delimiter_is_not_convertible_to_a_generator,
(OutputIterator, Expr, Parameter, Delimiter));
// wrap user supplied iterator into our own output iterator
detail::output_iterator<OutputIterator> sink(target_sink);
typedef
typename result_of::as_component<karma::domain, Expr>::type
component;
typedef typename component::director director;
typedef
typename result_of::as_component<karma::domain, Delimiter>::type
delim_component;
component c = spirit::as_component(karma::domain(), xpr);
delim_component d = spirit::as_component(karma::domain(), delimiter);
return director::generate(c, sink, unused, d, param);
}
///////////////////////////////////////////////////////////////////////////
template <typename OutputIterator, typename Expr, typename Parameter,
typename Delimiter>
inline bool
generate_delimited(detail::output_iterator<OutputIterator>& sink,
Expr const& xpr, Parameter const& param, Delimiter const& delimiter)
{
typedef
spirit::traits::is_component<karma::domain, Expr>
expr_is_component;
typedef
spirit::traits::is_component<karma::domain, Delimiter>
delimiter_is_component;
// report invalid expression errors as early as possible
BOOST_MPL_ASSERT_MSG(expr_is_component::value,
xpr_is_not_convertible_to_a_generator,
(OutputIterator, Expr, Parameter, Delimiter));
BOOST_MPL_ASSERT_MSG(delimiter_is_component::value,
delimiter_is_not_convertible_to_a_generator,
(OutputIterator, Expr, Parameter, Delimiter));
typedef
typename result_of::as_component<karma::domain, Expr>::type
component;
typedef typename component::director director;
typedef
typename result_of::as_component<karma::domain, Delimiter>::type
delim_component;
component c = spirit::as_component(karma::domain(), xpr);
delim_component d = spirit::as_component(karma::domain(), delimiter);
return director::generate(c, sink, unused, d, param);
}
}}}
#endif