Merge minor fixes from Trunk.

[SVN r85727]
This commit is contained in:
John Maddock
2013-09-17 17:42:00 +00:00
parent b738a55e0d
commit b36d432ffa
2 changed files with 35 additions and 5 deletions

View File

@ -703,7 +703,13 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat()
if(::boost::is_random_access_iterator<BidiIterator>::value) if(::boost::is_random_access_iterator<BidiIterator>::value)
{ {
BidiIterator end = position; BidiIterator end = position;
std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired)); // Move end forward by "desired", preferably without using distance or advance if we can
// as these can be slow for some iterator types.
std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::re_detail::distance(position, last);
if(desired >= len)
end = last;
else
std::advance(end, desired);
BidiIterator origin(position); BidiIterator origin(position);
while((position != end) && (traits_inst.translate(*position, icase) == what)) while((position != end) && (traits_inst.translate(*position, icase) == what))
{ {
@ -771,7 +777,13 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
if(::boost::is_random_access_iterator<BidiIterator>::value) if(::boost::is_random_access_iterator<BidiIterator>::value)
{ {
BidiIterator end = position; BidiIterator end = position;
std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired)); // Move end forward by "desired", preferably without using distance or advance if we can
// as these can be slow for some iterator types.
std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::re_detail::distance(position, last);
if(desired >= len)
end = last;
else
std::advance(end, desired);
BidiIterator origin(position); BidiIterator origin(position);
while((position != end) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))]) while((position != end) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
{ {
@ -840,7 +852,13 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
if(::boost::is_random_access_iterator<BidiIterator>::value) if(::boost::is_random_access_iterator<BidiIterator>::value)
{ {
BidiIterator end = position; BidiIterator end = position;
std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired)); // Move end forward by "desired", preferably without using distance or advance if we can
// as these can be slow for some iterator types.
std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::re_detail::distance(position, last);
if(desired >= len)
end = last;
else
std::advance(end, desired);
BidiIterator origin(position); BidiIterator origin(position);
while((position != end) && (position != re_is_set_member(position, last, set, re.get_data(), icase))) while((position != end) && (position != re_is_set_member(position, last, set, re.get_data(), icase)))
{ {

View File

@ -641,7 +641,13 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
if(::boost::is_random_access_iterator<BidiIterator>::value) if(::boost::is_random_access_iterator<BidiIterator>::value)
{ {
BidiIterator end = position; BidiIterator end = position;
std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired)); // Move end forward by "desired", preferably without using distance or advance if we can
// as these can be slow for some iterator types.
std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::re_detail::distance(position, last);
if(desired >= len)
end = last;
else
std::advance(end, desired);
BidiIterator origin(position); BidiIterator origin(position);
while((position != end) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))]) while((position != end) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
{ {
@ -731,7 +737,13 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
if(::boost::is_random_access_iterator<BidiIterator>::value) if(::boost::is_random_access_iterator<BidiIterator>::value)
{ {
BidiIterator end = position; BidiIterator end = position;
std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired)); // Move end forward by "desired", preferably without using distance or advance if we can
// as these can be slow for some iterator types.
std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::re_detail::distance(position, last);
if(desired >= len)
end = last;
else
std::advance(end, desired);
BidiIterator origin(position); BidiIterator origin(position);
while((position != end) && (position != re_is_set_member(position, last, set, re.get_data(), icase))) while((position != end) && (position != re_is_set_member(position, last, set, re.get_data(), icase)))
{ {