[cfe-commits] [libcxx] r107230 - in /libcxx/trunk: include/regex test/re/nothing_to_do.pass.cpp test/re/re.alg/nothing_to_do.pass.cpp test/re/re.iter/nothing_to_do.pass.cpp test/re/re.results/types.pass.cpp

Howard Hinnant hhinnant at apple.com
Tue Jun 29 17:21:42 PDT 2010


Author: hhinnant
Date: Tue Jun 29 19:21:42 2010
New Revision: 107230

URL: http://llvm.org/viewvc/llvm-project?rev=107230&view=rev
Log:
two steps forward, one step back...

Added:
    libcxx/trunk/test/re/re.alg/nothing_to_do.pass.cpp
    libcxx/trunk/test/re/re.iter/nothing_to_do.pass.cpp
    libcxx/trunk/test/re/re.results/types.pass.cpp
Modified:
    libcxx/trunk/include/regex
    libcxx/trunk/test/re/nothing_to_do.pass.cpp

Modified: libcxx/trunk/include/regex
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/regex?rev=107230&r1=107229&r2=107230&view=diff
==============================================================================
--- libcxx/trunk/include/regex (original)
+++ libcxx/trunk/include/regex Tue Jun 29 19:21:42 2010
@@ -724,6 +724,8 @@
 #include <utility>
 #include <iterator>
 #include <string>
+#include <memory>
+#include <vector>
 
 #pragma GCC system_header
 
@@ -2769,6 +2771,255 @@
     return __os << __m.str();
 }
 
