aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/clangsupport/set_algorithm.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/clangsupport/set_algorithm.h')
-rw-r--r--src/libs/clangsupport/set_algorithm.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/libs/clangsupport/set_algorithm.h b/src/libs/clangsupport/set_algorithm.h
new file mode 100644
index 0000000000..39bd3a2055
--- /dev/null
+++ b/src/libs/clangsupport/set_algorithm.h
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#pragma once
+
+#include <algorithm>
+
+namespace ClangBackEnd {
+
+template<class Callable>
+class function_output_iterator
+{
+public:
+ typedef std::output_iterator_tag iterator_category;
+ typedef void value_type;
+ typedef void difference_type;
+ typedef void pointer;
+ typedef void reference;
+
+ explicit function_output_iterator() {}
+
+ explicit function_output_iterator(const Callable &callable)
+ : m_callable(&callable)
+ {}
+
+ function_output_iterator &operator=(const function_output_iterator &iterator)
+ {
+ m_callable = iterator.m_callable;
+
+ return *this;
+ }
+
+ struct helper
+ {
+ helper(const Callable *callable)
+ : m_callable(callable)
+ {}
+ template<class T>
+ helper &operator=(T &&value)
+ {
+ (*m_callable)(std::forward<T>(value));
+ return *this;
+ }
+ const Callable *m_callable;
+ };
+
+ helper operator*() { return helper(m_callable); }
+ function_output_iterator &operator++() { return *this; }
+ function_output_iterator &operator++(int) { return *this; }
+
+private:
+ const Callable *m_callable;
+};
+
+template<typename Callable>
+function_output_iterator<Callable> make_iterator(const Callable &callable)
+{
+ return function_output_iterator<Callable>(callable);
+}
+
+template<class InputIt1, class InputIt2, class Callable, class Compare>
+bool set_intersection_compare(
+ InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, Callable call, Compare comp)
+{
+ while (first1 != last1 && first2 != last2) {
+ if (comp(*first1, *first2)) {
+ ++first1;
+ } else {
+ if (!comp(*first2, *first1)) {
+ if (call(*first2, *first1++))
+ return false;
+ }
+ ++first2;
+ }
+ }
+
+ return true;
+}
+} // namespace ClangBackEnd