summaryrefslogtreecommitdiff
path: root/src/libs/utils/algorithm.h
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2017-11-28 17:58:24 +0100
committerEike Ziller <eike.ziller@qt.io>2017-12-20 09:58:17 +0000
commit91e40e12dbb94283cd804405411effc7f9903ed4 (patch)
tree8ae65bf61bb2ef081b3591584ec8677321aae9d4 /src/libs/utils/algorithm.h
parent60fb35a23c7827ab9448edbb62a3dd4dabd04550 (diff)
downloadqt-creator-91e40e12dbb94283cd804405411effc7f9903ed4.tar.gz
Utils: Converter to raw pointer and references
Sometimes you want to get raw pointer container from smart pointer container and reference container from value container. Change-Id: Ia018d572ac0a7bf742f3937dc38ee30670a3ca73 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Diffstat (limited to 'src/libs/utils/algorithm.h')
-rw-r--r--src/libs/utils/algorithm.h57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/libs/utils/algorithm.h b/src/libs/utils/algorithm.h
index 90405f0129..64fe9f58c1 100644
--- a/src/libs/utils/algorithm.h
+++ b/src/libs/utils/algorithm.h
@@ -30,6 +30,7 @@
#include <qcompilerdetection.h> // for Q_REQUIRED_RESULT
#include <algorithm>
+#include <memory>
#include <tuple>
#include <QObject>
@@ -658,4 +659,60 @@ inline void reverseForeach(const Container &c, const Op &operation)
operation(*it);
}
+//////////////////
+// toRawPointer
+/////////////////
+template <typename ResultContainer,
+ typename SourceContainer>
+ResultContainer toRawPointer(const SourceContainer &sources)
+{
+ return transform<ResultContainer>(sources, [] (const auto &pointer) { return pointer.get(); });
+}
+
+template <template<typename...> class ResultContainer,
+ template<typename...> class SourceContainer,
+ typename... SCArgs>
+auto toRawPointer(const SourceContainer<SCArgs...> &sources)
+{
+ return transform<ResultContainer, const SourceContainer<SCArgs...> &>(sources, [] (const auto &pointer) { return pointer.get(); });
+}
+
+template <class SourceContainer>
+auto toRawPointer(const SourceContainer &sources)
+{
+ return transform(sources, [] (const auto &pointer) { return pointer.get(); });
+}
+
+//////////////////
+// toReferences
+/////////////////
+template <template<typename...> class ResultContainer,
+ typename SourceContainer>
+auto toReferences(SourceContainer &sources)
+{
+ return transform<ResultContainer>(sources, [] (auto &value) { return std::ref(value); });
+}
+
+template <typename SourceContainer>
+auto toReferences(SourceContainer &sources)
+{
+ return transform(sources, [] (auto &value) { return std::ref(value); });
+}
+
+//////////////////
+// toConstReferences
+/////////////////
+template <template<typename...> class ResultContainer,
+ typename SourceContainer>
+auto toConstReferences(const SourceContainer &sources)
+{
+ return transform<ResultContainer>(sources, [] (const auto &value) { return std::cref(value); });
+}
+
+template <typename SourceContainer>
+auto toConstReferences(const SourceContainer &sources)
+{
+ return transform(sources, [] (const auto &value) { return std::cref(value); });
+}
+
}