/*=============================================================================
    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_APRIL_26_2006_1106PM)
#define BOOST_SPIRIT_STANDARD_APRIL_26_2006_1106PM

#if defined(_MSC_VER)
#pragma once
#endif

#include <cctype>
#include <boost/cstdint.hpp>

namespace boost { namespace spirit { namespace char_encoding
{
    ///////////////////////////////////////////////////////////////////////////
    //  Test characters for specified conditions (using std functions)
    ///////////////////////////////////////////////////////////////////////////
    struct standard
    {
        typedef char char_type;

        static bool
        isascii_(int ch)
        {
            return 0 == (ch & ~0x7f);
        }

        static bool
        ischar(int ch)
        {
            // uses all 8 bits
            // we have to watch out for sign extensions
            return (0 == (ch & ~0xff) || ~0 == (ch | 0xff)) ? true : false;
        }

        static int
        isalnum(int ch)
        {
            return std::isalnum(ch);
        }

        static int
        isalpha(int ch)
        {
            return std::isalpha(ch);
        }

        static int
        isdigit(int ch)
        {
            return std::isdigit(ch);
        }

        static int
        isxdigit(int ch)
        {
            return std::isxdigit(ch);
        }

        static int
        iscntrl(int ch)
        {
            return std::iscntrl(ch);
        }

        static int
        isgraph(int ch)
        {
            return std::isgraph(ch);
        }

        static int
        islower(int ch)
        {
            return std::islower(ch);
        }

        static int
        isprint(int ch)
        {
            return std::isprint(ch);
        }

        static int
        ispunct(int ch)
        {
            return std::ispunct(ch);
        }

        static int
        isspace(int ch)
        {
            return std::isspace(ch);
        }

        static int
        isblank BOOST_PREVENT_MACRO_SUBSTITUTION (int ch)
        {
            return (ch == ' ' || ch == '\t');
        }

        static int
        isupper(int ch)
        {
            return std::isupper(ch);
        }

    ///////////////////////////////////////////////////////////////////////////////
    //  Simple character conversions
    ///////////////////////////////////////////////////////////////////////////////
        static int
        tolower(int ch)
        {
            return std::tolower(ch);
        }

        static int
        toupper(int ch)
        {
            return std::toupper(ch);
        }

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

#endif

