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 + -
显示快捷键?