[Patch] find_end() for random_access iterators.
Dhruv Matani
dhruvbird@gmx.net
Thu Dec 16 11:03:00 GMT 2004
Hello,
I have attached a patch along with a test case for the find_end()
function.
I intend implementing basic_string<>::rfind() using this version if and
when this piece of code is committed.
--
-Dhruv Matani.
http://www.geocities.com/dhruvbird/
The price of freedom is responsibility, but it's a bargain, because
freedom is priceless. ~ Hugh Downs
-------------- next part --------------
--- stl_algo.h 2004-12-16 15:36:43.000000000 +0530
+++ /home/dhruv/projects/new_libstdc++-v3/stl_algo.h 2004-12-16 16:33:08.000000000 +0530
@@ -5032,6 +5032,54 @@ namespace std
}
}
+ // find_end for random-access iterators. Requires partial specialization.
+ template<typename _RandomAccessIterator1, typename _RandomAccessIterator2>
+ _RandomAccessIterator1
+ __find_end(_RandomAccessIterator1 __first1,
+ _RandomAccessIterator1 __last1,
+ _RandomAccessIterator2 __first2,
+ _RandomAccessIterator2 __last2,
+ random_access_iterator_tag, random_access_iterator_tag)
+ {
+ typename std::iterator_traits<_RandomAccessIterator2>::difference_type
+ __dest_diff = __last2 - __first2;
+ typename std::iterator_traits<_RandomAccessIterator1>::difference_type
+ __src_diff = __last1 - __first1;
+
+ if (__dest_diff > __src_diff)
+ return __last1;
+ if (__first2 == __last2)
+ return __last1;
+
+ _RandomAccessIterator1 __src1 = __last1 - __dest_diff;
+ while (__src1 != __first1)
+ {
+ if (*__src1 == *__first2)
+ {
+ _RandomAccessIterator1 __temp1 =
+ std::search(__src1, __src1 + __dest_diff, __first2, __last2);
+ if (__temp1 == __src1)
+ return __src1;
+ else
+ --__src1;
+ }
+ else
+ --__src1;
+ }
+
+ if (*__src1 == *__first2)
+ {
+ _RandomAccessIterator1 __ret1 =
+ std::search(__first1, __first1 + __dest_diff, __first2, __last2);
+ if (__ret1 == __first1 + __dest_diff)
+ return __last1;
+ else
+ return __ret1;
+ }
+
+ return __last1;
+ }
+
template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
typename _BinaryPredicate>
_BidirectionalIterator1
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fend_test.cpp
Type: text/x-c++
Size: 736 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20041216/bd2f6d59/attachment.bin>
More information about the Libstdc++
mailing list