blob: c1873486f59b528c414be5d495662dd434052055 [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_CASE_META_GRAMMAR_FEB_21_2007_0826PM)
#define BOOST_SPIRIT_KARMA_CASE_META_GRAMMAR_FEB_21_2007_0826PM
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#pragma once // MS compatible compilers support #pragma once
#endif
#include <boost/spirit/home/support/modifier.hpp>
#include <boost/spirit/home/support/meta_grammar.hpp>
#include <boost/spirit/home/karma/domain.hpp>
#include <boost/spirit/home/support/iso8859_1.hpp>
#include <boost/spirit/home/support/ascii.hpp>
#include <boost/spirit/home/support/standard.hpp>
#include <boost/spirit/home/support/standard_wide.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/or.hpp>
namespace boost { namespace spirit { namespace karma
{
///////////////////////////////////////////////////////////////////////////
// forwards
///////////////////////////////////////////////////////////////////////////
struct main_meta_grammar;
///////////////////////////////////////////////////////////////////////////
template <typename Expr, typename Enable>
struct is_valid_expr;
template <typename Expr, typename Enable>
struct expr_transform;
///////////////////////////////////////////////////////////////////////////
// lower and upper directive meta-grammars
///////////////////////////////////////////////////////////////////////////
struct lower_case_directive_meta_grammar
: meta_grammar::deep_directive_meta_grammar<
spirit::char_class::lower_case_tag<proto::_>,
main_meta_grammar
>
{};
struct upper_case_directive_meta_grammar
: meta_grammar::deep_directive_meta_grammar<
spirit::char_class::upper_case_tag<proto::_>,
main_meta_grammar
>
{};
// main directive_meta_grammar
struct directive_meta_grammar
: proto::or_<
lower_case_directive_meta_grammar,
upper_case_directive_meta_grammar
>
{};
///////////////////////////////////////////////////////////////////////////
// These specializations non-intrusively hooks into the Karma meta-grammar.
// (see karma/meta_grammar.hpp)
///////////////////////////////////////////////////////////////////////////
template <typename Expr>
struct is_valid_expr<Expr,
typename enable_if<proto::matches<Expr, directive_meta_grammar> >::type>
: mpl::true_
{
};
template <typename Expr>
struct expr_transform<Expr,
typename enable_if<proto::matches<Expr, directive_meta_grammar> >::type>
: mpl::identity<directive_meta_grammar>
{
};
}}}
namespace boost { namespace spirit
{
///////////////////////////////////////////////////////////////////////////
// The following specializations for the add_modifier template are added
// to allow for special handling of the lower[] and upper[] directives
// which are mutually exclusive. Since the first of these directives
// added to the modifier corresponds to the outermost one in the generator
// expression, we just ignore the request to add a tag if one of the two
// has been already added.
template <typename Modifier, typename Tag>
struct add_modifier<Modifier, spirit::char_class::lower_case_tag<Tag> >
{
// add the new tag to the modifier (if it isn't already)
typedef spirit::char_class::upper_case_tag<Tag> reciprocal_tag;
typedef spirit::char_class::lower_case_tag<Tag> tag;
typedef typename
mpl::if_<
mpl::or_<
is_member_of_modifier<Modifier, reciprocal_tag>,
is_member_of_modifier<Modifier, tag>
>,
Modifier,
modifier<Modifier, tag>
>::type
type;
};
///////////////////////////////////////////////////////////////////////////
template <typename Modifier, typename Tag>
struct add_modifier<Modifier, spirit::char_class::upper_case_tag<Tag> >
{
// add the new tag to the modifier (if it isn't already)
typedef spirit::char_class::lower_case_tag<Tag> reciprocal_tag;
typedef spirit::char_class::upper_case_tag<Tag> tag;
typedef typename
mpl::if_<
mpl::or_<
is_member_of_modifier<Modifier, reciprocal_tag>,
is_member_of_modifier<Modifier, tag>
>,
Modifier,
modifier<Modifier, tag>
>::type
type;
};
}}
#endif