regex_traits.hpp
来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 1,199 行 · 第 1/3 页
HPP
1,199 行
/* * * Copyright (c) 1998-2002 * Dr John Maddock * * Use, modification and distribution are subject to 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) * */ /* * LOCATION: see http://www.boost.org for most recent version. * FILE regex_traits.hpp * VERSION see <boost/version.hpp> * DESCRIPTION: Declares regular expression traits classes. */#ifndef BOOST_REGEX_TRAITS_HPP_INCLUDED#define BOOST_REGEX_TRAITS_HPP_INCLUDED#ifndef BOOST_RE_CREGEX_HPP#include <boost/cregex.hpp>#endif#ifndef BOOST_REGEX_CSTRING_HPP#include <boost/regex/v4/regex_cstring.hpp>#endifnamespace boost{#ifdef BOOST_HAS_ABI_HEADERS# include BOOST_ABI_PREFIX#endiftemplate <class charT>class c_regex_traits;namespace re_detail{struct mss{ unsigned int id; const char* what;};BOOST_REGEX_DECL bool BOOST_REGEX_CALL re_lookup_def_collate_name(std::string& buf, const char* name);BOOST_REGEX_DECL std::size_t BOOST_REGEX_CALL re_get_default_message(char* buf, std::size_t len, std::size_t id);extern BOOST_REGEX_DECL const char *re_default_error_messages[];#ifndef BOOST_NO_WREGEXextern BOOST_REGEX_DECL regex_wchar_type wide_lower_case_map[];extern BOOST_REGEX_DECL unsigned short wide_unicode_classes[];BOOST_REGEX_DECL bool BOOST_REGEX_CALL is_combining(regex_wchar_type c);#endifstruct BOOST_REGEX_DECL regex_traits_base{ enum char_syntax_type { syntax_char = 0, syntax_open_bracket = 1, // ( syntax_close_bracket = 2, // ) syntax_dollar = 3, // $ syntax_caret = 4, // ^ syntax_dot = 5, // . syntax_star = 6, // * syntax_plus = 7, // + syntax_question = 8, // ? syntax_open_set = 9, // [ syntax_close_set = 10, // ] syntax_or = 11, // | syntax_slash = 12, // syntax_hash = 13, // # syntax_dash = 14, // - syntax_open_brace = 15, // { syntax_close_brace = 16, // } syntax_digit = 17, // 0-9 syntax_b = 18, // for \b syntax_B = 19, // for \B syntax_left_word = 20, // for \< syntax_right_word = 21, // for \> syntax_w = 22, // for \w syntax_W = 23, // for \W syntax_start_buffer = 24, // for \` syntax_end_buffer = 25, // for \' syntax_newline = 26, // for newline alt syntax_comma = 27, // for {x,y} syntax_a = 28, // for \a syntax_f = 29, // for \f syntax_n = 30, // for \n syntax_r = 31, // for \r syntax_t = 32, // for \t syntax_v = 33, // for \v syntax_x = 34, // for \xdd syntax_c = 35, // for \cx syntax_colon = 36, // for [:...:] syntax_equal = 37, // for [=...=] // perl ops: syntax_e = 38, // for \e syntax_l = 39, // for \l syntax_L = 40, // for \L syntax_u = 41, // for \u syntax_U = 42, // for \U syntax_s = 43, // for \s syntax_S = 44, // for \S syntax_d = 45, // for \d syntax_D = 46, // for \D syntax_E = 47, // for \Q\E syntax_Q = 48, // for \Q\E syntax_X = 49, // for \X syntax_C = 50, // for \C syntax_Z = 51, // for \Z syntax_G = 52, // for \G // new extentions: syntax_not = 53, // for (?!...) syntax_max = 54 };#ifdef __BORLANDC__private: char dummy_member;#endif};struct BOOST_REGEX_DECL c_traits_base : public regex_traits_base{public: enum{ char_class_none = 0, char_class_alpha = 0x0001, char_class_cntrl = 0x0002, char_class_digit = 0x0004, char_class_lower = 0x0008, char_class_punct = 0x0010, char_class_space = 0x0020, char_class_upper = 0x0040, char_class_xdigit = 0x0080, char_class_blank = 0x0100, char_class_underscore = 0x4000, char_class_unicode = 0x8000, char_class_alnum = char_class_alpha | char_class_digit, char_class_graph = char_class_alpha | char_class_digit | char_class_punct | char_class_underscore, char_class_print = char_class_alpha | char_class_digit | char_class_punct | char_class_underscore | char_class_blank, char_class_word = char_class_alpha | char_class_digit | char_class_underscore }; static std::string BOOST_REGEX_CALL set_message_catalogue(const std::string& s);protected:#if defined(__MWERKS__) && __MWERKS__ <= 0x6000 friend class c_regex_traits<char>; friend class c_regex_traits<regex_wchar_type>;#endif static char regex_message_catalogue[BOOST_REGEX_MAX_PATH]; enum syntax_map_size { map_size = UCHAR_MAX + 1 }; static unsigned char syntax_map[map_size]; static unsigned short class_map[map_size]; static char lower_case_map[map_size]; static boost::uint_fast32_t BOOST_REGEX_CALL do_lookup_class(const char* p); static bool BOOST_REGEX_CALL do_lookup_collate(std::string& buf, const char* p); static void BOOST_REGEX_CALL do_update_ctype(); static void BOOST_REGEX_CALL do_update_collate();public: static std::string BOOST_REGEX_CALL error_string(unsigned id); static char* BOOST_REGEX_CALL get_catalogue() { return regex_message_catalogue; }};} // namespace re_detailtemplate<>class BOOST_REGEX_DECL c_regex_traits<char> : public re_detail::c_traits_base{ typedef re_detail::c_traits_base base_type;public: typedef char char_type; typedef unsigned char uchar_type; typedef unsigned int size_type; typedef std::string string_type; typedef int locale_type; static std::size_t BOOST_REGEX_CALL length(const char_type* p) { return std::strlen(p); } static unsigned int BOOST_REGEX_CALL syntax_type(size_type c) { return syntax_map[c]; } static char BOOST_REGEX_CALL translate(char c, bool icase) { return icase ? lower_case_map[(size_type)(uchar_type)c] : c; } static void BOOST_REGEX_CALL transform(std::string& out, const std::string& in); static void BOOST_REGEX_CALL transform_primary(std::string& out, const std::string& in); static bool BOOST_REGEX_CALL is_separator(char c) { return BOOST_REGEX_MAKE_BOOL((c == '\n') || (c == '\r')); } static bool BOOST_REGEX_CALL is_combining(char) { return false; } static bool BOOST_REGEX_CALL is_class(char c, boost::uint_fast32_t f) { return BOOST_REGEX_MAKE_BOOL(class_map[(size_type)(uchar_type)c] & f); } static int BOOST_REGEX_CALL toi(char c); static int BOOST_REGEX_CALL toi(const char*& first, const char* last, int radix); static boost::uint_fast32_t BOOST_REGEX_CALL lookup_classname(const char* first, const char* last) { std::string s(first, last); return do_lookup_class(s.c_str()); } static bool BOOST_REGEX_CALL lookup_collatename(std::string& buf, const char* first, const char* last) { std::string s(first, last); return do_lookup_collate(buf, s.c_str()); } static locale_type BOOST_REGEX_CALL imbue(locale_type l){ return l; } locale_type BOOST_REGEX_CALL getloc()const{ return locale_type(); } void swap(c_regex_traits&){} c_regex_traits() { init(); } ~c_regex_traits() { m_free(); } struct sentry { sentry(const c_regex_traits<char>&) { c_regex_traits<char>::update(); } operator void*() { return this; } }; static void BOOST_REGEX_CALL update();private: static void BOOST_REGEX_CALL init(); static void BOOST_REGEX_CALL m_free(); static c_regex_traits<char> i; static unsigned sort_type; static char sort_delim;};#ifndef BOOST_NO_WREGEXtemplate<>class BOOST_REGEX_DECL c_regex_traits<regex_wchar_type> : public re_detail::c_traits_base{ typedef re_detail::c_traits_base base_type;public: typedef regex_wchar_type char_type; typedef unsigned short uchar_type; typedef unsigned int size_type; typedef std::basic_string<regex_wchar_type> string_type; typedef int locale_type; #ifndef BOOST_REGEX_HAS_SHORT_WCHAR_T static std::size_t BOOST_REGEX_CALL length(const char_type* p) { return std::wcslen(p); }#else static std::size_t BOOST_REGEX_CALL length(const char_type* p) { return std::wcslen(reinterpret_cast<const wchar_t*>(p)); }#endif static unsigned int BOOST_REGEX_CALL syntax_type(size_type c); static regex_wchar_type BOOST_REGEX_CALL translate(regex_wchar_type c, bool icase) { return icase ? ((c < 256) ? re_detail::wide_lower_case_map[(uchar_type)c] : std::towlower(c)) : c; } static void BOOST_REGEX_CALL transform(std::basic_string<regex_wchar_type>& out, const std::basic_string<regex_wchar_type>& in); static void BOOST_REGEX_CALL transform_primary(std::basic_string<regex_wchar_type>& out, const std::basic_string<regex_wchar_type>& in); static bool BOOST_REGEX_CALL is_separator(regex_wchar_type c) { return BOOST_REGEX_MAKE_BOOL((c == L'\n') || (c == L'\r') || (c == (regex_wchar_type)0x2028) || (c == (regex_wchar_type)0x2029)); } static bool BOOST_REGEX_CALL is_combining(regex_wchar_type c) { return re_detail::is_combining(c); } static bool BOOST_REGEX_CALL is_class(regex_wchar_type c, boost::uint_fast32_t f) { return BOOST_REGEX_MAKE_BOOL(((uchar_type)c < 256) ? (re_detail::wide_unicode_classes[(size_type)(uchar_type)c] & f) : do_iswclass(c, f)); } static int BOOST_REGEX_CALL toi(regex_wchar_type c); static int BOOST_REGEX_CALL toi(const regex_wchar_type*& first, const regex_wchar_type* last, int radix); static boost::uint_fast32_t BOOST_REGEX_CALL lookup_classname(const regex_wchar_type* first, const regex_wchar_type* last); static bool BOOST_REGEX_CALL lookup_collatename(std::basic_string<regex_wchar_type>& s, const regex_wchar_type* first, const regex_wchar_type* last); static locale_type BOOST_REGEX_CALL imbue(locale_type l){ return l; } locale_type BOOST_REGEX_CALL getloc()const{ return locale_type(); } void swap(c_regex_traits&){} c_regex_traits<regex_wchar_type>() { init(); } ~c_regex_traits<regex_wchar_type>() { m_free(); } struct sentry { sentry(const c_regex_traits<regex_wchar_type>&) { c_regex_traits<regex_wchar_type>::update(); } operator void*() { return this; } }; static void BOOST_REGEX_CALL update(); static std::size_t BOOST_REGEX_CALL strnarrow(char *s1, std::size_t len, const regex_wchar_type *s2); static std::size_t BOOST_REGEX_CALL strwiden(regex_wchar_type *s1, std::size_t len, const char *s2);private: static bool BOOST_REGEX_CALL do_iswclass(regex_wchar_type c, boost::uint_fast32_t f); static void BOOST_REGEX_CALL m_free(); static void BOOST_REGEX_CALL init(); static bool BOOST_REGEX_CALL do_lookup_collate(std::basic_string<regex_wchar_type>& out, const regex_wchar_type* first, const regex_wchar_type* last); static c_regex_traits<regex_wchar_type> init_; static unsigned sort_type; static regex_wchar_type sort_delim;};#ifdef BOOST_REGEX_HAS_SHORT_WCHAR_T//// What follows here is Visual Studio specific - it is a thin wrapper// that redirects calls to c_regex_traits<unsigned short> to// c_regex_traits<__wchar_t>. This allows the library to be built// so that it supports programs built both with and without /Zc:wchar_t.//template<>class c_regex_traits<unsigned short> : public re_detail::c_traits_base{ typedef re_detail::c_traits_base base_type;public: typedef unsigned short char_type; typedef unsigned short uchar_type; typedef unsigned int size_type; typedef std::basic_string<unsigned short> string_type; typedef int locale_type; static std::size_t BOOST_REGEX_CALL length(const char_type* p) { return c_regex_traits<regex_wchar_type>::length( reinterpret_cast<const regex_wchar_type*>(p)); } static unsigned int BOOST_REGEX_CALL syntax_type(size_type c) { return c_regex_traits<regex_wchar_type>::syntax_type(c); } static unsigned short BOOST_REGEX_CALL translate(unsigned short c, bool icase) { return c_regex_traits<regex_wchar_type>::translate(c, icase); } static void BOOST_REGEX_CALL transform(std::basic_string<unsigned short>& out, const std::basic_string<unsigned short>& in) { c_regex_traits<regex_wchar_type>::transform( reinterpret_cast<std::basic_string<regex_wchar_type>&>(out), reinterpret_cast<const std::basic_string<regex_wchar_type>&>(in)); } static void BOOST_REGEX_CALL transform_primary(std::basic_string<unsigned short>& out, const std::basic_string<unsigned short>& in) { c_regex_traits<regex_wchar_type>::transform_primary( reinterpret_cast<std::basic_string<regex_wchar_type>&>(out), reinterpret_cast<const std::basic_string<regex_wchar_type>&>(in)); } static bool BOOST_REGEX_CALL is_separator(unsigned short c) { return c_regex_traits<regex_wchar_type>::is_separator(c); } static bool BOOST_REGEX_CALL is_combining(unsigned short c) { return c_regex_traits<regex_wchar_type>::is_combining(c); } static bool BOOST_REGEX_CALL is_class(unsigned short c, boost::uint_fast32_t f) { return c_regex_traits<regex_wchar_type>::is_class(c, f);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?