Stop accessing/comparing singular iterators.

Fixes #4708.

[SVN r65800]
This commit is contained in:
John Maddock
2010-10-07 07:23:58 +00:00
parent 6fd55b0510
commit 27eb8e46ff

View File

@ -56,7 +56,7 @@ struct sub_match : public std::pair<BidiIterator, BidiIterator>
template <class T, class A> template <class T, class A>
operator std::basic_string<value_type, T, A> ()const operator std::basic_string<value_type, T, A> ()const
{ {
return std::basic_string<value_type, T, A>(this->first, this->second); return matched ? std::basic_string<value_type, T, A>(this->first, this->second) : std::basic_string<value_type, T, A>();
} }
#else #else
operator std::basic_string<value_type> ()const operator std::basic_string<value_type> ()const
@ -66,12 +66,14 @@ struct sub_match : public std::pair<BidiIterator, BidiIterator>
#endif #endif
difference_type BOOST_REGEX_CALL length()const difference_type BOOST_REGEX_CALL length()const
{ {
difference_type n = ::boost::re_detail::distance((BidiIterator)this->first, (BidiIterator)this->second); difference_type n = matched ? ::boost::re_detail::distance((BidiIterator)this->first, (BidiIterator)this->second) : 0;
return n; return n;
} }
std::basic_string<value_type> str()const std::basic_string<value_type> str()const
{ {
std::basic_string<value_type> result; std::basic_string<value_type> result;
if(matched)
{
std::size_t len = ::boost::re_detail::distance((BidiIterator)this->first, (BidiIterator)this->second); std::size_t len = ::boost::re_detail::distance((BidiIterator)this->first, (BidiIterator)this->second);
result.reserve(len); result.reserve(len);
BidiIterator i = this->first; BidiIterator i = this->first;
@ -80,6 +82,7 @@ struct sub_match : public std::pair<BidiIterator, BidiIterator>
result.append(1, *i); result.append(1, *i);
++i; ++i;
} }
}
return result; return result;
} }
int compare(const sub_match& s)const int compare(const sub_match& s)const