#pragma once #include "indexer/classificator.hpp" #include "indexer/feature_data.hpp" #include #include #include #include #include namespace ftypes { template class Matcher { public: using ConstIterator = typename Container::const_iterator; ConstIterator Find(feature::TypesHolder const & types) const { for (auto const t : types) { for (auto level = ftype::GetLevel(t); level; --level) { auto truncatedType = t; ftype::TruncValue(truncatedType, level); auto const it = m_mapping.find(truncatedType); if (it != m_mapping.cend()) return it; } } return m_mapping.cend(); } ConstIterator End() const { return m_mapping.cend(); } bool IsValid(ConstIterator it) const { return it != m_mapping.cend(); } bool Contains(feature::TypesHolder const & types) const { return IsValid(Find(types)); } template void AppendType(Type && type, Args &&... args) { m_mapping.emplace(classif().GetTypeByPath(std::forward(type)), std::forward(args)...); } template void Append(TypesPaths && types, Args &&... args) { // We mustn't forward args in the loop below because it will be forwarded at first iteration. for (auto const & type : types) AppendType(type, args...); } private: Container m_mapping; }; template using HashMapMatcher = Matcher>; template using HashSetMatcher = Matcher>; } // namespace ftypes