//  Copyright (c) 2001-2011 Hartmut Kaiser
//  Copyright (c) 2001-2011 Joel de Guzman
// 
//  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(SPIRIT_UPPER_LOWER_CASE_JANUARY_19_2009_1142AM)
#define SPIRIT_UPPER_LOWER_CASE_JANUARY_19_2009_1142AM

#if defined(_MSC_VER)
#pragma once
#endif

#include <boost/spirit/home/support/common_terminals.hpp>
#include <boost/spirit/home/support/modify.hpp>
#include <boost/spirit/home/karma/domain.hpp>
#include <boost/spirit/home/karma/meta_compiler.hpp>

namespace boost { namespace spirit
{
    ///////////////////////////////////////////////////////////////////////////
    // Enablers
    ///////////////////////////////////////////////////////////////////////////
    template <typename CharEncoding>
    struct use_directive<
        karma::domain, tag::char_code<tag::upper, CharEncoding> > // enables upper
      : mpl::true_ {};

    template <typename CharEncoding>
    struct use_directive<
        karma::domain, tag::char_code<tag::lower, CharEncoding> > // enables lower
      : mpl::true_ {};

    ///////////////////////////////////////////////////////////////////////////
    template <typename CharEncoding>
    struct is_modifier_directive<karma::domain
        , tag::char_code<tag::upper, CharEncoding> >
      : mpl::true_ {};

    template <typename CharEncoding>
    struct is_modifier_directive<karma::domain
        , tag::char_code<tag::lower, CharEncoding> >
      : mpl::true_ {};

    ///////////////////////////////////////////////////////////////////////////
    // Don't add tag::upper or tag::lower if there is already one of those in
    // the modifier list
    template <typename Current, typename CharEncoding>
    struct compound_modifier<
            Current
          , tag::char_code<tag::upper, CharEncoding>
          , typename enable_if<
                has_modifier<Current, tag::char_code<tag::lower, CharEncoding> > 
            >::type
          >
      : Current
    {
        compound_modifier()
          : Current() {}

        compound_modifier(Current const& current, 
                tag::char_code<tag::upper, CharEncoding> const&)
          : Current(current) {}
    };

    template <typename Current, typename CharEncoding>
    struct compound_modifier<
            Current
          , tag::char_code<tag::lower, CharEncoding>
          , typename enable_if<
                has_modifier<Current, tag::char_code<tag::upper, CharEncoding> > 
            >::type
          >
      : Current
    {
        compound_modifier()
          : Current() {}

        compound_modifier(Current const& current, 
                tag::char_code<tag::lower, CharEncoding> const&)
          : Current(current) {}
    };
}}

#endif
