[cfe-commits] [libcxx] r107294 - in /libcxx/trunk: include/regex test/re/re.alg/re.alg.search/basic.pass.cpp

Howard Hinnant hhinnant at apple.com
Wed Jun 30 10:22:19 PDT 2010


Author: hhinnant
Date: Wed Jun 30 12:22:19 2010
New Revision: 107294

URL: http://llvm.org/viewvc/llvm-project?rev=107294&view=rev
Log:
First, very primitive, search results on one engine

Added:
    libcxx/trunk/test/re/re.alg/re.alg.search/basic.pass.cpp
Modified:
    libcxx/trunk/include/regex

Modified: libcxx/trunk/include/regex
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/regex?rev=107294&r1=107293&r2=107294&view=diff
==============================================================================
--- libcxx/trunk/include/regex (original)
+++ libcxx/trunk/include/regex Wed Jun 30 12:22:19 2010
@@ -1225,7 +1225,7 @@
     int __state_;
     enum
     {
-        __1_not_tried = 0,
+        __not_tried = 0,
         __1_succeded = 1,
         __1_failed = 2,
         __2_not_tried = 0,
@@ -1240,9 +1240,11 @@
         : __t1_(), __t2_(), __state_() {}
     ~__state();
 
-    const __state* operator()(_CharT __c);
+    __state* operator()(_CharT __c);
 
     void __add_one(__transition* __t) {__t1_ = __t;}
+
+    void __reset_state();
 };
 
 template <class _CharT>
@@ -1253,10 +1255,10 @@
 }
 
 template <class _CharT>
-const __state<_CharT>*
+__state<_CharT>*
 __state<_CharT>::operator()(_CharT __c)
 {
-    const __state* __r = nullptr;
+    __state* __r = nullptr;
     if ((__state_ & 3) == 0)
     {
         if (__t1_)
@@ -1287,6 +1289,17 @@
 }
 
 template <class _CharT>
+void
+__state<_CharT>::__reset_state()
+{
+    __state_ = __not_tried;
+    if (__t1_)
+        __t1_->__reset_state();
+    if (__t2_)
+        __t2_->__reset_state();
+}
+
+template <class _CharT>
 class __transition
 {
     __transition(const __transition&);
@@ -1305,10 +1318,20 @@
         : __sptr_(__st, __owns ? &__delete_state : &__ignore_state) {}
     virtual ~__transition() {}
 
-    virtual const __state* operator()(_CharT) const {return __sptr_.get();}
+    virtual __state* operator()(_CharT) const {return __sptr_.get();}
+
+    void __reset_state();
 };
 
 template <class _CharT>
+void
+__transition<_CharT>::__reset_state()
+{
+    if (__sptr_.get_deleter() == &__delete_state)
+        __sptr_->__reset_state();
+}
+
+template <class _CharT>
 class __match_char
     : public __transition<_CharT>
 {
@@ -1318,10 +1341,12 @@
     __match_char(_CharT __c, bool __owns, __state<_CharT>* __st)
         : base(__owns, __st), __c_(__c) {}
 
-    virtual const __state<_CharT>* operator()(_CharT __c) const
+    virtual __state<_CharT>* operator()(_CharT __c) const
         {return __c == __c_ ? base::__sptr_.get() : nullptr;}
 };
 
+template <class, class> class match_results;
+
 template <class _CharT, class _Traits = regex_traits<_CharT> >
 class basic_regex
 {
@@ -1518,6 +1543,18 @@
     void __push_class_type(typename _Traits::char_class_type) {}
     void __push_back_ref(int __i) {}
     void __push_alternation() {}
+
+    template <class _BidirectionalIterator, class _Allocator>
+        bool
+        __search(_BidirectionalIterator __first, _BidirectionalIterator __last,
+                 match_results<_BidirectionalIterator, _Allocator>& __m,
+                 regex_constants::match_flag_type __flags) const;
+
+    template <class _B, class _A, class _C, class _T>
+    friend
+    bool
+    regex_search(_B, _B, match_results<_B, _A>&, const basic_regex<_C, _T>&,
+                 regex_constants::match_flag_type);
 };
 
 template <class _CharT, class _Traits>
@@ -2852,6 +2889,12 @@
     // swap:
     void swap(match_results& __m);
 
+private:
+    void __init(unsigned __s,
+                _BidirectionalIterator __f, _BidirectionalIterator __l);
+
+    template <class, class> friend class basic_regex;
+
     template <class _B, class _A, class _C, class _T>
     friend
     bool
@@ -2869,6 +2912,29 @@
 {
 }
 
+template <class _BidirectionalIterator, class _Allocator>
+void
+match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
+                         _BidirectionalIterator __f, _BidirectionalIterator __l)
+{
+    __matches_.resize(__s);
+    for (unsigned __i = 0; __i < __s; ++__i)
+    {
+        __matches_[__i].first   = __l;
+        __matches_[__i].second  = __l;
+        __matches_[__i].matched = false;
+    }
+    __unmatched_.first   = __l;
+    __unmatched_.second  = __l;
+    __unmatched_.matched = false;
+    __prefix_.first      = __f;
+    __prefix_.second     = __f;
+    __prefix_.matched    = false;
+    __suffix_.first      = __l;
+    __suffix_.second     = __l;
+    __suffix_.matched    = false;
+}
+
 typedef match_results<const char*>             cmatch;
 typedef match_results<const wchar_t*>          wcmatch;
 typedef match_results<string::const_iterator>  smatch;
