// Copyright (c) 2001-2008 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 #include #include #include #include #include /////////////////////////////////////////////////////////////////////////////// namespace boost { namespace spirit { namespace karma { /////////////////////////////////////////////////////////////////////////// template inline bool generate(OutputIterator target_sink, Expr const& xpr) { typedef spirit::traits::is_component 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 sink(target_sink); typedef typename result_of::as_component::type component; typedef typename component::director director; component c = spirit::as_component(karma::domain(), xpr); return director::generate(c, sink, unused, unused, unused); } /////////////////////////////////////////////////////////////////////////// template inline bool generate(detail::output_iterator& sink, Expr const& xpr) { typedef spirit::traits::is_component 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::type component; typedef typename component::director director; component c = spirit::as_component(karma::domain(), xpr); return director::generate(c, sink, unused, unused, unused); } /////////////////////////////////////////////////////////////////////////// template inline bool generate(OutputIterator target_sink, Expr const& xpr, Parameter const& param) { typedef spirit::traits::is_component 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 sink(target_sink); typedef typename result_of::as_component::type component; typedef typename component::director director; component c = spirit::as_component(karma::domain(), xpr); return director::generate(c, sink, unused, unused, param); } /////////////////////////////////////////////////////////////////////////// template inline bool generate(detail::output_iterator& sink, Expr const& xpr, Parameter const& param) { typedef spirit::traits::is_component 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::type component; typedef typename component::director director; component c = spirit::as_component(karma::domain(), xpr); return director::generate(c, sink, unused, unused, param); } /////////////////////////////////////////////////////////////////////////// template inline bool generate_delimited(OutputIterator target_sink, Expr const& xpr, Delimiter const& delimiter) { typedef spirit::traits::is_component expr_is_component; typedef spirit::traits::is_component 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 sink(target_sink); typedef typename result_of::as_component::type component; typedef typename component::director director; typedef typename result_of::as_component::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 inline bool generate_delimited(detail::output_iterator& sink, Expr const& xpr, Delimiter const& delimiter) { typedef spirit::traits::is_component expr_is_component; typedef spirit::traits::is_component 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::type component; typedef typename component::director director; typedef typename result_of::as_component::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 inline bool generate_delimited(OutputIterator target_sink, Expr const& xpr, Parameter const& param, Delimiter const& delimiter) { typedef spirit::traits::is_component expr_is_component; typedef spirit::traits::is_component 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 sink(target_sink); typedef typename result_of::as_component::type component; typedef typename component::director director; typedef typename result_of::as_component::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 inline bool generate_delimited(detail::output_iterator& sink, Expr const& xpr, Parameter const& param, Delimiter const& delimiter) { typedef spirit::traits::is_component expr_is_component; typedef spirit::traits::is_component 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::type component; typedef typename component::director director; typedef typename result_of::as_component::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