File indexing completed on 2024-06-02 05:32:58

0001 /*
0002  * SPDX-FileCopyrightText: 2014 Kevin Ottens <ervin@kde.org>
0003  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004  */
0005 
0006 
0007 
0008 #ifndef DOMAIN_QUERYRESULT_H
0009 #define DOMAIN_QUERYRESULT_H
0010 
0011 #include <algorithm>
0012 
0013 #include "queryresultinterface.h"
0014 #include "queryresultprovider.h"
0015 
0016 namespace Domain {
0017 
0018 
0019 template<typename InputType, typename OutputType = InputType>
0020 class QueryResult : public QueryResultInputImpl<InputType>, public QueryResultInterface<OutputType>
0021 {
0022 public:
0023     typedef QSharedPointer<QueryResult<InputType, OutputType>> Ptr;
0024     typedef QWeakPointer<QueryResult<InputType, OutputType>> WeakPtr;
0025     typedef std::function<void(OutputType, int)> ChangeHandler;
0026 
0027     static Ptr create(const typename QueryResultProvider<InputType>::Ptr &provider)
0028     {
0029         Ptr result(new QueryResult<InputType, OutputType>(provider));
0030         QueryResultInputImpl<InputType>::registerResult(provider, result);
0031         return result;
0032     }
0033 
0034     static Ptr copy(const typename QueryResultInputImpl<InputType>::Ptr &other)
0035     {
0036         if (!other)
0037             return Ptr();
0038 
0039         auto provider = QueryResultInputImpl<InputType>::retrieveProvider(other);
0040         return create(provider);
0041     }
0042 
0043     QList<OutputType> data() const override
0044     {
0045         return dataImpl<OutputType>();
0046     }
0047 
0048     void addPreInsertHandler(const ChangeHandler &handler) override
0049     {
0050         QueryResultInputImpl<InputType>::m_preInsertHandlers << handler;
0051     }
0052 
0053     void addPostInsertHandler(const ChangeHandler &handler) override
0054     {
0055         QueryResultInputImpl<InputType>::m_postInsertHandlers << handler;
0056     }
0057 
0058     void addPreRemoveHandler(const ChangeHandler &handler) override
0059     {
0060         QueryResultInputImpl<InputType>::m_preRemoveHandlers << handler;
0061     }
0062 
0063     void addPostRemoveHandler(const ChangeHandler &handler) override
0064     {
0065         QueryResultInputImpl<InputType>::m_postRemoveHandlers << handler;
0066     }
0067 
0068     void addPreReplaceHandler(const ChangeHandler &handler) override
0069     {
0070         QueryResultInputImpl<InputType>::m_preReplaceHandlers << handler;
0071     }
0072 
0073     void addPostReplaceHandler(const ChangeHandler &handler) override
0074     {
0075         QueryResultInputImpl<InputType>::m_postReplaceHandlers << handler;
0076     }
0077 
0078 private:
0079     explicit QueryResult(const typename QueryResultProvider<InputType>::Ptr &provider)
0080         : QueryResultInputImpl<InputType>(provider)
0081     {
0082     }
0083 
0084     template<typename T>
0085     typename std::enable_if<std::is_same<InputType, T>::value, QList<InputType>>::type
0086     dataImpl() const
0087     {
0088         auto provider = QueryResultInputImpl<InputType>::m_provider;
0089         return provider->data();
0090     }
0091 
0092     template<typename T>
0093     typename std::enable_if<!std::is_same<InputType, T>::value, QList<T>>::type
0094     dataImpl() const
0095     {
0096         auto provider = QueryResultInputImpl<InputType>::m_provider;
0097         QList<InputType> inputData = provider->data();
0098         QList<OutputType> outputData;
0099         std::transform(inputData.constBegin(), inputData.constEnd(),
0100                        std::back_inserter(outputData),
0101                        [] (const InputType &input) { return OutputType(input); });
0102         return outputData;
0103     }
0104 };
0105 
0106 }
0107 
0108 #endif // DOMAIN_QUERYRESULT_H