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>
This commit is contained in:
Marco Bubke
2017-11-28 17:58:24 +01:00
committed by Eike Ziller
parent 60fb35a23c
commit 91e40e12db
2 changed files with 110 additions and 0 deletions

View File

@@ -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); });
}
}