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