#ifndef OPSTREAM_H #define OPSTREAM_H #include #include namespace Operate { template class Result { public: Result(QList source, std::function list_filter, std::function list_peaks) : source_store(source), peak_store(list_peaks), filter_store(list_filter){} virtual ~Result() = default; virtual QList toList() { QList rets_list; for(auto &it : source_store) if(filter_store(it)) rets_list << peak_store(it); return rets_list; } template QHash toMap(std::function key_selector) { QHash map; for(auto &it : source_store) if(filter_store(it)) map[key_selector(it)] = peak_store(it); return map; } virtual void forEach(std::function ex_proc) { auto items = toList(); for(auto &it : items) ex_proc(it); } Result filter(std::function filter){ auto filter_combine = [filter, this](const ValueType& it){ return filter(it) && filter_store(it); }; return Result(source_store, filter_combine, peak_store); } template Result select(std::function peak){ auto peak_combine = [peak, this](const TargetType &it){ auto temp = this->peak_store(it); return peak(temp); }; return Result(source_store, filter_store, peak_combine); } private: QList source_store; std::function peak_store; std::function filter_store; }; template class OpStream { public: /** * @brief 通过迭代函数建立操作流 * @param peak_proc function */ OpStream(std::function peak_proc) { int count = 0; peak_proc(count, 0); for (int index = 0; index < count; ++index) source_store << peak_proc(count, index); } /** * @brief 通过集合建立操作流 * @param source */ OpStream(QList source) : source_store(source){} template Result select(std::function value_selector) { return Result(source_store, [](const ValueType& it){return true;}, value_selector); } Result select() { return Result(source_store, [](const ValueType& it){return true;}, [](const ValueType& it){return it;}); } Result filter(std::function filter) { return Result(source_store, filter, [](const ValueType& it){ return it; }); } private: QList source_store; }; } #endif // OPSTREAM_H