c_ctype.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 842 行 · 第 1/3 页

HPP
842
字号
    {        using namespace std;        return ((char_class_alpha & mask) && iswalpha(ch))            || ((char_class_blank & mask) && (L' ' == ch || L'\t' == ch)) // BUGBUG            || ((char_class_cntrl & mask) && iswcntrl(ch))            || ((char_class_digit & mask) && iswdigit(ch))            || ((char_class_lower & mask) && iswlower(ch))            || ((char_class_newline & mask) && detail::iswnewline(ch))            || ((char_class_punct & mask) && iswpunct(ch))            || ((char_class_space & mask) && iswspace(ch))            || ((char_class_upper & mask) && iswupper(ch))            || ((char_class_underscore & mask) && L'_' == ch)            || ((char_class_xdigit & mask) && iswxdigit(ch))            ;    }};#endif#elif defined(_CPPLIB_VER) // Dinkumware STL/////////////////////////////////////////////////////////////////////////////////template<>struct char_class_impl<char>{    typedef int char_class_type;    BOOST_MPL_ASSERT_RELATION(0x81FF, ==, (_ALPHA|_UPPER|_LOWER|_DIGIT|_SPACE|_PUNCT|_CONTROL|_BLANK|_HEX|_LEADBYTE));    BOOST_STATIC_CONSTANT(int, char_class_underscore = 0x1000);    BOOST_STATIC_CONSTANT(int, char_class_newline = 0x2000);    template<typename FwdIter>    static char_class_type lookup_classname(FwdIter begin, FwdIter end, bool icase)    {        using namespace std;        string const name = classname_a(begin, end);        if(name == "alnum")     return _ALPHA|_DIGIT;        if(name == "alpha")     return _ALPHA;        if(name == "blank")     return _BLANK; // this is ONLY space!!!        if(name == "cntrl")     return _CONTROL;        if(name == "d")         return _DIGIT;        if(name == "digit")     return _DIGIT;        if(name == "graph")     return _PUNCT|_ALPHA|_DIGIT;        if(name == "lower")     return icase ? (_LOWER|_UPPER) : _LOWER;        if(name == "newline")   return char_class_newline;        if(name == "print")     return _BLANK|_PUNCT|_ALPHA|_DIGIT;        if(name == "punct")     return _PUNCT;        if(name == "s")         return _SPACE;        if(name == "space")     return _SPACE;        if(name == "upper")     return icase ? (_UPPER|_LOWER) : _UPPER;        if(name == "w")         return _ALPHA|_DIGIT|char_class_underscore;        if(name == "xdigit")    return _HEX;        return 0;    }    static bool isctype(char ch, char_class_type mask)    {        using namespace std;        if(0 != _isctype(static_cast<unsigned char>(ch), mask))        {            return true;        }        switch(ch)        {        case '\t': return 0 != (mask & _BLANK);        case '_': return 0 != (mask & char_class_underscore);        case '\n': case '\r': case '\f': return 0 != (mask & char_class_newline);        default:;        }        return false;    }};#ifndef BOOST_XPRESSIVE_NO_WREGEX/////////////////////////////////////////////////////////////////////////////////template<>struct char_class_impl<wchar_t>{    typedef wctype_t char_class_type;    BOOST_MPL_ASSERT_RELATION(0x81FF, ==, (_ALPHA|_UPPER|_LOWER|_DIGIT|_SPACE|_PUNCT|_CONTROL|_BLANK|_HEX|_LEADBYTE));    BOOST_STATIC_CONSTANT(int, char_class_underscore = 0x1000);    BOOST_STATIC_CONSTANT(int, char_class_newline = 0x2000);    template<typename FwdIter>    static char_class_type lookup_classname(FwdIter begin, FwdIter end, bool icase)    {        using namespace std;        wstring const name = classname_w(begin, end);        if(name == L"alnum")    return _ALPHA|_DIGIT;        if(name == L"alpha")    return _ALPHA;        if(name == L"blank")    return _BLANK; // this is ONLY space!!!        if(name == L"cntrl")    return _CONTROL;        if(name == L"d")        return _DIGIT;        if(name == L"digit")    return _DIGIT;        if(name == L"graph")    return _PUNCT|_ALPHA|_DIGIT;        if(name == L"lower")    return icase ? _LOWER|_UPPER : _LOWER;        if(name == L"newline")  return char_class_newline;        if(name == L"print")    return _BLANK|_PUNCT|_ALPHA|_DIGIT;        if(name == L"punct")    return _PUNCT;        if(name == L"s")        return _SPACE;        if(name == L"space")    return _SPACE;        if(name == L"upper")    return icase ? _UPPER|_LOWER : _UPPER;        if(name == L"w")        return _ALPHA|_DIGIT|char_class_underscore;        if(name == L"xdigit")   return _HEX;        return 0;    }    static bool isctype(wchar_t ch, char_class_type mask)    {        using namespace std;        if(0 != iswctype(ch, mask))        {            return true;        }        switch(ch)        {        case L'\t': return 0 != (mask & _BLANK);        case L'_': return 0 != (mask & char_class_underscore);        case L'\n': case L'\r': case L'\f': case 0x2028u: case 0x2029u: case 0x85u:            return 0 != (mask & char_class_newline);        default:;        }        return false;    }};#endif#else // unknown, use portable implementation/////////////////////////////////////////////////////////////////////////////////template<>struct char_class_impl<char>{    typedef int char_class_type;    //BOOST_STATIC_CONSTANT(int, char_class_alnum         = 0x0001);    BOOST_STATIC_CONSTANT(int, char_class_alpha         = 0x0002);    BOOST_STATIC_CONSTANT(int, char_class_blank         = 0x0004);    BOOST_STATIC_CONSTANT(int, char_class_cntrl         = 0x0008);    BOOST_STATIC_CONSTANT(int, char_class_digit         = 0x0010);    //BOOST_STATIC_CONSTANT(int, char_class_graph         = 0x0020);    BOOST_STATIC_CONSTANT(int, char_class_lower         = 0x0040);    //BOOST_STATIC_CONSTANT(int, char_class_print         = 0x0080);    BOOST_STATIC_CONSTANT(int, char_class_punct         = 0x0100);    BOOST_STATIC_CONSTANT(int, char_class_space         = 0x0200);    BOOST_STATIC_CONSTANT(int, char_class_upper         = 0x0400);    BOOST_STATIC_CONSTANT(int, char_class_underscore    = 0x0800);    BOOST_STATIC_CONSTANT(int, char_class_xdigit        = 0x1000);    BOOST_STATIC_CONSTANT(int, char_class_newline       = 0x2000);    template<typename FwdIter>    static char_class_type lookup_classname(FwdIter begin, FwdIter end, bool icase)    {        using namespace std;        string const name = classname_a(begin, end);        if(name == "alnum")     return char_class_alpha|char_class_digit;        if(name == "alpha")     return char_class_alpha;        if(name == "blank")     return char_class_blank;        if(name == "cntrl")     return char_class_cntrl;        if(name == "d")         return char_class_digit;        if(name == "digit")     return char_class_digit;        if(name == "graph")     return char_class_punct|char_class_alpha|char_class_digit;        if(name == "lower")     return icase ? (char_class_lower|char_class_upper) : char_class_lower;        if(name == "newline")   return char_class_newline;        if(name == "print")     return char_class_blank|char_class_punct|char_class_alpha|char_class_digit;        if(name == "punct")     return char_class_punct;        if(name == "s")         return char_class_space;        if(name == "space")     return char_class_space;        if(name == "upper")     return icase ? (char_class_upper|char_class_lower) : char_class_upper;        if(name == "w")         return char_class_alpha|char_class_digit|char_class_underscore;        if(name == "xdigit")    return char_class_xdigit;        return 0;    }    static bool isctype(char ch, char_class_type mask)    {        using namespace std;        unsigned char uch = static_cast<unsigned char>(ch);        return ((char_class_alpha & mask) && isalpha(uch))            || ((char_class_blank & mask) && (' ' == ch || '\t' == ch)) // BUGBUG            || ((char_class_cntrl & mask) && iscntrl(uch))            || ((char_class_digit & mask) && isdigit(uch))            || ((char_class_lower & mask) && islower(uch))            || ((char_class_newline & mask) && detail::isnewline(ch))            || ((char_class_punct & mask) && ispunct(uch))            || ((char_class_space & mask) && isspace(uch))            || ((char_class_upper & mask) && isupper(uch))            || ((char_class_underscore & mask) && '_' == ch)            || ((char_class_xdigit & mask) && isxdigit(uch))            ;    }};#ifndef BOOST_XPRESSIVE_NO_WREGEX/////////////////////////////////////////////////////////////////////////////////template<>struct char_class_impl<wchar_t>{    typedef int char_class_type;    //BOOST_STATIC_CONSTANT(int, char_class_alnum         = 0x0001);    BOOST_STATIC_CONSTANT(int, char_class_alpha         = 0x0002);    BOOST_STATIC_CONSTANT(int, char_class_blank         = 0x0004);    BOOST_STATIC_CONSTANT(int, char_class_cntrl         = 0x0008);    BOOST_STATIC_CONSTANT(int, char_class_digit         = 0x0010);    //BOOST_STATIC_CONSTANT(int, char_class_graph         = 0x0020);    BOOST_STATIC_CONSTANT(int, char_class_lower         = 0x0040);    //BOOST_STATIC_CONSTANT(int, char_class_print         = 0x0080);    BOOST_STATIC_CONSTANT(int, char_class_punct         = 0x0100);    BOOST_STATIC_CONSTANT(int, char_class_space         = 0x0200);    BOOST_STATIC_CONSTANT(int, char_class_upper         = 0x0400);    BOOST_STATIC_CONSTANT(int, char_class_underscore    = 0x0800);    BOOST_STATIC_CONSTANT(int, char_class_xdigit        = 0x1000);    BOOST_STATIC_CONSTANT(int, char_class_newline       = 0x2000);    template<typename FwdIter>    static char_class_type lookup_classname(FwdIter begin, FwdIter end, bool icase)    {        using namespace std;        wstring const name = classname_w(begin, end);        if(name == L"alnum")    return char_class_alpha|char_class_digit;        if(name == L"alpha")    return char_class_alpha;        if(name == L"blank")    return char_class_blank;        if(name == L"cntrl")    return char_class_cntrl;        if(name == L"d")        return char_class_digit;        if(name == L"digit")    return char_class_digit;        if(name == L"graph")    return char_class_punct|char_class_alpha|char_class_digit;        if(name == L"newline")  return char_class_newline;        if(name == L"lower")    return icase ? (char_class_lower|char_class_upper) : char_class_lower;        if(name == L"print")    return char_class_blank|char_class_punct|char_class_alpha|char_class_digit;        if(name == L"punct")    return char_class_punct;        if(name == L"s")        return char_class_space;        if(name == L"space")    return char_class_space;        if(name == L"upper")    return icase ? (char_class_upper|char_class_lower) : char_class_upper;        if(name == L"w")        return char_class_alpha|char_class_digit|char_class_underscore;        if(name == L"xdigit")   return char_class_xdigit;        return 0;    }    static bool isctype(wchar_t ch, char_class_type mask)    {        using namespace std;        return ((char_class_alpha & mask) && iswalpha(ch))            || ((char_class_blank & mask) && (L' ' == ch || L'\t' == ch)) // BUGBUG            || ((char_class_cntrl & mask) && iswcntrl(ch))            || ((char_class_digit & mask) && iswdigit(ch))            || ((char_class_lower & mask) && iswlower(ch))            || ((char_class_newline & mask) && detail::iswnewline(ch))            || ((char_class_punct & mask) && iswpunct(ch))            || ((char_class_space & mask) && iswspace(ch))            || ((char_class_upper & mask) && iswupper(ch))            || ((char_class_underscore & mask) && L'_' == ch)            || ((char_class_xdigit & mask) && iswxdigit(ch))            ;    }};#endif#endif}}} // namespace boost::xpressive::detail#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?