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