diff options
author | Marco Bubke <marco.bubke@qt.io> | 2017-11-28 17:58:24 +0100 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2017-12-20 09:58:17 +0000 |
commit | 91e40e12dbb94283cd804405411effc7f9903ed4 (patch) | |
tree | 8ae65bf61bb2ef081b3591584ec8677321aae9d4 /src/libs/utils/algorithm.h | |
parent | 60fb35a23c7827ab9448edbb62a3dd4dabd04550 (diff) | |
download | qt-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.h | 57 |
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); }); +} + } |