w32_regex_traits.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 732 行 · 第 1/2 页
HPP
732 行
result.assign(this->transform(p1, p2)); result.erase(this->m_collate_delim); break; } case sort_delim: // get a regular sort key, and then truncate everything after the delim: result.assign(this->transform(p1, p2)); std::size_t i; for(i = 0; i < result.size(); ++i) { if(result[i] == m_collate_delim) break; } result.erase(i); break; } if(result.empty()) result = string_type(1, charT(0)); return result;}template <class charT>typename w32_regex_traits_implementation<charT>::string_type w32_regex_traits_implementation<charT>::lookup_collatename(const charT* p1, const charT* p2) const{ typedef typename std::map<string_type, string_type>::const_iterator iter_type; if(m_custom_collate_names.size()) { iter_type pos = m_custom_collate_names.find(string_type(p1, p2)); if(pos != m_custom_collate_names.end()) return pos->second; }#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\ && !BOOST_WORKAROUND(BOOST_MSVC, < 1300)\ && !BOOST_WORKAROUND(__BORLANDC__, <= 0x0551) std::string name(p1, p2);#else std::string name; const charT* p0 = p1; while(p0 != p2) name.append(1, char(*p0++));#endif name = lookup_default_collate_name(name);#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\ && !BOOST_WORKAROUND(BOOST_MSVC, < 1300)\ && !BOOST_WORKAROUND(__BORLANDC__, <= 0x0551) if(name.size()) return string_type(name.begin(), name.end());#else if(name.size()) { string_type result; typedef std::string::const_iterator iter; iter b = name.begin(); iter e = name.end(); while(b != e) result.append(1, charT(*b++)); return result; }#endif if(p2 - p1 == 1) return string_type(1, *p1); return string_type();}template <class charT>w32_regex_traits_implementation<charT>::w32_regex_traits_implementation(::boost::re_detail::lcid_type l): w32_regex_traits_char_layer<charT>(l){ cat_type cat; std::string cat_name(w32_regex_traits<charT>::get_catalog_name()); if(cat_name.size()) { cat = ::boost::re_detail::w32_cat_open(cat_name); if(!cat) { std::string m("Unable to open message catalog: "); std::runtime_error err(m + cat_name); boost::re_detail::raise_runtime_error(err); } } // // if we have a valid catalog then load our messages: // if(cat) { // // Error messages: // for(boost::regex_constants::error_type i = static_cast<boost::regex_constants::error_type>(0); i <= boost::regex_constants::error_unknown; i = static_cast<boost::regex_constants::error_type>(i + 1)) { const char* p = get_default_error_string(i); string_type default_message; while(*p) { default_message.append(1, static_cast<charT>(*p)); ++p; } string_type s = ::boost::re_detail::w32_cat_get(cat, this->m_locale, i+200, default_message); std::string result; for(std::string::size_type j = 0; j < s.size(); ++j) { result.append(1, static_cast<char>(s[j])); } m_error_strings[i] = result; } // // Custom class names: // static const char_class_type masks[14] = { 0x0104u, // C1_ALPHA | C1_DIGIT 0x0100u, // C1_ALPHA 0x0020u, // C1_CNTRL 0x0004u, // C1_DIGIT (~(0x0020u|0x0008u) & 0x01ffu) | 0x0400u, // not C1_CNTRL or C1_SPACE 0x0002u, // C1_LOWER (~0x0020u & 0x01ffu) | 0x0400, // not C1_CNTRL 0x0010u, // C1_PUNCT 0x0008u, // C1_SPACE 0x0001u, // C1_UPPER 0x0080u, // C1_XDIGIT 0x0040u, // C1_BLANK w32_regex_traits_implementation<charT>::mask_word, w32_regex_traits_implementation<charT>::mask_unicode, }; static const string_type null_string; for(unsigned int j = 0; j <= 13; ++j) { string_type s(::boost::re_detail::w32_cat_get(cat, this->m_locale, j+300, null_string)); if(s.size()) this->m_custom_class_names[s] = masks[j]; } } // // get the collation format used by m_pcollate: // m_collate_type = re_detail::find_sort_syntax(this, &m_collate_delim);}template <class charT>typename w32_regex_traits_implementation<charT>::char_class_type w32_regex_traits_implementation<charT>::lookup_classname_imp(const charT* p1, const charT* p2) const{ static const char_class_type masks[20] = { 0, 0x0104u, // C1_ALPHA | C1_DIGIT 0x0100u, // C1_ALPHA 0x0040u, // C1_BLANK 0x0020u, // C1_CNTRL 0x0004u, // C1_DIGIT 0x0004u, // C1_DIGIT (~(0x0020u|0x0008u|0x0040) & 0x01ffu) | 0x0400u, // not C1_CNTRL or C1_SPACE or C1_BLANK 0x0002u, // C1_LOWER 0x0002u, // C1_LOWER (~0x0020u & 0x01ffu) | 0x0400, // not C1_CNTRL 0x0010u, // C1_PUNCT 0x0008u, // C1_SPACE 0x0008u, // C1_SPACE 0x0001u, // C1_UPPER w32_regex_traits_implementation<charT>::mask_unicode, 0x0001u, // C1_UPPER 0x0104u | w32_regex_traits_implementation<charT>::mask_word, 0x0104u | w32_regex_traits_implementation<charT>::mask_word, 0x0080u, // C1_XDIGIT }; 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); if(state_id < sizeof(masks) / sizeof(masks[0])) return masks[state_id]; return masks[0];}template <class charT>boost::shared_ptr<const w32_regex_traits_implementation<charT> > create_w32_regex_traits(::boost::re_detail::lcid_type l BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(charT)){ // TODO: create a cache for previously constructed objects. return boost::object_cache< ::boost::re_detail::lcid_type, w32_regex_traits_implementation<charT> >::get(l, 5);}} // re_detailtemplate <class charT>class w32_regex_traits{public: typedef charT char_type; typedef std::size_t size_type; typedef std::basic_string<char_type> string_type; typedef ::boost::re_detail::lcid_type locale_type; typedef boost::uint_least32_t char_class_type; struct boost_extensions_tag{}; w32_regex_traits() : m_pimpl(re_detail::create_w32_regex_traits<charT>(::boost::re_detail::w32_get_default_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 this->m_pimpl->tolower(c); } charT translate(charT c, bool icase) const { return icase ? this->m_pimpl->tolower(c) : c; } charT tolower(charT c) const { return this->m_pimpl->tolower(c); } charT toupper(charT c) const { return ::boost::re_detail::w32_toupper(c, this->m_pimpl->m_locale); } string_type transform(const charT* p1, const charT* p2) const { return ::boost::re_detail::w32_transform(this->m_pimpl->m_locale, 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 { if((f & re_detail::w32_regex_traits_implementation<charT>::mask_base) && (this->m_pimpl->isctype(f & re_detail::w32_regex_traits_implementation<charT>::mask_base, c))) return true; else if((f & re_detail::w32_regex_traits_implementation<charT>::mask_unicode) && re_detail::is_extended(c)) return true; else if((f & re_detail::w32_regex_traits_implementation<charT>::mask_word) && (c == '_')) return true; return false; } int toi(const charT*& p1, const charT* p2, int radix)const { return ::boost::re_detail::global_toi(p1, p2, radix, *this); } int value(charT c, int radix)const { int result = ::boost::re_detail::global_value(c); return result < radix ? result : -1; } locale_type imbue(locale_type l) { ::boost::re_detail::lcid_type result(getloc()); m_pimpl = re_detail::create_w32_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::w32_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>std::string w32_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& w32_regex_traits<charT>::get_catalog_name_inst(){ static std::string s_name; return s_name;}template <class charT>std::string w32_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& w32_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
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?