summaryrefslogtreecommitdiff
path: root/zen/stl_tools.h
diff options
context:
space:
mode:
Diffstat (limited to 'zen/stl_tools.h')
-rw-r--r--zen/stl_tools.h106
1 files changed, 99 insertions, 7 deletions
diff --git a/zen/stl_tools.h b/zen/stl_tools.h
index 6cfe35f8..1707a1eb 100644
--- a/zen/stl_tools.h
+++ b/zen/stl_tools.h
@@ -1,16 +1,68 @@
// **************************************************************************
-// * This file is part of the FreeFileSync project. It is distributed under *
-// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
-// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// * This file is part of the zenXML project. It is distributed under the *
+// * Boost Software License, Version 1.0. See accompanying file *
+// * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. *
+// * Copyright (C) 2011 ZenJu (zhnmju123 AT gmx.de) *
// **************************************************************************
#ifndef STL_TOOLS_HEADER_84567184321434
#define STL_TOOLS_HEADER_84567184321434
-//no need to drag in any STL includes :)
+//no need to drag in any STL includes
+
+//enhancements for <algorithm>
namespace zen
{
+//idomatic remove selected elements from container
+template <class V, class Predicate>
+void vector_remove_if(V& vec, Predicate p);
+
+template <class S, class Predicate>
+void set_remove_if(S& set, Predicate p);
+
+template <class M, class Predicate>
+void map_remove_if(M& map, Predicate p);
+
+//binary search returning an iterator
+template <class ForwardIterator, class T, typename Compare>
+ForwardIterator binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
+
+template<class BidirectionalIterator, class T>
+BidirectionalIterator find_last(BidirectionalIterator first, BidirectionalIterator last, const T& value);
+
+//replacement for std::find_end taking advantage of bidirectional iterators (and giving the algorithm a reasonable name)
+template<class BidirectionalIterator1, class BidirectionalIterator2>
+BidirectionalIterator1 search_last(BidirectionalIterator1 first1, BidirectionalIterator1 last1,
+ BidirectionalIterator2 first2, BidirectionalIterator2 last2);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//######################## implementation ########################
+
template <class V, class Predicate> inline
void vector_remove_if(V& vec, Predicate p)
{
@@ -33,9 +85,8 @@ template <class M, class Predicate> inline
void map_remove_if(M& map, Predicate p) { set_remove_if(map, p); }
-// binary search returning an iterator
template <class ForwardIterator, class T, typename Compare> inline
-ForwardIterator custom_binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp)
+ForwardIterator binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp)
{
first = std::lower_bound(first, last, value, comp);
if (first != last && !comp(value, *first))
@@ -43,7 +94,48 @@ ForwardIterator custom_binary_search(ForwardIterator first, ForwardIterator last
else
return last;
}
+
+
+template<class BidirectionalIterator, class T> inline
+BidirectionalIterator find_last(const BidirectionalIterator first, BidirectionalIterator last, const T& value)
+{
+ const BidirectionalIterator iterNotFound = last;
+ do
+ {
+ if (last == first)
+ return iterNotFound;
+ --last;
+ }
+ while (!(*last == value)); //loop over "last": 1. check 2. decrement 3. evaluate
+ return last;
}
-#endif //STL_TOOLS_HEADER_84567184321434 \ No newline at end of file
+template<class BidirectionalIterator1, class BidirectionalIterator2> inline
+BidirectionalIterator1 search_last(const BidirectionalIterator1 first1, BidirectionalIterator1 last1,
+ const BidirectionalIterator2 first2, BidirectionalIterator2 last2)
+{
+ if (first1 == last1 ||
+ first2 == last2)
+ return last1;
+
+ int diff = static_cast<int>(std::distance(first1, last1)) -
+ static_cast<int>(std::distance(first2, last2));
+
+ const BidirectionalIterator1 iterNotFound = last1;
+ --last2;
+
+ while (diff-- >= 0) //loop over "last1": 1. check 2. decrement 3. evaluate
+ {
+ --last1;
+
+ BidirectionalIterator1 iter1 = last1;
+ for (BidirectionalIterator2 iter2 = last2; *iter1 == *iter2; --iter1, --iter2)
+ if (iter2 == first2)
+ return iter1;
+ }
+ return iterNotFound;
+}
+}
+
+#endif //STL_TOOLS_HEADER_84567184321434
bgstack15