@@ -2891,12 +2957,59 @@
 
 // regex_search
 
+template <class _CharT, class _Traits>
+template <class _BidirectionalIterator, class _Allocator>
+bool
+basic_regex<_CharT, _Traits>::__search(
+        _BidirectionalIterator __first, _BidirectionalIterator __last,
+        match_results<_BidirectionalIterator, _Allocator>& __m,
+        regex_constants::match_flag_type __flags) const
+{
+    bool __r = false;
+    if (__start_)
+    {
+        __m.__init(1 + mark_count(), __first, __last);
+        for (; __first != __last; ++__first)
+        {
+            __start_->__reset_state();
+            __state<_CharT>* __st = (*__start_)(*__first);
+            if (__st)
+            {
+                _BidirectionalIterator& __f = __m.__matches_[0].first;
+                _BidirectionalIterator& __l = __m.__matches_[0].second;
+                __m.__matches_[0].matched = false;
+                __f = __l = __first;
+                ++__l;
+                for (; __l != __last && __st != nullptr && __st != __end_; ++__l)
+                    __st = (*__st)(*__l);
+                if (__st == __end_)
+                {
+                    __r = __m.__matches_[0].matched = true;
+                    __m.__prefix_.second = __first;
+                    __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
+                    __m.__suffix_.first = __l;
+                    __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
+                }
+            }
+            if (__flags & regex_constants::match_continuous)
+                break;
+        }
+    }
+    if (!__r)
+        __m.__matches_.clear();
+    return __r;
+}
+
 template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
+inline _LIBCPP_INLINE_VISIBILITY
 bool
 regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
              match_results<_BidirectionalIterator, _Allocator>& __m,
              const basic_regex<_CharT, _Traits>& __e,
-             regex_constants::match_flag_type __flags = regex_constants::match_default);
+             regex_constants::match_flag_type __flags = regex_constants::match_default)
+{
+    return __e.__search(__first, __last, __m, __flags);
+}
 
 template <class _BidirectionalIterator, class _CharT, class _Traits>
 inline _LIBCPP_INLINE_VISIBILITY

Added: libcxx/trunk/test/re/re.alg/re.alg.search/basic.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/re/re.alg/re.alg.search/basic.pass.cpp?rev=107294&view=auto
==============================================================================
--- libcxx/trunk/test/re/re.alg/re.alg.search/basic.pass.cpp (added)
+++ libcxx/trunk/test/re/re.alg/re.alg.search/basic.pass.cpp Wed Jun 30 12:22:19 2010
@@ -0,0 +1,83 @@
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <regex>
+
+// template <class BidirectionalIterator, class Allocator, class charT, class traits>
+//     bool
+//     regex_search(BidirectionalIterator first, BidirectionalIterator last,
+//                  match_results<BidirectionalIterator, Allocator>& m,
+//                  const basic_regex<charT, traits>& e,
+//                  regex_constants::match_flag_type flags = regex_constants::match_default);
+
+#include <regex>
+#include <cassert>
+
+int main()
+{
+    {
+        std::cmatch m;
+        assert(!std::regex_search("a", m, std::regex()));
+        assert(m.size() == 0);
+        assert(m.empty());
+    }
+    {
+        std::cmatch m;
+        const char s[] = "a";
+        assert(std::regex_search(s, m, std::regex("a", std::regex_constants::basic)));
+        assert(m.size() == 1);
+        assert(!m.empty());
+        assert(!m.prefix().matched);
+        assert(m.prefix().first == s);
+        assert(m.prefix().second == m[0].first);
+        assert(!m.suffix().matched);
+        assert(m.suffix().first == m[0].second);
+        assert(m.suffix().second == s+1);
+        assert(m.length(0) == 1);
+        assert(m.position(0) == 0);
+        assert(m.str(0) == "a");
+    }
+    {
+        std::cmatch m;
+        const char s[] = "ab";
+        assert(std::regex_search(s, m, std::regex("ab", std::regex_constants::basic)));
+        assert(m.size() == 1);
+        assert(!m.prefix().matched);
+        assert(m.prefix().first == s);
+        assert(m.prefix().second == m[0].first);
+        assert(!m.suffix().matched);
+        assert(m.suffix().first == m[0].second);
+        assert(m.suffix().second == s+2);
+        assert(m.length(0) == 2);
+        assert(m.position(0) == 0);
+        assert(m.str(0) == "ab");
+    }
+    {
+        std::cmatch m;
+        const char s[] = "ab";
+        assert(!std::regex_search(s, m, std::regex("ba", std::regex_constants::basic)));
+        assert(m.size() == 0);
+        assert(m.empty());
+    }
+    {
+        std::cmatch m;
+        const char s[] = "aab";
+        assert(std::regex_search(s, m, std::regex("ab", std::regex_constants::basic)));
+        assert(m.size() == 1);
+        assert(m.prefix().matched);
+        assert(m.prefix().first == s);
+        assert(m.prefix().second == m[0].first);
+        assert(!m.suffix().matched);
+        assert(m.suffix().first == m[0].second);
+        assert(m.suffix().second == s+3);
+        assert(m.length(0) == 2);
+        assert(m.position(0) == 1);
+        assert(m.str(0) == "ab");
+    }
+}





More information about the cfe-commits mailing list