diff options
author | VladiMihaylenko <vxmihaylenko@gmail.com> | 2017-10-20 14:29:26 +0300 |
---|---|---|
committer | r.kuznetsov <r.kuznetsov@corp.mail.ru> | 2017-11-09 11:10:09 +0300 |
commit | 8bcc2e1c5885e4348f9727881db7bb697d47dc24 (patch) | |
tree | 6851d00112801cd9f02fac3fc1ca374faa9dec0b /indexer/ftraits.hpp | |
parent | 9e725b7eb744b1d3f5028a60b5427db2797919f4 (diff) |
Send type from ugc_types.csv
Diffstat (limited to 'indexer/ftraits.hpp')
-rw-r--r-- | indexer/ftraits.hpp | 68 |
1 files changed, 46 insertions, 22 deletions
diff --git a/indexer/ftraits.hpp b/indexer/ftraits.hpp index 7900f43afc..35ac7f3241 100644 --- a/indexer/ftraits.hpp +++ b/indexer/ftraits.hpp @@ -23,22 +23,49 @@ template <typename Base, typename Value> class TraitsBase { public: - static Value GetValue(feature::TypesHolder const & types) + static bool GetValue(feature::TypesHolder const & types, Value & value) { - static Base instance; + auto const & instance = Instance(); + auto const it = Find(types); + if (!instance.m_matcher.IsValid(it)) + return false; - auto const excluded = instance.m_excluded.Find(types); - if (instance.m_excluded.IsValid(excluded)) - return Base::GetEmptyValue(); + value = it->second; + return true; + } - auto const it = instance.m_matcher.Find(types); + static bool GetType(feature::TypesHolder const & types, uint32_t & type) + { + auto const & instance = Instance(); + auto const it = Find(types); if (!instance.m_matcher.IsValid(it)) - return Base::GetEmptyValue(); + return false; - return it->second; + type = it->first; + return true; + } + +private: + using ConstIterator = typename ftypes::HashMapMatcher<uint32_t, Value>::ConstIterator; + + static ConstIterator Find(feature::TypesHolder const & types) + { + auto const & instance = Instance(); + + auto const excluded = instance.m_excluded.Find(types); + if (instance.m_excluded.IsValid(excluded)) + return instance.m_matcher.End(); + + return instance.m_matcher.Find(types); } protected: + static TraitsBase const & Instance() + { + static Base instance; + return instance; + } + ftypes::HashMapMatcher<uint32_t, Value> m_matcher; ftypes::HashSetMatcher<uint32_t> m_excluded; }; @@ -121,12 +148,6 @@ class UGC : public TraitsBase<UGC, UGCItem> } public: - static UGCItem const & GetEmptyValue() - { - static const UGCItem item; - return item; - } - static bool IsUGCAvailable(UGCTypeMask mask) { return mask != UGCTYPE_NONE; } static bool IsRatingAvailable(UGCTypeMask mask) { return mask & UGCTYPE_RATING; } static bool IsReviewsAvailable(UGCTypeMask mask) { return mask & UGCTYPE_REVIEWS; } @@ -134,23 +155,29 @@ public: static bool IsUGCAvailable(feature::TypesHolder const & types) { - return IsUGCAvailable(GetValue(types).m_mask); + UGCItem item; + return GetValue(types, item) ? IsUGCAvailable(item.m_mask) : false; } static bool IsRatingAvailable(feature::TypesHolder const & types) { - return IsRatingAvailable(GetValue(types).m_mask); + UGCItem item; + return GetValue(types, item) ? IsRatingAvailable(item.m_mask) : false; } static bool IsReviewsAvailable(feature::TypesHolder const & types) { - return IsReviewsAvailable(GetValue(types).m_mask); + UGCItem item; + return GetValue(types, item) ? IsReviewsAvailable(item.m_mask) : false; } static bool IsDetailsAvailable(feature::TypesHolder const & types) { - return IsDetailsAvailable(GetValue(types).m_mask); + UGCItem item; + return GetValue(types, item) ? IsDetailsAvailable(item.m_mask) : false; } static UGCRatingCategories GetCategories(feature::TypesHolder const & types) { - return GetValue(types).m_categories; + UGCItem item; + GetValue(types, item); + return item.m_categories; } }; @@ -184,9 +211,6 @@ class Wheelchair : public TraitsBase<Wheelchair, WheelchairAvailability> m_matcher.Append<TypesInitializer>({{"wheelchair", "limited"}}, WheelchairAvailability::Limited); } - -public: - static WheelchairAvailability GetEmptyValue() { return WheelchairAvailability::No; } }; } // namespace ftraits |