cpp_regex_traits.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 1,063 行 · 第 1/3 页
HPP
1,063 行
::boost::re_detail::char_class_alnum, ::boost::re_detail::char_class_alpha, ::boost::re_detail::char_class_cntrl, ::boost::re_detail::char_class_digit, ::boost::re_detail::char_class_graph, ::boost::re_detail::char_class_lower, ::boost::re_detail::char_class_print, ::boost::re_detail::char_class_punct, ::boost::re_detail::char_class_space, ::boost::re_detail::char_class_upper, ::boost::re_detail::char_class_xdigit, ::boost::re_detail::char_class_blank, ::boost::re_detail::char_class_word, ::boost::re_detail::char_class_unicode, };#endif static const string_type null_string; for(unsigned int j = 0; j <= 13; ++j) { string_type s(this->m_pmessages->get(cat, 0, j+300, null_string)); if(s.size()) this->m_custom_class_names[s] = masks[j]; } }#endif // // get the collation format used by m_pcollate: // m_collate_type = re_detail::find_sort_syntax(this, &m_collate_delim);}template <class charT>typename cpp_regex_traits_implementation<charT>::char_class_type cpp_regex_traits_implementation<charT>::lookup_classname_imp(const charT* p1, const charT* p2) const{#ifndef BOOST_REGEX_BUGGY_CTYPE_FACET static const char_class_type masks[20] = { 0, std::ctype<char>::alnum, std::ctype<char>::alpha, cpp_regex_traits_implementation<charT>::mask_blank, std::ctype<char>::cntrl, std::ctype<char>::digit, std::ctype<char>::digit, std::ctype<char>::graph, std::ctype<char>::lower, std::ctype<char>::lower, std::ctype<char>::print, std::ctype<char>::punct, std::ctype<char>::space, std::ctype<char>::space, std::ctype<char>::upper, cpp_regex_traits_implementation<charT>::mask_unicode, std::ctype<char>::upper, std::ctype<char>::alnum | cpp_regex_traits_implementation<charT>::mask_word, std::ctype<char>::alnum | cpp_regex_traits_implementation<charT>::mask_word, std::ctype<char>::xdigit, };#else static const char_class_type masks[20] = { 0, ::boost::re_detail::char_class_alnum, ::boost::re_detail::char_class_alpha, ::boost::re_detail::char_class_blank, ::boost::re_detail::char_class_cntrl, ::boost::re_detail::char_class_digit, ::boost::re_detail::char_class_digit, ::boost::re_detail::char_class_graph, ::boost::re_detail::char_class_lower, ::boost::re_detail::char_class_lower, ::boost::re_detail::char_class_print, ::boost::re_detail::char_class_punct, ::boost::re_detail::char_class_space, ::boost::re_detail::char_class_space, ::boost::re_detail::char_class_upper, ::boost::re_detail::char_class_unicode, ::boost::re_detail::char_class_upper, ::boost::re_detail::char_class_alnum | ::boost::re_detail::char_class_word, ::boost::re_detail::char_class_alnum | ::boost::re_detail::char_class_word, ::boost::re_detail::char_class_xdigit, };#endif if(m_custom_class_names.size()) { typedef typename std::map<std::basic_string<charT>, char_class_type>::const_iterator map_iter; map_iter pos = m_custom_class_names.find(string_type(p1, p2)); if(pos != m_custom_class_names.end()) return pos->second; } std::size_t state_id = 1 + re_detail::get_default_class_id(p1, p2); BOOST_ASSERT(state_id < sizeof(masks) / sizeof(masks[0])); return masks[state_id];}#ifdef BOOST_REGEX_BUGGY_CTYPE_FACETtemplate <class charT>bool cpp_regex_traits_implementation<charT>::isctype(const charT c, char_class_type mask) const{ return ((mask & ::boost::re_detail::char_class_space) && (m_pctype->is(std::ctype<charT>::space, c))) || ((mask & ::boost::re_detail::char_class_print) && (m_pctype->is(std::ctype<charT>::print, c))) || ((mask & ::boost::re_detail::char_class_cntrl) && (m_pctype->is(std::ctype<charT>::cntrl, c))) || ((mask & ::boost::re_detail::char_class_upper) && (m_pctype->is(std::ctype<charT>::upper, c))) || ((mask & ::boost::re_detail::char_class_lower) && (m_pctype->is(std::ctype<charT>::lower, c))) || ((mask & ::boost::re_detail::char_class_alpha) && (m_pctype->is(std::ctype<charT>::alpha, c))) || ((mask & ::boost::re_detail::char_class_digit) && (m_pctype->is(std::ctype<charT>::digit, c))) || ((mask & ::boost::re_detail::char_class_punct) && (m_pctype->is(std::ctype<charT>::punct, c))) || ((mask & ::boost::re_detail::char_class_xdigit) && (m_pctype->is(std::ctype<charT>::xdigit, c))) || ((mask & ::boost::re_detail::char_class_blank) && (m_pctype->is(std::ctype<charT>::space, c)) && !::boost::re_detail::is_separator(c)) || ((mask & ::boost::re_detail::char_class_word) && (c == '_')) || ((mask & ::boost::re_detail::char_class_unicode) && ::boost::re_detail::is_extended(c));}#endiftemplate <class charT>inline boost::shared_ptr<const cpp_regex_traits_implementation<charT> > create_cpp_regex_traits(const std::locale& l BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(charT)){ cpp_regex_traits_base<charT> key(l); return ::boost::object_cache<cpp_regex_traits_base<charT>, cpp_regex_traits_implementation<charT> >::get(key, 5);}} // re_detailtemplate <class charT>class cpp_regex_traits{private: typedef std::ctype<charT> ctype_type;public: typedef charT char_type; typedef std::size_t size_type; typedef std::basic_string<char_type> string_type; typedef std::locale locale_type; typedef boost::uint_least32_t char_class_type; struct boost_extensions_tag{}; cpp_regex_traits() : m_pimpl(re_detail::create_cpp_regex_traits<charT>(std::locale())) { } static size_type length(const char_type* p) { return std::char_traits<charT>::length(p); } regex_constants::syntax_type syntax_type(charT c)const { return m_pimpl->syntax_type(c); } regex_constants::escape_syntax_type escape_syntax_type(charT c) const { return m_pimpl->escape_syntax_type(c); } charT translate(charT c) const { return c; } charT translate_nocase(charT c) const { return m_pimpl->m_pctype->tolower(c); } charT translate(charT c, bool icase) const { return icase ? m_pimpl->m_pctype->tolower(c) : c; } charT tolower(charT c) const { return m_pimpl->m_pctype->tolower(c); } charT toupper(charT c) const { return m_pimpl->m_pctype->toupper(c); } string_type transform(const charT* p1, const charT* p2) const { return m_pimpl->transform(p1, p2); } string_type transform_primary(const charT* p1, const charT* p2) const { return m_pimpl->transform_primary(p1, p2); } char_class_type lookup_classname(const charT* p1, const charT* p2) const { return m_pimpl->lookup_classname(p1, p2); } string_type lookup_collatename(const charT* p1, const charT* p2) const { return m_pimpl->lookup_collatename(p1, p2); } bool isctype(charT c, char_class_type f) const {#ifndef BOOST_REGEX_BUGGY_CTYPE_FACET typedef typename std::ctype<charT>::mask ctype_mask; static const ctype_mask mask_base = static_cast<ctype_mask>( std::ctype<charT>::alnum | std::ctype<charT>::alpha | std::ctype<charT>::cntrl | std::ctype<charT>::digit | std::ctype<charT>::graph | std::ctype<charT>::lower | std::ctype<charT>::print | std::ctype<charT>::punct | std::ctype<charT>::space | std::ctype<charT>::upper | std::ctype<charT>::xdigit); if((f & mask_base) && (m_pimpl->m_pctype->is( static_cast<ctype_mask>(f & mask_base), c))) return true; else if((f & re_detail::cpp_regex_traits_implementation<charT>::mask_unicode) && re_detail::is_extended(c)) return true; else if((f & re_detail::cpp_regex_traits_implementation<charT>::mask_word) && (c == '_')) return true; else if((f & re_detail::cpp_regex_traits_implementation<charT>::mask_blank) && m_pimpl->m_pctype->is(std::ctype<charT>::space, c) && !re_detail::is_separator(c)) return true; return false;#else return m_pimpl->isctype(c, f);#endif } int toi(const charT*& p1, const charT* p2, int radix)const; int value(charT c, int radix)const { const charT* pc = &c; return toi(pc, pc + 1, radix); } locale_type imbue(locale_type l) { std::locale result(getloc()); m_pimpl = re_detail::create_cpp_regex_traits<charT>(l); return result; } locale_type getloc()const { return m_pimpl->m_locale; } std::string error_string(regex_constants::error_type n) const { return m_pimpl->error_string(n); } // // extension: // set the name of the message catalog in use (defaults to "boost_regex"). // static std::string catalog_name(const std::string& name); static std::string get_catalog_name();private: boost::shared_ptr<const re_detail::cpp_regex_traits_implementation<charT> > m_pimpl; // // catalog name handler: // static std::string& get_catalog_name_inst();#ifdef BOOST_HAS_THREADS static static_mutex& get_mutex_inst();#endif};template <class charT>int cpp_regex_traits<charT>::toi(const charT*& first, const charT* last, int radix)const{ re_detail::parser_buf<charT> sbuf; // buffer for parsing numbers. std::basic_istream<charT> is(&sbuf); // stream for parsing numbers. // we do NOT want to parse any thousands separators inside the stream: last = std::find(first, last, BOOST_USE_FACET(std::numpunct<charT>, is.getloc()).thousands_sep()); sbuf.pubsetbuf(const_cast<charT*>(static_cast<const charT*>(first)), static_cast<std::streamsize>(last-first)); is.clear(); if(std::abs(radix) == 16) is >> std::hex; else if(std::abs(radix) == 8) is >> std::oct; else is >> std::dec; int val; if(is >> val) { first = first + ((last - first) - sbuf.in_avail()); return val; } else return -1;}template <class charT>std::string cpp_regex_traits<charT>::catalog_name(const std::string& name){#ifdef BOOST_HAS_THREADS static_mutex::scoped_lock lk(get_mutex_inst());#endif std::string result(get_catalog_name_inst()); get_catalog_name_inst() = name; return result;}template <class charT>std::string& cpp_regex_traits<charT>::get_catalog_name_inst(){ static std::string s_name; return s_name;}template <class charT>std::string cpp_regex_traits<charT>::get_catalog_name(){#ifdef BOOST_HAS_THREADS static_mutex::scoped_lock lk(get_mutex_inst());#endif std::string result(get_catalog_name_inst()); return result;}#ifdef BOOST_HAS_THREADStemplate <class charT>static_mutex& cpp_regex_traits<charT>::get_mutex_inst(){ static static_mutex s_mutex = BOOST_STATIC_MUTEX_INIT; return s_mutex;}#endif} // boost#ifdef BOOST_MSVC#pragma warning(pop)#endif#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable: 4103)#endif#ifdef BOOST_HAS_ABI_HEADERS# include BOOST_ABI_SUFFIX#endif#ifdef BOOST_MSVC#pragma warning(pop)#endif#endif#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?