+template <class _BidirectionalIterator,
+          class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
+class match_results
+{
+public:
+    typedef _Allocator                                        allocator_type;
+    typedef sub_match<_BidirectionalIterator>                 value_type;
+private:
+    typedef vector<value_type, allocator_type>                __container_type;
+
+    __container_type  __matches_;
+    value_type __unmatched_;
+    value_type __prefix_;
+    value_type __suffix_;
+public:
+    typedef const value_type&                                 const_reference;
+    typedef const_reference                                   reference;
+    typedef typename __container_type::const_iterator         const_iterator;
+    typedef const_iterator                                    iterator;
+    typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
+    typedef typename allocator_traits<allocator_type>::size_type size_type;
+    typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
+    typedef basic_string<char_type>                           string_type;
+
+    // construct/copy/destroy:
+    explicit match_results(const allocator_type& __a = allocator_type());
+//    match_results(const match_results&) = default;
+//    match_results& operator=(const match_results&) = default;
+#ifdef _LIBCPP_MOVE
+//    match_results(match_results&& __m) = default;
+//    match_results& operator=(match_results&& __m) = default;
+#endif
+//    ~match_results() = default;
+
+    // size:
+    size_type size() const {return __matches_.size();}
+    size_type max_size() const {return __matches_.max_size();}
+    bool empty() const {return size() == 0;}
+
+    // element access:
+    difference_type length(size_type __sub = 0) const
+        {return (*this)[__sub].length();}
+    difference_type position(size_type __sub = 0) const
+        {return _STD::distance(__prefix_.first, (*this)[__sub].first);}
+    string_type str(size_type __sub = 0) const
+        {return (*this)[__sub].str();}
+    const_reference operator[](size_type __n) const
+        {return __n < __matches_.size() ? __matches_[__n] : __unmatched_;}
+
+    const_reference prefix() const {return __prefix_;}
+    const_reference suffix() const {return __suffix_;}
+
+    const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin() + 1;}
+    const_iterator end() const {return __matches_.end();}
+    const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin() + 1;}
+    const_iterator cend() const {return __matches_.end();}
+
+    // format:
+    template <class _OutputIter>
+        _OutputIter
+        format(_OutputIter __out, const char_type* __fmt_first,
+               const char_type* __fmt_last,
+               regex_constants::match_flag_type __flags = regex_constants::format_default) const;
+    template <class _OutputIter, class _ST, class _SA>
+        _OutputIter
+        format(_OutputIter __out, const basic_string<char_type, _ST, _SA>& __fmt,
+               regex_constants::match_flag_type __flags = regex_constants::format_default) const;
+    template <class _ST, class _SA>
+        basic_string<char_type, _ST, _SA>
+        format(const basic_string<char_type, _ST, _SA>& __fmt,
+               regex_constants::match_flag_type __flags = regex_constants::format_default) const;
+    string_type
+        format(const char_type* __fmt,
+               regex_constants::match_flag_type __flags = regex_constants::format_default) const;
+
+    // allocator:
+    allocator_type get_allocator() const {return __matches_.get_allocator();}
+
+    // swap:
+    void swap(match_results& __m);
+
+    template <class _B, class _A, class _C, class _T>
+    friend
+    bool
+    regex_match(_B, _B, match_results<_B, _A>&, const basic_regex<_C, _T>&,
+                regex_constants::match_flag_type);
+};
+
+template <class _BidirectionalIterator, class _Allocator>
+match_results<_BidirectionalIterator, _Allocator>::match_results(
+        const allocator_type& __a)
+    : __matches_(__a),
+      __unmatched_(),
+      __prefix_(),
+      __suffix_()
+{
+}
+
+typedef match_results<const char*>             cmatch;
+typedef match_results<const wchar_t*>          wcmatch;
+typedef match_results<string::const_iterator>  smatch;
+typedef match_results<wstring::const_iterator> wsmatch;
+
+template <class _BidirectionalIterator, class _Allocator>
+    bool
+    operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
+               const match_results<_BidirectionalIterator, _Allocator>& __y);
+
+template <class _BidirectionalIterator, class _Allocator>
+    bool
+    operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
+               const match_results<_BidirectionalIterator, _Allocator>& __y);
+
+template <class _BidirectionalIterator, class _Allocator>
+    void
+    swap(match_results<_BidirectionalIterator, _Allocator>& __x,
+         match_results<_BidirectionalIterator, _Allocator>& __y);
+
+// regex_search
+
+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);
+
+template <class _BidirectionalIterator, class _CharT, class _Traits>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
+             const basic_regex<_CharT, _Traits>& __e,
+             regex_constants::match_flag_type __flags = regex_constants::match_default)
+{
+    match_results<_BidirectionalIterator> __m;
+    return _STD::regex_search(__first, __last, __m, __e, __flags);
+}
+
+template <class _CharT, class _Allocator, class _Traits>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
+             const basic_regex<_CharT, _Traits>& __e,
+             regex_constants::match_flag_type __flags = regex_constants::match_default)
+{
+    return _STD::regex_search(__str, __str + _Traits::length(__str), __m, __e, __flags);
+}
+
+template <class _CharT, class _Traits>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
+             regex_constants::match_flag_type __flags = regex_constants::match_default)
+{
+    return _STD::regex_search(__str, __str + _Traits::length(__str), __e, __flags);
+}
+
+template <class _ST, class _SA, class _CharT, class _Traits>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+regex_search(const basic_string<_CharT, _ST, _SA>& __s,
+             const basic_regex<_CharT, _Traits>& __e,
+             regex_constants::match_flag_type __flags = regex_constants::match_default)
+{
+    return _STD::regex_search(__s.begin(), __s.end(), __e, __flags);
+}
+
+template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+regex_search(const basic_string<_CharT, _ST, _SA>& __s,
+             match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
+             const basic_regex<_CharT, _Traits>& __e,
+             regex_constants::match_flag_type __flags = regex_constants::match_default)
+{
+    return _STD::regex_search(__s.begin(), __s.end(), __m, __e, __flags);
+}
+
+// regex_match
+
+template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
+bool
+regex_match(_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)
+{
+    bool __r = _STD::regex_search(__first, __last, __m, __e,
+                            __flags | regex_constants::match_continuous);
+    if (__r)
+    {
+        __r = !__m.suffix().matched;
+        if (!__r)
+            __m.__matches_.clear();
+    }
+    return __r;
+}
+
+template <class _BidirectionalIterator, class _CharT, class _Traits>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
+            const basic_regex<_CharT, _Traits>& __e,
+            regex_constants::match_flag_type __flags = regex_constants::match_default)
+{
+    match_results<_BidirectionalIterator> __m;
+    return _STD::regex_match(__first, __last, __m, __e, __flags);
+}
+
+template <class _CharT, class _Allocator, class _Traits>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
+            const basic_regex<_CharT, _Traits>& __e,
+            regex_constants::match_flag_type __flags = regex_constants::match_default)
+{
+    return _STD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
+}
+
+template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+regex_match(const basic_string<_CharT, _ST, _SA>& __s,
+            match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
+            const basic_regex<_CharT, _Traits>& __e,
+            regex_constants::match_flag_type __flags = regex_constants::match_default)
+{
+    return _STD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
+}
+
+template <class _CharT, class _Traits>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
+            regex_constants::match_flag_type __flags = regex_constants::match_default)
+{
+    return _STD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
+}
+
+template <class _ST, class _SA, class _CharT, class _Traits>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+regex_match(const basic_string<_CharT, _ST, _SA>& __s,
+            const basic_regex<_CharT, _Traits>& __e,
+            regex_constants::match_flag_type __flags = regex_constants::match_default)
+{
+    return _STD::regex_match(__s.begin(), __s.end(), __e, __flags);
+}
+
 _LIBCPP_END_NAMESPACE_STD
 
 #endif  // _LIBCPP_REGEX

