diff options
author | Sergey Magidovich <mgsergio@mapswithme.com> | 2016-01-13 16:56:27 +0300 |
---|---|---|
committer | Sergey Yershov <yershov@corp.mail.ru> | 2016-03-23 16:03:33 +0300 |
commit | 30fd14a94c67d39c3b9fc04056d2bbbafae40ba3 (patch) | |
tree | 4f64fe3d391b38451556bd234d559debe4034e5c /indexer/feature_meta.hpp | |
parent | 7da95d1f1cafd4945c2e3b8f38a6d3e8ea5c6250 (diff) |
Allow more than 255 bytes in metadata fields.
Diffstat (limited to 'indexer/feature_meta.hpp')
-rw-r--r-- | indexer/feature_meta.hpp | 254 |
1 files changed, 129 insertions, 125 deletions
diff --git a/indexer/feature_meta.hpp b/indexer/feature_meta.hpp index ff798a6c83..97dc5e2d9d 100644 --- a/indexer/feature_meta.hpp +++ b/indexer/feature_meta.hpp @@ -12,154 +12,158 @@ namespace feature { - class MetadataBase +class MetadataBase +{ +protected: + // TODO: Change uint8_t to appropriate type when FMD_COUNT reaches 256. + void Set(uint8_t type, string const & value) { - protected: - void Set(uint8_t type, string const & value) + auto found = m_metadata.find(type); + if (found == m_metadata.end()) { - auto found = m_metadata.find(type); - if (found == m_metadata.end()) - { - if (!value.empty()) - m_metadata[type] = value; - } - else - { - if (value.empty()) - m_metadata.erase(found); - else - found->second = value; - } + if (!value.empty()) + m_metadata[type] = value; } - - public: - string Get(uint8_t type) const + else { - auto it = m_metadata.find(type); - return (it == m_metadata.end()) ? string() : it->second; + if (value.empty()) + m_metadata.erase(found); + else + found->second = value; } + } - vector<uint8_t> GetPresentTypes() const - { - vector<uint8_t> types; - types.reserve(m_metadata.size()); +public: + string Get(uint8_t type) const + { + auto it = m_metadata.find(type); + return (it == m_metadata.end()) ? string() : it->second; + } - for (auto const & item : m_metadata) - types.push_back(item.first); + vector<uint8_t> GetPresentTypes() const + { + vector<uint8_t> types; + types.reserve(m_metadata.size()); - return types; - } + for (auto const & item : m_metadata) + types.push_back(item.first); - inline bool Empty() const { return m_metadata.empty(); } - inline size_t Size() const { return m_metadata.size(); } + return types; + } - template <class TSink> void Serialize(TSink & sink) const - { - uint8_t const sz = m_metadata.size(); - WriteToSink(sink, sz); - for (auto const & it : m_metadata) - { - WriteToSink(sink, static_cast<uint8_t>(it.first)); - utils::WriteString(sink, it.second); - } - } + inline bool Empty() const { return m_metadata.empty(); } + inline size_t Size() const { return m_metadata.size(); } - template <class TSource> void Deserialize(TSource & src) + template <class TSink> + void Serialize(TSink & sink) const + { + auto const sz = static_cast<uint32_t>(m_metadata.size()); + WriteVarUint(sink, sz); + for (auto const & it : m_metadata) { - uint8_t const sz = ReadPrimitiveFromSource<uint8_t>(src); - for (size_t i = 0; i < sz; ++i) - { - uint8_t const key = ReadPrimitiveFromSource<uint8_t>(src); - string value; - utils::ReadString(src, value); - m_metadata[key].swap(value); - } + WriteVarUint(sink, static_cast<uint32_t>(it.first)); + utils::WriteString(sink, it.second); } + } - protected: - map<uint8_t, string> m_metadata; - }; - - class Metadata : public MetadataBase + template <class TSource> + void Deserialize(TSource & src) { - public: - /// @note! Do not change values here. - /// Add new types to the end of list, before FMD_COUNT. - enum EType - { - FMD_CUISINE = 1, - FMD_OPEN_HOURS = 2, - FMD_PHONE_NUMBER = 3, - FMD_FAX_NUMBER = 4, - FMD_STARS = 5, - FMD_OPERATOR = 6, - FMD_URL = 7, - FMD_WEBSITE = 8, - FMD_INTERNET = 9, - FMD_ELE = 10, - FMD_TURN_LANES = 11, - FMD_TURN_LANES_FORWARD = 12, - FMD_TURN_LANES_BACKWARD = 13, - FMD_EMAIL = 14, - FMD_POSTCODE = 15, - FMD_WIKIPEDIA = 16, - FMD_MAXSPEED = 17, - FMD_FLATS = 18, - FMD_HEIGHT = 19, - FMD_MIN_HEIGHT = 20, - FMD_DENOMINATION = 21, - FMD_COUNT - }; - - static_assert(FMD_COUNT <= 255, "Meta types count is limited to one byte."); - - void Set(EType type, string const & value) + auto const sz = ReadVarUint<uint32_t>(src); + for (size_t i = 0; i < sz; ++i) { - MetadataBase::Set(type, value); + auto const key = ReadVarUint<uint32_t>(src); + utils::ReadString(src, m_metadata[key]); } + } - void Drop(EType type) { Set(type, string()); } +protected: + map<uint8_t, string> m_metadata; +}; - string GetWikiURL() const; +class Metadata : public MetadataBase +{ +public: + /// @note! Do not change values here. + /// Add new types to the end of list, before FMD_COUNT. + enum EType + { + FMD_CUISINE = 1, + FMD_OPEN_HOURS = 2, + FMD_PHONE_NUMBER = 3, + FMD_FAX_NUMBER = 4, + FMD_STARS = 5, + FMD_OPERATOR = 6, + FMD_URL = 7, + FMD_WEBSITE = 8, + FMD_INTERNET = 9, + FMD_ELE = 10, + FMD_TURN_LANES = 11, + FMD_TURN_LANES_FORWARD = 12, + FMD_TURN_LANES_BACKWARD = 13, + FMD_EMAIL = 14, + FMD_POSTCODE = 15, + FMD_WIKIPEDIA = 16, + FMD_MAXSPEED = 17, + FMD_FLATS = 18, + FMD_HEIGHT = 19, + FMD_MIN_HEIGHT = 20, + FMD_DENOMINATION = 21, + FMD_COUNT + }; - template <class TWriter> void SerializeToMWM(TWriter & writer) const + void Set(EType type, string const & value) + { + MetadataBase::Set(type, value); + } + + void Drop(EType type) { Set(type, string()); } + + string GetWikiURL() const; + + // TODO: Commented code below is now longer neded, but I leave it here + // as a hint to what is going on in DeserializeFromMWMv7OrLower. + // Please, remove it when DeserializeFromMWMv7OrLower is no longer neded. + // template <class TWriter> + // void SerializeToMWM(TWriter & writer) const + // { + // for (auto const & e : m_metadata) + // { + // // Set high bit if it's the last element. + // uint8_t const mark = (&e == &(*m_metadata.crbegin()) ? 0x80 : 0); + // uint8_t elem[2] = {static_cast<uint8_t>(e.first | mark), + // static_cast<uint8_t>(min(e.second.size(), (size_t)kMaxStringLength))}; + // writer.Write(elem, sizeof(elem)); + // writer.Write(e.second.data(), elem[1]); + // } + // } + + template <class TSource> + void DeserializeFromMWMv7OrLower(TSource & src) + { + uint8_t header[2] = {0}; + char buffer[kMaxStringLength] = {0}; + do { - for (auto const & e : m_metadata) - { - // Set high bit if it's the last element. - uint8_t const mark = (&e == &(*m_metadata.crbegin()) ? 0x80 : 0); - uint8_t elem[2] = {static_cast<uint8_t>(e.first | mark), - static_cast<uint8_t>(min(e.second.size(), (size_t)kMaxStringLength))}; - writer.Write(elem, sizeof(elem)); - writer.Write(e.second.data(), elem[1]); - } - } + src.Read(header, sizeof(header)); + src.Read(buffer, header[1]); + m_metadata[header[0] & 0x7F].assign(buffer, header[1]); + } while (!(header[0] & 0x80)); + } - template <class TSource> void DeserializeFromMWM(TSource & src) - { - uint8_t header[2] = {0}; - char buffer[kMaxStringLength] = {0}; - do - { - src.Read(header, sizeof(header)); - src.Read(buffer, header[1]); - m_metadata[header[0] & 0x7F].assign(buffer, header[1]); - } while (!(header[0] & 0x80)); - } +private: + enum { kMaxStringLength = 255 }; +}; - private: - enum { kMaxStringLength = 255 }; - }; +class AddressData : public MetadataBase +{ +public: + enum Type { PLACE, STREET, POSTCODE }; - class AddressData : public MetadataBase + void Add(Type type, string const & s) { - public: - enum Type { PLACE, STREET, POSTCODE }; - - void Add(Type type, string const & s) - { - /// @todo Probably, we need to add separator here and store multiple values. - MetadataBase::Set(type, s); - } - }; + /// @todo Probably, we need to add separator here and store multiple values. + MetadataBase::Set(type, s); + } +}; } |