LCOV - code coverage report
Current view: top level - usr/include/boost/regex/v4 - basic_regex.hpp (source / functions) Hit Total Coverage
Test: ROSE Lines: 0 79 0.0 %
Date: 2022-12-08 13:48:47 Functions: 0 6 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  *
       3             :  * Copyright (c) 1998-2004 John Maddock
       4             :  * Copyright 2011 Garmin Ltd. or its subsidiaries
       5             :  *
       6             :  * Distributed under the Boost Software License, Version 1.0.
       7             :  * (See accompanying file LICENSE_1_0.txt or copy at
       8             :  * http://www.boost.org/LICENSE_1_0.txt)
       9             :  *
      10             :  */
      11             : 
      12             :  /*
      13             :   *   LOCATION:    see http://www.boost.org/ for most recent version.
      14             :   *   FILE         basic_regex.cpp
      15             :   *   VERSION      see <boost/version.hpp>
      16             :   *   DESCRIPTION: Declares template class basic_regex.
      17             :   */
      18             : 
      19             : #ifndef BOOST_REGEX_V4_BASIC_REGEX_HPP
      20             : #define BOOST_REGEX_V4_BASIC_REGEX_HPP
      21             : 
      22             : #include <boost/type_traits/is_same.hpp>
      23             : #include <boost/functional/hash.hpp>
      24             : 
      25             : #ifdef BOOST_MSVC
      26             : #pragma warning(push)
      27             : #pragma warning(disable: 4103)
      28             : #endif
      29             : #ifdef BOOST_HAS_ABI_HEADERS
      30             : #  include BOOST_ABI_PREFIX
      31             : #endif
      32             : #ifdef BOOST_MSVC
      33             : #pragma warning(pop)
      34             : #endif
      35             : 
      36             : namespace boost{
      37             : #ifdef BOOST_MSVC
      38             : #pragma warning(push)
      39             : #pragma warning(disable : 4251)
      40             : #if BOOST_MSVC < 1700
      41             : #     pragma warning(disable : 4231)
      42             : #endif
      43             : #if BOOST_MSVC < 1600
      44             : #pragma warning(disable : 4660)
      45             : #endif
      46             : #if BOOST_MSVC < 1910
      47             : #pragma warning(disable:4800)
      48             : #endif
      49             : #endif
      50             : 
      51             : namespace BOOST_REGEX_DETAIL_NS{
      52             : 
      53             : //
      54             : // forward declaration, we will need this one later:
      55             : //
      56             : template <class charT, class traits>
      57             : class basic_regex_parser;
      58             : 
      59             : template <class I>
      60             : void bubble_down_one(I first, I last)
      61             : {
      62             :    if(first != last)
      63             :    {
      64             :       I next = last - 1;
      65             :       while((next != first) && (*next < *(next-1)))
      66             :       {
      67             :          (next-1)->swap(*next);
      68             :          --next;
      69             :       }
      70             :    }
      71             : }
      72             : 
      73             : template <class Iterator>
      74           0 : inline int hash_value_from_capture_name(Iterator i, Iterator j)
      75             : {
      76           0 :    std::size_t r = boost::hash_range(i, j);
      77           0 :    r %= ((std::numeric_limits<int>::max)() - 10001);
      78           0 :    r += 10000;
      79           0 :    return static_cast<int>(r);
      80             : }
      81             : 
      82             : class named_subexpressions
      83             : {
      84             : public:
      85             :    struct name
      86             :    {
      87             :       template <class charT>
      88           0 :       name(const charT* i, const charT* j, int idx)
      89           0 :          : index(idx) 
      90             :       { 
      91           0 :          hash = hash_value_from_capture_name(i, j); 
      92             :       }
      93           0 :       name(int h, int idx)
      94           0 :          : index(idx), hash(h)
      95             :       { 
      96             :       }
      97             :       int index;
      98             :       int hash;
      99           0 :       bool operator < (const name& other)const
     100             :       {
     101           0 :          return hash < other.hash;
     102             :       }
     103             :       bool operator == (const name& other)const
     104             :       {
     105             :          return hash == other.hash; 
     106             :       }
     107             :       void swap(name& other)
     108             :       {
     109             :          std::swap(index, other.index);
     110             :          std::swap(hash, other.hash);
     111             :       }
     112             :    };
     113             : 
     114             :    typedef std::vector<name>::const_iterator const_iterator;
     115             :    typedef std::pair<const_iterator, const_iterator> range_type;
     116             : 
     117             :    named_subexpressions(){}
     118             : 
     119             :    template <class charT>
     120             :    void set_name(const charT* i, const charT* j, int index)
     121             :    {
     122             :       m_sub_names.push_back(name(i, j, index));
     123             :       bubble_down_one(m_sub_names.begin(), m_sub_names.end());
     124             :    }
     125             :    template <class charT>
     126             :    int get_id(const charT* i, const charT* j)const
     127             :    {
     128             :       name t(i, j, 0);
     129             :       typename std::vector<name>::const_iterator pos = std::lower_bound(m_sub_names.begin(), m_sub_names.end(), t);
     130             :       if((pos != m_sub_names.end()) && (*pos == t))
     131             :       {
     132             :          return pos->index;
     133             :       }
     134             :       return -1;
     135             :    }
     136             :    template <class charT>
     137           0 :    range_type equal_range(const charT* i, const charT* j)const
     138             :    {
     139           0 :       name t(i, j, 0);
     140           0 :       return std::equal_range(m_sub_names.begin(), m_sub_names.end(), t);
     141             :    }
     142             :    int get_id(int h)const
     143             :    {
     144             :       name t(h, 0);
     145             :       std::vector<name>::const_iterator pos = std::lower_bound(m_sub_names.begin(), m_sub_names.end(), t);
     146             :       if((pos != m_sub_names.end()) && (*pos == t))
     147             :       {
     148             :          return pos->index;
     149             :       }
     150             :       return -1;
     151             :    }
     152           0 :    range_type equal_range(int h)const
     153             :    {
     154           0 :       name t(h, 0);
     155           0 :       return std::equal_range(m_sub_names.begin(), m_sub_names.end(), t);
     156             :    }
     157             : private:
     158             :    std::vector<name> m_sub_names;
     159             : };
     160             : 
     161             : //
     162             : // class regex_data:
     163             : // represents the data we wish to expose to the matching algorithms.
     164             : //
     165             : template <class charT, class traits>
     166             : struct regex_data : public named_subexpressions
     167             : {
     168             :    typedef regex_constants::syntax_option_type   flag_type;
     169             :    typedef std::size_t                           size_type;  
     170             : 
     171             :    regex_data(const ::boost::shared_ptr<
     172             :       ::boost::regex_traits_wrapper<traits> >& t) 
     173             :       : m_ptraits(t), m_expression(0), m_expression_len(0), m_disable_match_any(false) {}
     174             :    regex_data() 
     175             :       : m_ptraits(new ::boost::regex_traits_wrapper<traits>()), m_expression(0), m_expression_len(0), m_disable_match_any(false) {}
     176             : 
     177             :    ::boost::shared_ptr<
     178             :       ::boost::regex_traits_wrapper<traits>
     179             :       >                        m_ptraits;                 // traits class instance
     180             :    flag_type                   m_flags;                   // flags with which we were compiled
     181             :    int                         m_status;                  // error code (0 implies OK).
     182             :    const charT*                m_expression;              // the original expression
     183             :    std::ptrdiff_t              m_expression_len;          // the length of the original expression
     184             :    size_type                   m_mark_count;              // the number of marked sub-expressions
     185             :    BOOST_REGEX_DETAIL_NS::re_syntax_base*  m_first_state;             // the first state of the machine
     186             :    unsigned                    m_restart_type;            // search optimisation type
     187             :    unsigned char               m_startmap[1 << CHAR_BIT]; // which characters can start a match
     188             :    unsigned int                m_can_be_null;             // whether we can match a null string
     189             :    BOOST_REGEX_DETAIL_NS::raw_storage      m_data;                    // the buffer in which our states are constructed
     190             :    typename traits::char_class_type    m_word_mask;       // mask used to determine if a character is a word character
     191             :    std::vector<
     192             :       std::pair<
     193             :       std::size_t, std::size_t> > m_subs;                 // Position of sub-expressions within the *string*.
     194             :    bool                        m_has_recursions;          // whether we have recursive expressions;
     195             :    bool                        m_disable_match_any;       // when set we need to disable the match_any flag as it causes different/buggy behaviour.
     196             : };
     197             : //
     198             : // class basic_regex_implementation
     199             : // pimpl implementation class for basic_regex.
     200             : //
     201             : template <class charT, class traits>
     202             : class basic_regex_implementation
     203             :    : public regex_data<charT, traits>
     204             : {
     205             : public:
     206             :    typedef regex_constants::syntax_option_type   flag_type;
     207             :    typedef std::ptrdiff_t                        difference_type;
     208             :    typedef std::size_t                           size_type; 
     209             :    typedef typename traits::locale_type          locale_type;
     210             :    typedef const charT*                          const_iterator;
     211             : 
     212             :    basic_regex_implementation(){}
     213             :    basic_regex_implementation(const ::boost::shared_ptr<
     214             :       ::boost::regex_traits_wrapper<traits> >& t)
     215             :       : regex_data<charT, traits>(t) {}
     216             :    void assign(const charT* arg_first,
     217             :                           const charT* arg_last,
     218             :                           flag_type f)
     219             :    {
     220             :       regex_data<charT, traits>* pdat = this;
     221             :       basic_regex_parser<charT, traits> parser(pdat);
     222             :       parser.parse(arg_first, arg_last, f);
     223             :    }
     224             : 
     225             :    locale_type BOOST_REGEX_CALL imbue(locale_type l)
     226             :    { 
     227             :       return this->m_ptraits->imbue(l); 
     228             :    }
     229             :    locale_type BOOST_REGEX_CALL getloc()const
     230             :    { 
     231             :       return this->m_ptraits->getloc(); 
     232             :    }
     233             :    std::basic_string<charT> BOOST_REGEX_CALL str()const
     234             :    {
     235             :       std::basic_string<charT> result;
     236             :       if(this->m_status == 0)
     237             :          result = std::basic_string<charT>(this->m_expression, this->m_expression_len);
     238             :       return result;
     239             :    }
     240             :    const_iterator BOOST_REGEX_CALL expression()const
     241             :    {
     242             :       return this->m_expression;
     243             :    }
     244             :    std::pair<const_iterator, const_iterator> BOOST_REGEX_CALL subexpression(std::size_t n)const
     245             :    {
     246             :       const std::pair<std::size_t, std::size_t>& pi = this->m_subs.at(n);
     247             :       std::pair<const_iterator, const_iterator> p(expression() + pi.first, expression() + pi.second);
     248             :       return p;
     249             :    }
     250             :    //
     251             :    // begin, end:
     252             :    const_iterator BOOST_REGEX_CALL begin()const
     253             :    { 
     254             :       return (this->m_status ? 0 : this->m_expression); 
     255             :    }
     256             :    const_iterator BOOST_REGEX_CALL end()const
     257             :    { 
     258             :       return (this->m_status ? 0 : this->m_expression + this->m_expression_len); 
     259             :    }
     260           0 :    flag_type BOOST_REGEX_CALL flags()const
     261             :    {
     262             :       return this->m_flags;
     263             :    }
     264           0 :    size_type BOOST_REGEX_CALL size()const
     265             :    {
     266           0 :       return this->m_expression_len;
     267             :    }
     268           0 :    int BOOST_REGEX_CALL status()const
     269             :    {
     270             :       return this->m_status;
     271             :    }
     272           0 :    size_type BOOST_REGEX_CALL mark_count()const
     273             :    {
     274           0 :       return this->m_mark_count - 1;
     275             :    }
     276           0 :    const BOOST_REGEX_DETAIL_NS::re_syntax_base* get_first_state()const
     277             :    {
     278             :       return this->m_first_state;
     279             :    }
     280           0 :    unsigned get_restart_type()const
     281             :    {
     282             :       return this->m_restart_type;
     283             :    }
     284           0 :    const unsigned char* get_map()const
     285             :    {
     286           0 :       return this->m_startmap;
     287             :    }
     288           0 :    const ::boost::regex_traits_wrapper<traits>& get_traits()const
     289             :    {
     290           0 :       return *(this->m_ptraits);
     291             :    }
     292           0 :    bool can_be_null()const
     293             :    {
     294             :       return this->m_can_be_null;
     295             :    }
     296           0 :    const regex_data<charT, traits>& get_data()const
     297             :    {
     298           0 :       basic_regex_implementation<charT, traits> const* p = this;
     299             :       return *static_cast<const regex_data<charT, traits>*>(p);
     300             :    }
     301             : };
     302             : 
     303             : } // namespace BOOST_REGEX_DETAIL_NS
     304             : //
     305             : // class basic_regex:
     306             : // represents the compiled
     307             : // regular expression:
     308             : //
     309             : 
     310             : #ifdef BOOST_REGEX_NO_FWD
     311             : template <class charT, class traits = regex_traits<charT> >
     312             : #else
     313             : template <class charT, class traits >
     314             : #endif
     315             : class basic_regex : public regbase
     316             : {
     317             : public:
     318             :    // typedefs:
     319             :    typedef std::size_t                           traits_size_type;
     320             :    typedef typename traits::string_type          traits_string_type;
     321             :    typedef charT                                 char_type;
     322             :    typedef traits                                traits_type;
     323             : 
     324             :    typedef charT                                 value_type;
     325             :    typedef charT&                                reference;
     326             :    typedef const charT&                          const_reference;
     327             :    typedef const charT*                          const_iterator;
     328             :    typedef const_iterator                        iterator;
     329             :    typedef std::ptrdiff_t                        difference_type;
     330             :    typedef std::size_t                           size_type;   
     331             :    typedef regex_constants::syntax_option_type   flag_type;
     332             :    // locale_type
     333             :    // placeholder for actual locale type used by the
     334             :    // traits class to localise *this.
     335             :    typedef typename traits::locale_type          locale_type;
     336             :    
     337             : public:
     338           0 :    explicit basic_regex(){}
     339           0 :    explicit basic_regex(const charT* p, flag_type f = regex_constants::normal)
     340           0 :    {
     341           0 :       assign(p, f);
     342           0 :    }
     343             :    basic_regex(const charT* p1, const charT* p2, flag_type f = regex_constants::normal)
     344             :    {
     345             :       assign(p1, p2, f);
     346             :    }
     347             :    basic_regex(const charT* p, size_type len, flag_type f)
     348             :    {
     349             :       assign(p, len, f);
     350             :    }
     351           0 :    basic_regex(const basic_regex& that)
     352           0 :       : m_pimpl(that.m_pimpl) {}
     353           0 :    ~basic_regex(){}
     354             :    basic_regex& BOOST_REGEX_CALL operator=(const basic_regex& that)
     355             :    {
     356             :       return assign(that);
     357             :    }
     358             :    basic_regex& BOOST_REGEX_CALL operator=(const charT* ptr)
     359             :    {
     360             :       return assign(ptr);
     361             :    }
     362             : 
     363             :    //
     364             :    // assign:
     365             :    basic_regex& assign(const basic_regex& that)
     366             :    { 
     367             :       m_pimpl = that.m_pimpl;
     368             :       return *this; 
     369             :    }
     370           0 :    basic_regex& assign(const charT* p, flag_type f = regex_constants::normal)
     371             :    {
     372           0 :       return assign(p, p + traits::length(p), f);
     373             :    }
     374             :    basic_regex& assign(const charT* p, size_type len, flag_type f)
     375             :    {
     376             :       return assign(p, p + len, f);
     377             :    }
     378             : private:
     379             :    basic_regex& do_assign(const charT* p1,
     380             :                           const charT* p2,
     381             :                           flag_type f);
     382             : public:
     383           0 :    basic_regex& assign(const charT* p1,
     384             :                           const charT* p2,
     385             :                           flag_type f = regex_constants::normal)
     386             :    {
     387           0 :       return do_assign(p1, p2, f);
     388             :    }
     389             : #if !defined(BOOST_NO_MEMBER_TEMPLATES)
     390             : 
     391             :    template <class ST, class SA>
     392             :    unsigned int BOOST_REGEX_CALL set_expression(const std::basic_string<charT, ST, SA>& p, flag_type f = regex_constants::normal)
     393             :    { 
     394             :       return set_expression(p.data(), p.data() + p.size(), f); 
     395             :    }
     396             : 
     397             :    template <class ST, class SA>
     398           0 :    explicit basic_regex(const std::basic_string<charT, ST, SA>& p, flag_type f = regex_constants::normal)
     399           0 :    { 
     400           0 :       assign(p, f); 
     401           0 :    }
     402             : 
     403             :    template <class InputIterator>
     404             :    basic_regex(InputIterator arg_first, InputIterator arg_last, flag_type f = regex_constants::normal)
     405             :    {
     406             :       typedef typename traits::string_type seq_type;
     407             :       seq_type a(arg_first, arg_last);
     408             :       if(a.size())
     409             :          assign(static_cast<const charT*>(&*a.begin()), static_cast<const charT*>(&*a.begin() + a.size()), f);
     410             :       else
     411             :          assign(static_cast<const charT*>(0), static_cast<const charT*>(0), f);
     412             :    }
     413             : 
     414             :    template <class ST, class SA>
     415             :    basic_regex& BOOST_REGEX_CALL operator=(const std::basic_string<charT, ST, SA>& p)
     416             :    {
     417             :       return assign(p.data(), p.data() + p.size(), regex_constants::normal);
     418             :    }
     419             : 
     420             :    template <class string_traits, class A>
     421           0 :    basic_regex& BOOST_REGEX_CALL assign(
     422             :        const std::basic_string<charT, string_traits, A>& s,
     423             :        flag_type f = regex_constants::normal)
     424             :    {
     425           0 :       return assign(s.data(), s.data() + s.size(), f);
     426             :    }
     427             : 
     428             :    template <class InputIterator>
     429             :    basic_regex& BOOST_REGEX_CALL assign(InputIterator arg_first,
     430             :                           InputIterator arg_last,
     431             :                           flag_type f = regex_constants::normal)
     432             :    {
     433             :       typedef typename traits::string_type seq_type;
     434             :       seq_type a(arg_first, arg_last);
     435             :       if(a.size())
     436             :       {
     437             :          const charT* p1 = &*a.begin();
     438             :          const charT* p2 = &*a.begin() + a.size();
     439             :          return assign(p1, p2, f);
     440             :       }
     441             :       return assign(static_cast<const charT*>(0), static_cast<const charT*>(0), f);
     442             :    }
     443             : #else
     444             :    unsigned int BOOST_REGEX_CALL set_expression(const std::basic_string<charT>& p, flag_type f = regex_constants::normal)
     445             :    { 
     446             :       return set_expression(p.data(), p.data() + p.size(), f); 
     447             :    }
     448             : 
     449             :    basic_regex(const std::basic_string<charT>& p, flag_type f = regex_constants::normal)
     450             :    { 
     451             :       assign(p, f); 
     452             :    }
     453             : 
     454             :    basic_regex& BOOST_REGEX_CALL operator=(const std::basic_string<charT>& p)
     455             :    {
     456             :       return assign(p.data(), p.data() + p.size(), regex_constants::normal);
     457             :    }
     458             : 
     459             :    basic_regex& BOOST_REGEX_CALL assign(
     460             :        const std::basic_string<charT>& s,
     461             :        flag_type f = regex_constants::normal)
     462             :    {
     463             :       return assign(s.data(), s.data() + s.size(), f);
     464             :    }
     465             : 
     466             : #endif
     467             : 
     468             :    //
     469             :    // locale:
     470             :    locale_type BOOST_REGEX_CALL imbue(locale_type l);
     471             :    locale_type BOOST_REGEX_CALL getloc()const
     472             :    { 
     473             :       return m_pimpl.get() ? m_pimpl->getloc() : locale_type(); 
     474             :    }
     475             :    //
     476             :    // getflags:
     477             :    // retained for backwards compatibility only, "flags"
     478             :    // is now the preferred name:
     479             :    flag_type BOOST_REGEX_CALL getflags()const
     480             :    { 
     481             :       return flags();
     482             :    }
     483           0 :    flag_type BOOST_REGEX_CALL flags()const
     484             :    { 
     485           0 :       return m_pimpl.get() ? m_pimpl->flags() : 0;
     486             :    }
     487             :    //
     488             :    // str:
     489             :    std::basic_string<charT> BOOST_REGEX_CALL str()const
     490             :    {
     491             :       return m_pimpl.get() ? m_pimpl->str() : std::basic_string<charT>();
     492             :    }
     493             :    //
     494             :    // begin, end, subexpression:
     495             :    std::pair<const_iterator, const_iterator> BOOST_REGEX_CALL subexpression(std::size_t n)const
     496             :    {
     497             :       if(!m_pimpl.get())
     498             :          boost::throw_exception(std::logic_error("Can't access subexpressions in an invalid regex."));
     499             :       return m_pimpl->subexpression(n);
     500             :    }
     501             :    const_iterator BOOST_REGEX_CALL begin()const
     502             :    { 
     503             :       return (m_pimpl.get() ? m_pimpl->begin() : 0); 
     504             :    }
     505             :    const_iterator BOOST_REGEX_CALL end()const
     506             :    { 
     507             :       return (m_pimpl.get() ? m_pimpl->end() : 0); 
     508             :    }
     509             :    //
     510             :    // swap:
     511             :    void BOOST_REGEX_CALL swap(basic_regex& that)throw()
     512             :    {
     513             :       m_pimpl.swap(that.m_pimpl);
     514             :    }
     515             :    //
     516             :    // size:
     517           0 :    size_type BOOST_REGEX_CALL size()const
     518             :    { 
     519           0 :       return (m_pimpl.get() ? m_pimpl->size() : 0); 
     520             :    }
     521             :    //
     522             :    // max_size:
     523             :    size_type BOOST_REGEX_CALL max_size()const
     524             :    { 
     525             :       return UINT_MAX; 
     526             :    }
     527             :    //
     528             :    // empty:
     529           0 :    bool BOOST_REGEX_CALL empty()const
     530             :    { 
     531           0 :       return (m_pimpl.get() ? 0 != m_pimpl->status() : true); 
     532             :    }
     533             : 
     534           0 :    size_type BOOST_REGEX_CALL mark_count()const 
     535             :    { 
     536           0 :       return (m_pimpl.get() ? m_pimpl->mark_count() : 0); 
     537             :    }
     538             : 
     539             :    int status()const
     540             :    {
     541             :       return (m_pimpl.get() ? m_pimpl->status() : regex_constants::error_empty);
     542             :    }
     543             : 
     544             :    int BOOST_REGEX_CALL compare(const basic_regex& that) const
     545             :    {
     546             :       if(m_pimpl.get() == that.m_pimpl.get())
     547             :          return 0;
     548             :       if(!m_pimpl.get())
     549             :          return -1;
     550             :       if(!that.m_pimpl.get())
     551             :          return 1;
     552             :       if(status() != that.status())
     553             :          return status() - that.status();
     554             :       if(flags() != that.flags())
     555             :          return flags() - that.flags();
     556             :       return str().compare(that.str());
     557             :    }
     558             :    bool BOOST_REGEX_CALL operator==(const basic_regex& e)const
     559             :    { 
     560             :       return compare(e) == 0; 
     561             :    }
     562             :    bool BOOST_REGEX_CALL operator != (const basic_regex& e)const
     563             :    { 
     564             :       return compare(e) != 0; 
     565             :    }
     566             :    bool BOOST_REGEX_CALL operator<(const basic_regex& e)const
     567             :    { 
     568             :       return compare(e) < 0; 
     569             :    }
     570             :    bool BOOST_REGEX_CALL operator>(const basic_regex& e)const
     571             :    { 
     572             :       return compare(e) > 0; 
     573             :    }
     574             :    bool BOOST_REGEX_CALL operator<=(const basic_regex& e)const
     575             :    { 
     576             :       return compare(e) <= 0; 
     577             :    }
     578             :    bool BOOST_REGEX_CALL operator>=(const basic_regex& e)const
     579             :    { 
     580             :       return compare(e) >= 0; 
     581             :    }
     582             : 
     583             :    //
     584             :    // The following are deprecated as public interfaces
     585             :    // but are available for compatibility with earlier versions.
     586             :    const charT* BOOST_REGEX_CALL expression()const 
     587             :    { 
     588             :       return (m_pimpl.get() && !m_pimpl->status() ? m_pimpl->expression() : 0); 
     589             :    }
     590             :    unsigned int BOOST_REGEX_CALL set_expression(const charT* p1, const charT* p2, flag_type f = regex_constants::normal)
     591             :    {
     592             :       assign(p1, p2, f | regex_constants::no_except);
     593             :       return status();
     594             :    }
     595             :    unsigned int BOOST_REGEX_CALL set_expression(const charT* p, flag_type f = regex_constants::normal) 
     596             :    { 
     597             :       assign(p, f | regex_constants::no_except); 
     598             :       return status();
     599             :    }
     600             :    unsigned int BOOST_REGEX_CALL error_code()const
     601             :    {
     602             :       return status();
     603             :    }
     604             :    //
     605             :    // private access methods:
     606             :    //
     607           0 :    const BOOST_REGEX_DETAIL_NS::re_syntax_base* get_first_state()const
     608             :    {
     609           0 :       BOOST_ASSERT(0 != m_pimpl.get());
     610           0 :       return m_pimpl->get_first_state();
     611             :    }
     612           0 :    unsigned get_restart_type()const
     613             :    {
     614           0 :       BOOST_ASSERT(0 != m_pimpl.get());
     615           0 :       return m_pimpl->get_restart_type();
     616             :    }
     617           0 :    const unsigned char* get_map()const
     618             :    {
     619           0 :       BOOST_ASSERT(0 != m_pimpl.get());
     620           0 :       return m_pimpl->get_map();
     621             :    }
     622           0 :    const ::boost::regex_traits_wrapper<traits>& get_traits()const
     623             :    {
     624           0 :       BOOST_ASSERT(0 != m_pimpl.get());
     625           0 :       return m_pimpl->get_traits();
     626             :    }
     627           0 :    bool can_be_null()const
     628             :    {
     629           0 :       BOOST_ASSERT(0 != m_pimpl.get());
     630           0 :       return m_pimpl->can_be_null();
     631             :    }
     632           0 :    const BOOST_REGEX_DETAIL_NS::regex_data<charT, traits>& get_data()const
     633             :    {
     634           0 :       BOOST_ASSERT(0 != m_pimpl.get());
     635           0 :       return m_pimpl->get_data();
     636             :    }
     637           0 :    boost::shared_ptr<BOOST_REGEX_DETAIL_NS::named_subexpressions > get_named_subs()const
     638             :    {
     639           0 :       return m_pimpl;
     640             :    }
     641             : 
     642             : private:
     643             :    shared_ptr<BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits> > m_pimpl;
     644             : };
     645             : 
     646             : //
     647             : // out of line members;
     648             : // these are the only members that mutate the basic_regex object,
     649             : // and are designed to provide the strong exception guarentee
     650             : // (in the event of a throw, the state of the object remains unchanged).
     651             : //
     652             : template <class charT, class traits>
     653             : basic_regex<charT, traits>& basic_regex<charT, traits>::do_assign(const charT* p1,
     654             :                         const charT* p2,
     655             :                         flag_type f)
     656             : {
     657             :    shared_ptr<BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits> > temp;
     658             :    if(!m_pimpl.get())
     659             :    {
     660             :       temp = shared_ptr<BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits> >(new BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits>());
     661             :    }
     662             :    else
     663             :    {
     664             :       temp = shared_ptr<BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits> >(new BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits>(m_pimpl->m_ptraits));
     665             :    }
     666             :    temp->assign(p1, p2, f);
     667             :    temp.swap(m_pimpl);
     668             :    return *this;
     669             : }
     670             : 
     671             : template <class charT, class traits>
     672             : typename basic_regex<charT, traits>::locale_type BOOST_REGEX_CALL basic_regex<charT, traits>::imbue(locale_type l)
     673             : { 
     674             :    shared_ptr<BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits> > temp(new BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits>());
     675             :    locale_type result = temp->imbue(l);
     676             :    temp.swap(m_pimpl);
     677             :    return result;
     678             : }
     679             : 
     680             : //
     681             : // non-members:
     682             : //
     683             : template <class charT, class traits>
     684             : void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2)
     685             : {
     686             :    e1.swap(e2);
     687             : }
     688             : 
     689             : #ifndef BOOST_NO_STD_LOCALE
     690             : template <class charT, class traits, class traits2>
     691             : std::basic_ostream<charT, traits>& 
     692             :    operator << (std::basic_ostream<charT, traits>& os, 
     693             :                 const basic_regex<charT, traits2>& e)
     694             : {
     695             :    return (os << e.str());
     696             : }
     697             : #else
     698             : template <class traits>
     699             : std::ostream& operator << (std::ostream& os, const basic_regex<char, traits>& e)
     700             : {
     701             :    return (os << e.str());
     702             : }
     703             : #endif
     704             : 
     705             : //
     706             : // class reg_expression:
     707             : // this is provided for backwards compatibility only,
     708             : // it is deprecated, no not use!
     709             : //
     710             : #ifdef BOOST_REGEX_NO_FWD
     711             : template <class charT, class traits = regex_traits<charT> >
     712             : #else
     713             : template <class charT, class traits >
     714             : #endif
     715             : class reg_expression : public basic_regex<charT, traits>
     716             : {
     717             : public:
     718             :    typedef typename basic_regex<charT, traits>::flag_type flag_type;
     719             :    typedef typename basic_regex<charT, traits>::size_type size_type;
     720             :    explicit reg_expression(){}
     721             :    explicit reg_expression(const charT* p, flag_type f = regex_constants::normal)
     722             :       : basic_regex<charT, traits>(p, f){}
     723             :    reg_expression(const charT* p1, const charT* p2, flag_type f = regex_constants::normal)
     724             :       : basic_regex<charT, traits>(p1, p2, f){}
     725             :    reg_expression(const charT* p, size_type len, flag_type f)
     726             :       : basic_regex<charT, traits>(p, len, f){}
     727             :    reg_expression(const reg_expression& that)
     728             :       : basic_regex<charT, traits>(that) {}
     729             :    ~reg_expression(){}
     730             :    reg_expression& BOOST_REGEX_CALL operator=(const reg_expression& that)
     731             :    {
     732             :       return this->assign(that);
     733             :    }
     734             : 
     735             : #if !defined(BOOST_NO_MEMBER_TEMPLATES)
     736             :    template <class ST, class SA>
     737             :    explicit reg_expression(const std::basic_string<charT, ST, SA>& p, flag_type f = regex_constants::normal)
     738             :    : basic_regex<charT, traits>(p, f)
     739             :    { 
     740             :    }
     741             : 
     742             :    template <class InputIterator>
     743             :    reg_expression(InputIterator arg_first, InputIterator arg_last, flag_type f = regex_constants::normal)
     744             :    : basic_regex<charT, traits>(arg_first, arg_last, f)
     745             :    {
     746             :    }
     747             : 
     748             :    template <class ST, class SA>
     749             :    reg_expression& BOOST_REGEX_CALL operator=(const std::basic_string<charT, ST, SA>& p)
     750             :    {
     751             :       this->assign(p);
     752             :       return *this;
     753             :    }
     754             : #else
     755             :    explicit reg_expression(const std::basic_string<charT>& p, flag_type f = regex_constants::normal)
     756             :    : basic_regex<charT, traits>(p, f)
     757             :    { 
     758             :    }
     759             : 
     760             :    reg_expression& BOOST_REGEX_CALL operator=(const std::basic_string<charT>& p)
     761             :    {
     762             :       this->assign(p);
     763             :       return *this;
     764             :    }
     765             : #endif
     766             : 
     767             : };
     768             : 
     769             : #ifdef BOOST_MSVC
     770             : #pragma warning (pop)
     771             : #endif
     772             : 
     773             : } // namespace boost
     774             : 
     775             : #ifdef BOOST_MSVC
     776             : #pragma warning(push)
     777             : #pragma warning(disable: 4103)
     778             : #endif
     779             : #ifdef BOOST_HAS_ABI_HEADERS
     780             : #  include BOOST_ABI_SUFFIX
     781             : #endif
     782             : #ifdef BOOST_MSVC
     783             : #pragma warning(pop)
     784             : #endif
     785             : 
     786             : #endif
     787             : 

Generated by: LCOV version 1.14