Modified: libcxx/trunk/test/re/nothing_to_do.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/re/nothing_to_do.pass.cpp?rev=107230&r1=107229&r2=107230&view=diff
==============================================================================
--- libcxx/trunk/test/re/nothing_to_do.pass.cpp (original)
+++ libcxx/trunk/test/re/nothing_to_do.pass.cpp Tue Jun 29 19:21:42 2010
@@ -1,5 +1,4 @@
-// -*- C++ -*-
-//===-------------------------- algorithm ---------------------------------===//
+//===----------------------------------------------------------------------===//
 //
 //                     The LLVM Compiler Infrastructure
 //

Added: libcxx/trunk/test/re/re.alg/nothing_to_do.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/re/re.alg/nothing_to_do.pass.cpp?rev=107230&view=auto
==============================================================================
--- libcxx/trunk/test/re/re.alg/nothing_to_do.pass.cpp (added)
+++ libcxx/trunk/test/re/re.alg/nothing_to_do.pass.cpp Tue Jun 29 19:21:42 2010
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}

Added: libcxx/trunk/test/re/re.iter/nothing_to_do.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/re/re.iter/nothing_to_do.pass.cpp?rev=107230&view=auto
==============================================================================
--- libcxx/trunk/test/re/re.iter/nothing_to_do.pass.cpp (added)
+++ libcxx/trunk/test/re/re.iter/nothing_to_do.pass.cpp Tue Jun 29 19:21:42 2010
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}

Added: libcxx/trunk/test/re/re.results/types.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/re/re.results/types.pass.cpp?rev=107230&view=auto
==============================================================================
--- libcxx/trunk/test/re/re.results/types.pass.cpp (added)
+++ libcxx/trunk/test/re/re.results/types.pass.cpp Tue Jun 29 19:21:42 2010
@@ -0,0 +1,51 @@
+//===----------------------------------------------------------------------===//
+//
+//                     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 = allocator<sub_match<BidirectionalIterator>>>
+// class match_results
+// {
+// public:
+//     typedef sub_match<BidirectionalIterator>                  value_type;
+//     typedef const value_type&                                 const_reference;
+//     typedef const_reference                                   reference;
+//     typedef /implementation-defined/                          const_iterator;
+//     typedef const_iterator                                    iterator;
+//     typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
+//     typedef typename allocator_traits<Allocator>::size_type   size_type;
+//     typedef Allocator                                         allocator_type;
+//     typedef typename iterator_traits<BidirectionalIterator>::value_type char_type;
+//     typedef basic_string<char_type>                           string_type;
+
+#include <regex>
+#include <type_traits>
+
+template <class CharT>
+void
+test()
+{
+    typedef std::match_results<CharT*> MR;
+    static_assert((std::is_same<typename MR::value_type, std::sub_match<CharT*> >::value), "");
+    static_assert((std::is_same<typename MR::const_reference, const std::sub_match<CharT*>& >::value), "");
+    static_assert((std::is_same<typename MR::reference, const std::sub_match<CharT*>& >::value), "");
+    static_assert((!std::is_same<typename MR::const_iterator, void>::value), "");
+    static_assert((std::is_same<typename MR::difference_type, std::ptrdiff_t>::value), "");
+    static_assert((std::is_same<typename MR::size_type, std::size_t>::value), "");
+    static_assert((std::is_same<typename MR::allocator_type, std::allocator<std::sub_match<CharT*> > >::value), "");
+    static_assert((std::is_same<typename MR::char_type, CharT>::value), "");
+    static_assert((std::is_same<typename MR::string_type, std::basic_string<CharT> >::value), "");
+}
+
+int main()
+{
+    test<char>();
+    test<wchar_t>();
+}





More information about the cfe-commits mailing list