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