From 262b779f1d1635f10b3fdbb28cc45c55d0b3ff42 Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Tue, 17 Aug 2010 20:42:03 +0000 Subject: [PATCH] [re.tokiter] git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@111278 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/regex | 225 +++++++++++++++++- .../re.tokiter.cnstr/array.pass.cpp | 64 +++++ .../re.tokiter.cnstr/default.pass.cpp | 32 +++ .../re.tokiter/re.tokiter.cnstr/init.pass.cpp | 64 +++++ .../re.tokiter/re.tokiter.cnstr/int.pass.cpp | 75 ++++++ .../re.tokiter.cnstr/vector.pass.cpp | 128 ++++++++++ .../re.tokiter/re.tokiter.comp/equal.pass.cpp | 36 +++ .../re.tokiter.deref/deref.pass.cpp | 72 ++++++ .../re.tokiter/re.tokiter.incr/post.pass.cpp | 72 ++++++ test/re/re.iter/re.tokiter/types.pass.cpp | 45 ++++ 10 files changed, 801 insertions(+), 12 deletions(-) create mode 100644 test/re/re.iter/re.tokiter/re.tokiter.cnstr/array.pass.cpp create mode 100644 test/re/re.iter/re.tokiter/re.tokiter.cnstr/default.pass.cpp create mode 100644 test/re/re.iter/re.tokiter/re.tokiter.cnstr/init.pass.cpp create mode 100644 test/re/re.iter/re.tokiter/re.tokiter.cnstr/int.pass.cpp create mode 100644 test/re/re.iter/re.tokiter/re.tokiter.cnstr/vector.pass.cpp create mode 100644 test/re/re.iter/re.tokiter/re.tokiter.comp/equal.pass.cpp create mode 100644 test/re/re.iter/re.tokiter/re.tokiter.deref/deref.pass.cpp create mode 100644 test/re/re.iter/re.tokiter/re.tokiter.incr/post.pass.cpp create mode 100644 test/re/re.iter/re.tokiter/types.pass.cpp diff --git a/include/regex b/include/regex index d312468f7..dc5349885 100644 --- a/include/regex +++ b/include/regex @@ -6038,33 +6038,234 @@ public: typedef const value_type& reference; typedef forward_iterator_tag iterator_category; +private: + typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position; + + _Position __position_; + const value_type* __result_; + value_type __suffix_; + ptrdiff_t _N_; + vector __subs_; + +public: regex_token_iterator(); regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, const regex_type& __re, int __submatch = 0, - regex_constants::match_flag_type __m = regex_constants::match_default); + regex_constants::match_flag_type __m = + regex_constants::match_default); regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, const regex_type& __re, const vector& __submatches, - regex_constants::match_flag_type __m = regex_constants::match_default); + regex_constants::match_flag_type __m = + regex_constants::match_default); regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, - const regex_type& __re, initializer_list __submatches, - regex_constants::match_flag_type __m = regex_constants::match_default); + const regex_type& __re, + initializer_list __submatches, + regex_constants::match_flag_type __m = + regex_constants::match_default); template - regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, - const regex_type& __re, const int (&__submatches)[_N], - regex_constants::match_flag_type __m = regex_constants::match_default); + regex_token_iterator(_BidirectionalIterator __a, + _BidirectionalIterator __b, + const regex_type& __re, + const int (&__submatches)[_N], + regex_constants::match_flag_type __m = + regex_constants::match_default); regex_token_iterator(const regex_token_iterator&); regex_token_iterator& operator=(const regex_token_iterator&); - bool operator==(const regex_token_iterator&) const; - bool operator!=(const regex_token_iterator&) const; + bool operator==(const regex_token_iterator& __x) const; + bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);} - const value_type& operator*() const; - const value_type* operator->() const; + const value_type& operator*() const {return *__result_;} + const value_type* operator->() const {return __result_;} regex_token_iterator& operator++(); - regex_token_iterator operator++(int); + regex_token_iterator operator++(int) + { + regex_token_iterator __t(*this); + ++(*this); + return __t; + } + +private: + void __init(_BidirectionalIterator __a, _BidirectionalIterator __b); }; +template +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + regex_token_iterator() + : __result_(nullptr), + __suffix_(), + _N_(0) +{ +} + +template +void +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + __init(_BidirectionalIterator __a, _BidirectionalIterator __b) +{ + if (__position_ != _Position()) + { + if (__subs_[_N_] == -1) + __result_ = &__position_->prefix(); + else + __result_ = &(*__position_)[__subs_[_N_]]; + } + else if (__subs_[_N_] == -1) + { + __suffix_.matched = true; + __suffix_.first = __a; + __suffix_.second = __b; + __result_ = &__suffix_; + } + else + __result_ = nullptr; +} + +template +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, + const regex_type& __re, int __submatch, + regex_constants::match_flag_type __m) + : __position_(__a, __b, __re, __m), + _N_(0), + __subs_(1, __submatch) +{ + __init(__a, __b); +} + +template +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, + const regex_type& __re, const vector& __submatches, + regex_constants::match_flag_type __m) + : __position_(__a, __b, __re, __m), + _N_(0), + __subs_(__submatches) +{ + __init(__a, __b); +} + +template +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, + const regex_type& __re, + initializer_list __submatches, + regex_constants::match_flag_type __m) + : __position_(__a, __b, __re, __m), + _N_(0), + __subs_(__submatches) +{ + __init(__a, __b); +} + +template +template +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, + const regex_type& __re, + const int (&__submatches)[_N], + regex_constants::match_flag_type __m) + : __position_(__a, __b, __re, __m), + _N_(0), + __subs_(__submatches, __submatches + _N) +{ + __init(__a, __b); +} + +template +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + regex_token_iterator(const regex_token_iterator& __x) + : __position_(__x.__position_), + __result_(__x.__result_), + __suffix_(__x.__suffix_), + _N_(__x._N_), + __subs_(__x.__subs_) +{ + if (__x.__result_ == &__x.__suffix_) + __result_ == &__suffix_; +} + +template +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>& +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + operator=(const regex_token_iterator& __x) +{ + if (this != &__x) + { + __position_ = __x.__position_; + if (__x.__result_ == &__x.__suffix_) + __result_ == &__suffix_; + else + __result_ = __x.__result_; + __suffix_ = __x.__suffix_; + _N_ = __x._N_; + __subs_ = __x.__subs_; + } + return *this; +} + +template +bool +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + operator==(const regex_token_iterator& __x) const +{ + if (__result_ == nullptr && __x.__result_ == nullptr) + return true; + if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ && + __suffix_ == __x.__suffix_) + return true; + if (__result_ == nullptr || __x.__result_ == nullptr) + return false; + if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_) + return false; + return __position_ == __x.__position_ && _N_ == __x._N_ && + __subs_ == __x.__subs_; +} + +template +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>& +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++() +{ + _Position __prev = __position_; + if (__result_ == &__suffix_) + __result_ = nullptr; + else if (_N_ + 1 < __subs_.size()) + { + ++_N_; + if (__subs_[_N_] == -1) + __result_ = &__position_->prefix(); + else + __result_ = &(*__position_)[__subs_[_N_]]; + } + else + { + _N_ = 0; + ++__position_; + if (__position_ != _Position()) + { + if (__subs_[_N_] == -1) + __result_ = &__position_->prefix(); + else + __result_ = &(*__position_)[__subs_[_N_]]; + } + else + { + if (_STD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end() + && __prev->suffix().length() != 0) + { + __suffix_.matched = true; + __suffix_.first = __prev->suffix().first; + __suffix_.second = __prev->suffix().second; + __result_ = &__suffix_; + } + else + __result_ = nullptr; + } + } + return *this; +} + typedef regex_token_iterator cregex_token_iterator; typedef regex_token_iterator wcregex_token_iterator; typedef regex_token_iterator sregex_token_iterator; diff --git a/test/re/re.iter/re.tokiter/re.tokiter.cnstr/array.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/array.pass.cpp new file mode 100644 index 000000000..c876fcf07 --- /dev/null +++ b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/array.pass.cpp @@ -0,0 +1,64 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// class regex_token_iterator + +// template +// regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, +// const regex_type& re, +// const int (&submatches)[N], +// regex_constants::match_flag_type m = +// regex_constants::match_default); + +#include +#include + +int main() +{ + { + std::regex phone_numbers("\\d{3}-(\\d{4})"); + const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end"; + const int indices[] = {-1, 0, 1}; + std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book), + phone_numbers, indices); + assert(i != std::cregex_token_iterator()); + assert(i->str() == "start "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-1234"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "1234"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-2345"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "2345"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-3456"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "3456"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == " end"); + ++i; + assert(i == std::cregex_token_iterator()); + } +} \ No newline at end of file diff --git a/test/re/re.iter/re.tokiter/re.tokiter.cnstr/default.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/default.pass.cpp new file mode 100644 index 000000000..88b5c2396 --- /dev/null +++ b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/default.pass.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// class regex_token_iterator + +// regex_token_iterator(); + +#include +#include + +template +void +test() +{ + typedef std::regex_token_iterator I; + I i1; + assert(i1 == I()); +} + +int main() +{ + test(); + test(); +} \ No newline at end of file diff --git a/test/re/re.iter/re.tokiter/re.tokiter.cnstr/init.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/init.pass.cpp new file mode 100644 index 000000000..1f85dec37 --- /dev/null +++ b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/init.pass.cpp @@ -0,0 +1,64 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// class regex_token_iterator + +// regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, +// const regex_type& re, +// initializer_list submatches, +// regex_constants::match_flag_type m = +// regex_constants::match_default); + +#include +#include + +int main() +{ +#ifdef _LIBCPP_MOVE + { + std::regex phone_numbers("\\d{3}-(\\d{4})"); + const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end"; + std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book), + phone_numbers, {-1, 0, 1}); + assert(i != std::cregex_token_iterator()); + assert(i->str() == "start "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-1234"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "1234"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-2345"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "2345"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-3456"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "3456"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == " end"); + ++i; + assert(i == std::cregex_token_iterator()); + } +#endif +} \ No newline at end of file diff --git a/test/re/re.iter/re.tokiter/re.tokiter.cnstr/int.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/int.pass.cpp new file mode 100644 index 000000000..45afd9bba --- /dev/null +++ b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/int.pass.cpp @@ -0,0 +1,75 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// class regex_token_iterator + +// regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, +// const regex_type& re, int submatch = 0, +// regex_constants::match_flag_type m = +// regex_constants::match_default); + +#include +#include + +int main() +{ + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end"; + std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book), + phone_numbers, -1); + assert(i != std::cregex_token_iterator()); + assert(i->str() == "start "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == " end"); + ++i; + assert(i == std::cregex_token_iterator()); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end"; + std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book), + phone_numbers); + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-1234"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-2345"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-3456"); + ++i; + assert(i == std::cregex_token_iterator()); + } + { + std::regex phone_numbers("\\d{3}-(\\d{4})"); + const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end"; + std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book), + phone_numbers, 1); + assert(i != std::cregex_token_iterator()); + assert(i->str() == "1234"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "2345"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "3456"); + ++i; + assert(i == std::cregex_token_iterator()); + } +} \ No newline at end of file diff --git a/test/re/re.iter/re.tokiter/re.tokiter.cnstr/vector.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/vector.pass.cpp new file mode 100644 index 000000000..f614f075c --- /dev/null +++ b/test/re/re.iter/re.tokiter/re.tokiter.cnstr/vector.pass.cpp @@ -0,0 +1,128 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// class regex_token_iterator + +// regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, +// const regex_type& re, +// const std::vector& submatches, +// regex_constants::match_flag_type m = +// regex_constants::match_default); + +#include +#include + +int main() +{ + { + std::regex phone_numbers("\\d{3}-(\\d{4})"); + const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end"; + std::vector v; + v.push_back(-1); + v.push_back(-1); + std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book), + phone_numbers, v); + assert(i != std::cregex_token_iterator()); + assert(i->str() == "start "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "start "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == " end"); + ++i; + assert(i == std::cregex_token_iterator()); + } + { + std::regex phone_numbers("\\d{3}-(\\d{4})"); + const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end"; + std::vector v; + v.push_back(-1); + v.push_back(0); + std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book), + phone_numbers, v); + assert(i != std::cregex_token_iterator()); + assert(i->str() == "start "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-1234"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-2345"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-3456"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == " end"); + ++i; + assert(i == std::cregex_token_iterator()); + } + { + std::regex phone_numbers("\\d{3}-(\\d{4})"); + const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end"; + std::vector v; + v.push_back(-1); + v.push_back(0); + v.push_back(1); + std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book), + phone_numbers, v); + assert(i != std::cregex_token_iterator()); + assert(i->str() == "start "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-1234"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "1234"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-2345"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "2345"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-3456"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "3456"); + ++i; + assert(i != std::cregex_token_iterator()); + assert(i->str() == " end"); + ++i; + assert(i == std::cregex_token_iterator()); + } +} \ No newline at end of file diff --git a/test/re/re.iter/re.tokiter/re.tokiter.comp/equal.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.comp/equal.pass.cpp new file mode 100644 index 000000000..d76c3b0f6 --- /dev/null +++ b/test/re/re.iter/re.tokiter/re.tokiter.comp/equal.pass.cpp @@ -0,0 +1,36 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// class regex_token_iterator + +// bool operator==(const regex_token_iterator& right) const; +// bool operator!=(const regex_token_iterator& right) const; + +#include +#include + +int main() +{ + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end"; + std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book), + phone_numbers, -1); + assert(i != std::cregex_token_iterator()); + assert(!(i == std::cregex_token_iterator())); + std::cregex_token_iterator i2 = i; + assert(i2 == i); + assert(!(i2 != i)); + ++i; + assert(!(i2 == i)); + assert(i2 != i); + } +} \ No newline at end of file diff --git a/test/re/re.iter/re.tokiter/re.tokiter.deref/deref.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.deref/deref.pass.cpp new file mode 100644 index 000000000..a2599d562 --- /dev/null +++ b/test/re/re.iter/re.tokiter/re.tokiter.deref/deref.pass.cpp @@ -0,0 +1,72 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// class regex_token_iterator + +// const value_type& operator*() const; + +#include +#include + +int main() +{ + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end"; + std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book), + phone_numbers, -1); + assert(i != std::cregex_token_iterator()); + assert((*i).str() == "start "); + ++i; + assert(i != std::cregex_token_iterator()); + assert((*i).str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert((*i).str() == ", "); + ++i; + assert(i != std::cregex_token_iterator()); + assert((*i).str() == " end"); + ++i; + assert(i == std::cregex_token_iterator()); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end"; + std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book), + phone_numbers); + assert(i != std::cregex_token_iterator()); + assert((*i).str() == "555-1234"); + ++i; + assert(i != std::cregex_token_iterator()); + assert((*i).str() == "555-2345"); + ++i; + assert(i != std::cregex_token_iterator()); + assert((*i).str() == "555-3456"); + ++i; + assert(i == std::cregex_token_iterator()); + } + { + std::regex phone_numbers("\\d{3}-(\\d{4})"); + const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end"; + std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book), + phone_numbers, 1); + assert(i != std::cregex_token_iterator()); + assert((*i).str() == "1234"); + ++i; + assert(i != std::cregex_token_iterator()); + assert((*i).str() == "2345"); + ++i; + assert(i != std::cregex_token_iterator()); + assert((*i).str() == "3456"); + ++i; + assert(i == std::cregex_token_iterator()); + } +} \ No newline at end of file diff --git a/test/re/re.iter/re.tokiter/re.tokiter.incr/post.pass.cpp b/test/re/re.iter/re.tokiter/re.tokiter.incr/post.pass.cpp new file mode 100644 index 000000000..105ecf76e --- /dev/null +++ b/test/re/re.iter/re.tokiter/re.tokiter.incr/post.pass.cpp @@ -0,0 +1,72 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// class regex_token_iterator + +// regex_token_iterator& operator++(int); + +#include +#include + +int main() +{ + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end"; + std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book), + phone_numbers, -1); + assert(i != std::cregex_token_iterator()); + assert(i->str() == "start "); + i++; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + i++; + assert(i != std::cregex_token_iterator()); + assert(i->str() == ", "); + i++; + assert(i != std::cregex_token_iterator()); + assert(i->str() == " end"); + i++; + assert(i == std::cregex_token_iterator()); + } + { + std::regex phone_numbers("\\d{3}-\\d{4}"); + const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end"; + std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book), + phone_numbers); + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-1234"); + i++; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-2345"); + i++; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "555-3456"); + i++; + assert(i == std::cregex_token_iterator()); + } + { + std::regex phone_numbers("\\d{3}-(\\d{4})"); + const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end"; + std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book), + phone_numbers, 1); + assert(i != std::cregex_token_iterator()); + assert(i->str() == "1234"); + i++; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "2345"); + i++; + assert(i != std::cregex_token_iterator()); + assert(i->str() == "3456"); + i++; + assert(i == std::cregex_token_iterator()); + } +} \ No newline at end of file diff --git a/test/re/re.iter/re.tokiter/types.pass.cpp b/test/re/re.iter/re.tokiter/types.pass.cpp new file mode 100644 index 000000000..75cdae8da --- /dev/null +++ b/test/re/re.iter/re.tokiter/types.pass.cpp @@ -0,0 +1,45 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// template ::value_type, +// class traits = regex_traits> +// class regex_token_iterator +// { +// public: +// typedef basic_regex regex_type; +// typedef sub_match value_type; +// typedef ptrdiff_t difference_type; +// typedef const value_type* pointer; +// typedef const value_type& reference; +// typedef forward_iterator_tag iterator_category; + +#include +#include + +template +void +test() +{ + typedef std::regex_token_iterator I; + static_assert((std::is_same >::value), ""); + static_assert((std::is_same >::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same*>::value), ""); + static_assert((std::is_same&>::value), ""); + static_assert((std::is_same::value), ""); +} + +int main() +{ + test(); + test(); +} \ No newline at end of file