Everything under [re.results]

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@111074 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Howard Hinnant
2010-08-14 18:14:02 +00:00
parent 7026a17a48
commit 27405f91a8
23 changed files with 1253 additions and 12 deletions

View File

@@ -5222,14 +5222,27 @@ public:
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;
regex_constants::match_flag_type __flags = regex_constants::format_default) const
{return format(__out, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
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;
regex_constants::match_flag_type __flags = regex_constants::format_default) const
{
basic_string<char_type, _ST, _SA> __r;
format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
__flags);
return __r;
}
string_type
format(const char_type* __fmt,
regex_constants::match_flag_type __flags = regex_constants::format_default) const;
regex_constants::match_flag_type __flags = regex_constants::format_default) const
{
string_type __r;
format(back_inserter(__r), __fmt,
__fmt + char_traits<char_type>::length(__fmt), __flags);
return __r;
}
// allocator:
allocator_type get_allocator() const {return __matches_.get_allocator();}
@@ -5272,6 +5285,11 @@ private:
regex_match(_B, _B, match_results<_B, _A>&, const basic_regex<_C, _T>&,
regex_constants::match_flag_type);
template <class _B, class _A>
friend
bool
operator==(const match_results<_B, _A>&, const match_results<_B, _A>&);
template <class, class> friend class __lookahead;
};
@@ -5300,25 +5318,142 @@ match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
__suffix_ = __unmatched_;
}
template <class _BidirectionalIterator, class _Allocator>
template <class _OutputIter>
_OutputIter
match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __out,
const char_type* __fmt_first, const char_type* __fmt_last,
regex_constants::match_flag_type __flags) const
{
if (__flags & regex_constants::format_sed)
{
for (; __fmt_first != __fmt_last; ++__fmt_first)
{
if (*__fmt_first == '&')
__out = _STD::copy(__matches_[0].first, __matches_[0].second,
__out);
else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
{
++__fmt_first;
if ('0' <= *__fmt_first && *__fmt_first <= '9')
{
size_t __i = *__fmt_first - '0';
__out = _STD::copy(__matches_[__i].first,
__matches_[__i].second, __out);
}
else
{
*__out = *__fmt_first;
++__out;
}
}
else
{
*__out = *__fmt_first;
++__out;
}
}
}
else
{
for (; __fmt_first != __fmt_last; ++__fmt_first)
{
if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
{
switch (__fmt_first[1])
{
case '$':
*__out = *++__fmt_first;
++__out;
break;
case '&':
++__fmt_first;
__out = _STD::copy(__matches_[0].first, __matches_[0].second,
__out);
break;
case '`':
++__fmt_first;
__out = _STD::copy(__prefix_.first, __prefix_.second, __out);
break;
case '\'':
++__fmt_first;
__out = _STD::copy(__suffix_.first, __suffix_.second, __out);
break;
default:
if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
{
++__fmt_first;
size_t __i = *__fmt_first - '0';
if (__fmt_first + 1 != __fmt_last &&
'0' <= __fmt_first[1] && __fmt_first[1] <= '9')
{
++__fmt_first;
__i = 10 * __i + *__fmt_first - '0';
}
__out = _STD::copy(__matches_[__i].first,
__matches_[__i].second, __out);
}
else
{
*__out = *__fmt_first;
++__out;
}
break;
}
}
else
{
*__out = *__fmt_first;
++__out;
}
}
}
return __out;
}
template <class _BidirectionalIterator, class _Allocator>
void
match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
{
using _STD::swap;
swap(__matches_, __m.__matches_);
swap(__unmatched_, __m.__unmatched_);
swap(__prefix_, __m.__prefix_);
swap(__suffix_, __m.__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);
bool
operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
const match_results<_BidirectionalIterator, _Allocator>& __y)
{
return __x.__matches_ == __y.__matches_ &&
__x.__prefix_ == __y.__prefix_ &&
__x.__suffix_ == __y.__suffix_;
}
template <class _BidirectionalIterator, class _Allocator>
bool
operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
const match_results<_BidirectionalIterator, _Allocator>& __y);
inline _LIBCPP_INLINE_VISIBILITY
bool
operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
const match_results<_BidirectionalIterator, _Allocator>& __y)
{
return !(__x == __y);
}
template <class _BidirectionalIterator, class _Allocator>
void
swap(match_results<_BidirectionalIterator, _Allocator>& __x,
match_results<_BidirectionalIterator, _Allocator>& __y);
inline _LIBCPP_INLINE_VISIBILITY
void
swap(match_results<_BidirectionalIterator, _Allocator>& __x,
match_results<_BidirectionalIterator, _Allocator>& __y)
{
__x.swap(__y);
}
// regex_search