sub_match.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 471 行 · 第 1/2 页

HPP
471
字号
/* * * 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         sub_match.cpp  *   VERSION      see <boost/version.hpp>  *   DESCRIPTION: Declares template class sub_match.  */#ifndef BOOST_REGEX_V4_SUB_MATCH_HPP#define BOOST_REGEX_V4_SUB_MATCH_HPP#ifdef BOOST_HAS_ABI_HEADERS#  include BOOST_ABI_PREFIX#endifnamespace boost{template <class BidiIterator>struct sub_match : public std::pair<BidiIterator, BidiIterator>{   typedef typename re_detail::regex_iterator_traits<BidiIterator>::value_type       value_type;#if defined(BOOST_NO_STD_ITERATOR_TRAITS) || defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)   typedef          std::ptrdiff_t                                                   difference_type;#else   typedef typename re_detail::regex_iterator_traits<BidiIterator>::difference_type  difference_type;#endif   typedef          BidiIterator                                                     iterator_type;   typedef          BidiIterator                                                     iterator;   typedef          BidiIterator                                                     const_iterator;   bool matched;   sub_match() : std::pair<BidiIterator, BidiIterator>(), matched(false) {}   sub_match(BidiIterator i) : std::pair<BidiIterator, BidiIterator>(i, i), matched(false) {}   operator std::basic_string<value_type> ()const   {      return str();   }   difference_type BOOST_REGEX_CALL length()const   {      difference_type n = boost::re_detail::distance((BidiIterator)this->first, (BidiIterator)this->second);      return n;   }   std::basic_string<value_type> str()const   {      std::basic_string<value_type> result;      std::size_t len = boost::re_detail::distance((BidiIterator)this->first, (BidiIterator)this->second);      result.reserve(len);      BidiIterator i = this->first;      while(i != this->second)      {         result.append(1, *i);         ++i;      }      return result;   }   int compare(const sub_match& s)const   {      if(matched != s.matched)         return static_cast<int>(matched) - static_cast<int>(s.matched);      return str().compare(s.str());   }   bool operator==(const sub_match& that)const   { return compare(that) == 0; }   bool BOOST_REGEX_CALL operator !=(const sub_match& that)const   { return compare(that) != 0; }   bool operator<(const sub_match& that)const   { return compare(that) < 0; }   bool operator>(const sub_match& that)const   { return compare(that) > 0; }   bool operator<=(const sub_match& that)const   { return compare(that) <= 0; }   bool operator>=(const sub_match& that)const   { return compare(that) >= 0; }#ifdef BOOST_REGEX_MATCH_EXTRA   typedef std::vector<sub_match<BidiIterator> > capture_sequence_type;   const capture_sequence_type& captures()const   {      if(!m_captures)          m_captures.reset(new capture_sequence_type());      return *m_captures;   }   //   // Private implementation API: DO NOT USE!   //   capture_sequence_type& get_captures()const   {      if(!m_captures)          m_captures.reset(new capture_sequence_type());      return *m_captures;   }private:   mutable boost::scoped_ptr<capture_sequence_type> m_captures;public:#endif   sub_match(const sub_match& that, bool #ifdef BOOST_REGEX_MATCH_EXTRA      deep_copy#endif      = true      )       : std::pair<BidiIterator, BidiIterator>(that),         matched(that.matched)    {#ifdef BOOST_REGEX_MATCH_EXTRA      if(that.m_captures)         if(deep_copy)            m_captures.reset(new capture_sequence_type(*(that.m_captures)));#endif   }   sub_match& operator=(const sub_match& that)   {      this->first = that.first;      this->second = that.second;      matched = that.matched;#ifdef BOOST_REGEX_MATCH_EXTRA      if(that.m_captures)         get_captures() = *(that.m_captures);#endif      return *this;   }#ifdef BOOST_OLD_REGEX_H   //   // the following are deprecated, do not use!!   //   operator int()const;   operator unsigned int()const;   operator short()const   {      return (short)(int)(*this);   }   operator unsigned short()const   {      return (unsigned short)(unsigned int)(*this);   }#endif};// comparison to std::basic_string<> part 1:template <class RandomAccessIterator, class traits, class Allocator>inline bool operator == (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,                  const sub_match<RandomAccessIterator>& m){ return s.compare(m.str()) == 0; }template <class RandomAccessIterator, class traits, class Allocator>inline bool operator != (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,                  const sub_match<RandomAccessIterator>& m){ return s.compare(m.str()) != 0; }template <class RandomAccessIterator, class traits, class Allocator>inline bool operator < (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,                 const sub_match<RandomAccessIterator>& m){ return s.compare(m.str()) < 0; }template <class RandomAccessIterator, class traits, class Allocator>inline bool operator <= (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,                  const sub_match<RandomAccessIterator>& m){ return s.compare(m.str()) <= 0; }template <class RandomAccessIterator, class traits, class Allocator>inline bool operator >= (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,                  const sub_match<RandomAccessIterator>& m){ return s.compare(m.str()) >= 0; }template <class RandomAccessIterator, class traits, class Allocator>inline bool operator > (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,                 const sub_match<RandomAccessIterator>& m){ return s.compare(m.str()) > 0; }// comparison to std::basic_string<> part 2:template <class RandomAccessIterator, class traits, class Allocator>inline bool operator == (const sub_match<RandomAccessIterator>& m,                  const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s){ return m.str().compare(s) == 0; }template <class RandomAccessIterator, class traits, class Allocator>inline bool operator != (const sub_match<RandomAccessIterator>& m,                  const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s){ return m.str().compare(s) != 0; }template <class RandomAccessIterator, class traits, class Allocator>inline bool operator < (const sub_match<RandomAccessIterator>& m,                  const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s){ return m.str().compare(s) < 0; }template <class RandomAccessIterator, class traits, class Allocator>inline bool operator > (const sub_match<RandomAccessIterator>& m,                  const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s){ return m.str().compare(s) > 0; }template <class RandomAccessIterator, class traits, class Allocator>inline bool operator <= (const sub_match<RandomAccessIterator>& m,                  const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s){ return m.str().compare(s) <= 0; }template <class RandomAccessIterator, class traits, class Allocator>inline bool operator >= (const sub_match<RandomAccessIterator>& m,                  const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s){ return m.str().compare(s) >= 0; }// comparison to const charT* part 1:template <class RandomAccessIterator>inline bool operator == (const sub_match<RandomAccessIterator>& m,                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s){ return m.str().compare(s) == 0; }template <class RandomAccessIterator>inline bool operator != (const sub_match<RandomAccessIterator>& m,                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s){ return m.str().compare(s) != 0; }template <class RandomAccessIterator>inline bool operator > (const sub_match<RandomAccessIterator>& m,                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s){ return m.str().compare(s) > 0; }template <class RandomAccessIterator>inline bool operator < (const sub_match<RandomAccessIterator>& m,                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s){ return m.str().compare(s) < 0; }template <class RandomAccessIterator>inline bool operator >= (const sub_match<RandomAccessIterator>& m,                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s){ return m.str().compare(s) >= 0; }template <class RandomAccessIterator>inline bool operator <= (const sub_match<RandomAccessIterator>& m,                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s){ return m.str().compare(s) <= 0; }// comparison to const charT* part 2:template <class RandomAccessIterator>inline bool operator == (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,                  const sub_match<RandomAccessIterator>& m){ return m.str().compare(s) == 0; }

⌨️ 快捷键说明

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