#pragma once #include "map/booking_filter.hpp" #include "map/booking_filter_params.hpp" #include "indexer/feature_decl.hpp" #include "platform/safe_callback.hpp" #include "base/macros.hpp" #include #include class DataSource; namespace search { class Results; } namespace booking { class Api; namespace filter { struct CachedResult { CachedResult(Type type, std::vector && featuresSorted) : m_type(type) , m_featuresSorted(featuresSorted) { } Type m_type; std::vector m_featuresSorted; }; using CachedResults = std::vector; using FillSearchMarksCallback = platform::SafeCallback; class FilterProcessor : public FilterBase::Delegate { public: FilterProcessor(DataSource const & dataSource, booking::Api const & api); void ApplyFilters(search::Results const & results, TasksInternal && tasks, ApplicationMode const mode); void OnParamsUpdated(Type const type, std::shared_ptr const & params); void GetFeaturesFromCache(Types const & types, search::Results const & results, FillSearchMarksCallback const & callback); // FilterInterface::Delegate overrides: DataSource const & GetDataSource() const override; Api const & GetApi() const override; private: void ApplyConsecutively(search::Results const & results, TasksInternal & tasks); void ApplyIndependently(search::Results const & results, TasksInternal const & tasks); DataSource const & m_dataSource; Api const & m_api; std::unordered_map m_filters; DISALLOW_COPY_AND_MOVE(FilterProcessor); }; } // namespace filter } // namespace booking