/*=============================================================================
    Copyright (c) 2001-2010 Hartmut Kaiser
    Copyright (c) 2001-2010 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(BOOST_SPIRIT_STANDARD_WIDE_NOVEMBER_10_2006_0913AM)
#define BOOST_SPIRIT_STANDARD_WIDE_NOVEMBER_10_2006_0913AM

#if defined(_MSC_VER)
#pragma once
#endif

#include <cwctype>
#include <string>

#include <boost/cstdint.hpp>
#include <boost/spirit/home/support/assert_msg.hpp>

namespace boost { namespace spirit { namespace traits
{
    template <std::size_t N>
    struct wchar_t_size
    {
        BOOST_SPIRIT_ASSERT_MSG(N == 1 || N == 2 || N == 4,
            not_supported_size_of_wchar_t, ());
    };

    template <> struct wchar_t_size<1> { enum { mask = 0xff }; };
    template <> struct wchar_t_size<2> { enum { mask = 0xffff }; };
    template <> struct wchar_t_size<4> { enum { mask = 0xffffffff }; };

}}}

namespace boost { namespace spirit { namespace char_encoding
{
    ///////////////////////////////////////////////////////////////////////////
    //  Test characters for specified conditions (using std wchar_t functions)
    ///////////////////////////////////////////////////////////////////////////

    struct standard_wide
    {
        typedef wchar_t char_type;

        template <typename Char>
        static typename std::char_traits<Char>::int_type
        to_int_type(Char ch)
        {
            return std::char_traits<Char>::to_int_type(ch);
        }

        template <typename Char>
        static Char
        to_char_type(typename std::char_traits<Char>::int_type ch)
        {
            return std::char_traits<Char>::to_char_type(ch);
        }

        static bool
        ischar(int ch)
        {
            // we have to watch out for sign extensions (casting is there to 
            // silence certain compilers complaining about signed/unsigned
            // mismatch)
            return (
                std::size_t(0) == 
                    std::size_t(ch & ~traits::wchar_t_size<sizeof(wchar_t)>::mask) || 
                std::size_t(~0) == 
                    std::size_t(ch | traits::wchar_t_size<sizeof(wchar_t)>::mask)
            ) ? true : false;     // any wchar_t, but no other bits set
        }

        static bool
        isalnum(wchar_t ch)
        {
            using namespace std;
            return iswalnum(to_int_type(ch)) ? true : false;
        }

        static bool
        isalpha(wchar_t ch)
        {
            using namespace std;
            return iswalpha(to_int_type(ch)) ? true : false;
        }

        static bool
        iscntrl(wchar_t ch)
        {
            using namespace std;
            return iswcntrl(to_int_type(ch)) ? true : false;
        }

        static bool
        isdigit(wchar_t ch)
        {
            using namespace std;
            return iswdigit(to_int_type(ch)) ? true : false;
        }

        static bool
        isgraph(wchar_t ch)
        {
            using namespace std;
            return iswgraph(to_int_type(ch)) ? true : false;
        }

        static bool
        islower(wchar_t ch)
        {
            using namespace std;
            return iswlower(to_int_type(ch)) ? true : false;
        }

        static bool
        isprint(wchar_t ch)
        {
            using namespace std;
            return iswprint(to_int_type(ch)) ? true : false;
        }

        static bool
        ispunct(wchar_t ch)
        {
            using namespace std;
            return iswpunct(to_int_type(ch)) ? true : false;
        }

        static bool
        isspace(wchar_t ch)
        {
            using namespace std;
            return iswspace(to_int_type(ch)) ? true : false;
        }

        static bool
        isupper(wchar_t ch)
        {
            using namespace std;
            return iswupper(to_int_type(ch)) ? true : false;
        }

        static bool
        isxdigit(wchar_t ch)
        {
            using namespace std;
            return iswxdigit(to_int_type(ch)) ? true : false;
        }

        static bool
        isblank BOOST_PREVENT_MACRO_SUBSTITUTION (wchar_t ch)
        {
            return (ch == L' ' || ch == L'\t');
        }

        static wchar_t
        tolower(wchar_t ch)
        {
            using namespace std;
            return isupper(ch) ?
                to_char_type<wchar_t>(towlower(to_int_type(ch))) : ch;
        }

        static wchar_t
        toupper(wchar_t ch)
        {
            using namespace std;
            return islower(ch) ?
                to_char_type<wchar_t>(towupper(to_int_type(ch))) : ch;
        }

        static ::boost::uint32_t
        toucs4(int ch)
        {
            return ch;
        }
    };
}}}

#endif

