basic_regex.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 653 行 · 第 1/2 页

HPP
653
字号
/* * * Copyright (c) 1998-2004 * John Maddock * * Distributed under 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         basic_regex.cpp  *   VERSION      see <boost/version.hpp>  *   DESCRIPTION: Declares template class basic_regex.  */#ifndef BOOST_REGEX_V4_BASIC_REGEX_HPP#define BOOST_REGEX_V4_BASIC_REGEX_HPP#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable: 4103)#endif#ifdef BOOST_HAS_ABI_HEADERS#  include BOOST_ABI_PREFIX#endif#ifdef BOOST_MSVC#pragma warning(pop)#endifnamespace boost{#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable : 4251 4231 4660 4800)#endifnamespace re_detail{//// forward declaration, we will need this one later://template <class charT, class traits>class basic_regex_parser;//// class regex_data:// represents the data we wish to expose to the matching algorithms.//template <class charT, class traits>struct regex_data{   typedef regex_constants::syntax_option_type   flag_type;   typedef std::size_t                           size_type;     regex_data(const ::boost::shared_ptr<      ::boost::regex_traits_wrapper<traits> >& t)       : m_ptraits(t), m_expression(0), m_expression_len(0) {}   regex_data()       : m_ptraits(new ::boost::regex_traits_wrapper<traits>()), m_expression(0), m_expression_len(0) {}   ::boost::shared_ptr<      ::boost::regex_traits_wrapper<traits>      >                        m_ptraits;                 // traits class instance   flag_type                   m_flags;                   // flags with which we were compiled   int                         m_status;                  // error code (0 implies OK).   const charT*                m_expression;              // the original expression   std::ptrdiff_t              m_expression_len;          // the length of the original expression   size_type                   m_mark_count;              // the number of marked sub-expressions   re_detail::re_syntax_base*  m_first_state;             // the first state of the machine   unsigned                    m_restart_type;            // search optimisation type   unsigned char               m_startmap[1 << CHAR_BIT]; // which characters can start a match   unsigned int                m_can_be_null;             // whether we can match a null string   re_detail::raw_storage      m_data;                    // the buffer in which our states are constructed   typename traits::char_class_type    m_word_mask;       // mask used to determine if a character is a word character};//// class basic_regex_implementation// pimpl implementation class for basic_regex.//template <class charT, class traits>class basic_regex_implementation   : public regex_data<charT, traits>{public:   typedef regex_constants::syntax_option_type   flag_type;   typedef std::ptrdiff_t                        difference_type;   typedef std::size_t                           size_type;    typedef typename traits::locale_type          locale_type;   typedef const charT*                          const_iterator;   basic_regex_implementation(){}   basic_regex_implementation(const ::boost::shared_ptr<      ::boost::regex_traits_wrapper<traits> >& t)      : regex_data<charT, traits>(t) {}   void assign(const charT* arg_first,                          const charT* arg_last,                          flag_type f)   {      regex_data<charT, traits>* pdat = this;      basic_regex_parser<charT, traits> parser(pdat);      parser.parse(arg_first, arg_last, f);   }   locale_type BOOST_REGEX_CALL imbue(locale_type l)   {       return this->m_ptraits->imbue(l);    }   locale_type BOOST_REGEX_CALL getloc()const   {       return this->m_ptraits->getloc();    }   std::basic_string<charT> BOOST_REGEX_CALL str()const   {      std::basic_string<charT> result;      if(this->m_status == 0)         result = std::basic_string<charT>(this->m_expression, this->m_expression_len);      return result;   }   const_iterator BOOST_REGEX_CALL expression()const   {      return this->m_expression;   }   //   // begin, end:   const_iterator BOOST_REGEX_CALL begin()const   {       return (!this->m_status ? 0 : this->m_expression);    }   const_iterator BOOST_REGEX_CALL end()const   {       return (!this->m_status ? 0 : this->m_expression + this->m_expression_len);    }   flag_type BOOST_REGEX_CALL flags()const   {      return this->m_flags;   }   size_type BOOST_REGEX_CALL size()const   {      return this->m_expression_len;   }   int BOOST_REGEX_CALL status()const   {      return this->m_status;   }   size_type BOOST_REGEX_CALL mark_count()const   {      return this->m_mark_count;   }   const re_detail::re_syntax_base* get_first_state()const   {      return this->m_first_state;   }   unsigned get_restart_type()const   {      return this->m_restart_type;   }   const unsigned char* get_map()const   {      return this->m_startmap;   }   const ::boost::regex_traits_wrapper<traits>& get_traits()const   {      return *(this->m_ptraits);   }   bool can_be_null()const   {      return this->m_can_be_null;   }   const regex_data<charT, traits>& get_data()const   {      basic_regex_implementation<charT, traits> const* p = this;      return *static_cast<const regex_data<charT, traits>*>(p);   }};} // namespace re_detail//// class basic_regex:// represents the compiled// regular expression://#ifdef BOOST_REGEX_NO_FWDtemplate <class charT, class traits = regex_traits<charT> >#elsetemplate <class charT, class traits >#endifclass basic_regex : public regbase{public:   // typedefs:   typedef std::size_t                           traits_size_type;   typedef typename traits::string_type          traits_string_type;   typedef charT                                 char_type;   typedef traits                                traits_type;   typedef charT                                 value_type;   typedef charT&                                reference;   typedef const charT&                          const_reference;   typedef const charT*                          const_iterator;   typedef const_iterator                        iterator;   typedef std::ptrdiff_t                        difference_type;   typedef std::size_t                           size_type;      typedef regex_constants::syntax_option_type   flag_type;   // locale_type   // placeholder for actual locale type used by the   // traits class to localise *this.   typedef typename traits::locale_type          locale_type;   public:   explicit basic_regex(){}   explicit basic_regex(const charT* p, flag_type f = regex_constants::normal)   {      assign(p, f);   }   basic_regex(const charT* p1, const charT* p2, flag_type f = regex_constants::normal)   {      assign(p1, p2, f);   }   basic_regex(const charT* p, size_type len, flag_type f)   {      assign(p, len, f);   }   basic_regex(const basic_regex& that)      : m_pimpl(that.m_pimpl) {}   ~basic_regex(){}   basic_regex& BOOST_REGEX_CALL operator=(const basic_regex& that)   {      return assign(that);   }   basic_regex& BOOST_REGEX_CALL operator=(const charT* ptr)   {      return assign(ptr);   }   //   // assign:   basic_regex& assign(const basic_regex& that)   {       m_pimpl = that.m_pimpl;      return *this;    }   basic_regex& assign(const charT* p, flag_type f = regex_constants::normal)   {      return assign(p, p + traits::length(p), f);   }   basic_regex& assign(const charT* p, size_type len, flag_type f)   {      return assign(p, p + len, f);   }private:   basic_regex& do_assign(const charT* p1,                          const charT* p2,                          flag_type f);public:   basic_regex& assign(const charT* p1,                          const charT* p2,                          flag_type f = regex_constants::normal)   {      return do_assign(p1, p2, f);   }#if !defined(BOOST_NO_MEMBER_TEMPLATES)   template <class ST, class SA>   unsigned int BOOST_REGEX_CALL set_expression(const std::basic_string<charT, ST, SA>& p, flag_type f = regex_constants::normal)   {       return set_expression(p.data(), p.data() + p.size(), f);    }   template <class ST, class SA>   explicit basic_regex(const std::basic_string<charT, ST, SA>& p, flag_type f = regex_constants::normal)   {       assign(p, f);    }   template <class InputIterator>   basic_regex(InputIterator arg_first, InputIterator arg_last, flag_type f = regex_constants::normal)   {      typedef typename traits::string_type seq_type;      seq_type a(arg_first, arg_last);      if(a.size())         assign(&*a.begin(), &*a.begin() + a.size(), f);      else         assign(static_cast<const charT*>(0), static_cast<const charT*>(0), f);   }   template <class ST, class SA>   basic_regex& BOOST_REGEX_CALL operator=(const std::basic_string<charT, ST, SA>& p)   {      return assign(p.data(), p.data() + p.size(), regex_constants::normal);   }   template <class string_traits, class A>   basic_regex& BOOST_REGEX_CALL assign(       const std::basic_string<charT, string_traits, A>& s,       flag_type f = regex_constants::normal)   {      return assign(s.data(), s.data() + s.size(), f);   }   template <class InputIterator>   basic_regex& BOOST_REGEX_CALL assign(InputIterator arg_first,                          InputIterator arg_last,                          flag_type f = regex_constants::normal)   {      typedef typename traits::string_type seq_type;      seq_type a(arg_first, arg_last);      if(a.size())      {         const charT* p1 = &*a.begin();         const charT* p2 = &*a.begin() + a.size();         return assign(p1, p2, f);      }      return assign(static_cast<const charT*>(0), static_cast<const charT*>(0), f);   }#else   unsigned int BOOST_REGEX_CALL set_expression(const std::basic_string<charT>& p, flag_type f = regex_constants::normal)   {       return set_expression(p.data(), p.data() + p.size(), f);    }   basic_regex(const std::basic_string<charT>& p, flag_type f = regex_constants::normal)   {       assign(p, f);    }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?