c_ctype.hpp
来自「support vector clustering for vc++」· 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 + -
显示快捷键?