Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Magidovich <mgsergio@mapswithme.com>2016-01-13 16:56:27 +0300
committerSergey Yershov <yershov@corp.mail.ru>2016-03-23 16:03:33 +0300
commit30fd14a94c67d39c3b9fc04056d2bbbafae40ba3 (patch)
tree4f64fe3d391b38451556bd234d559debe4034e5c /indexer/feature_meta.hpp
parent7da95d1f1cafd4945c2e3b8f38a6d3e8ea5c6250 (diff)
Allow more than 255 bytes in metadata fields.
Diffstat (limited to 'indexer/feature_meta.hpp')
-rw-r--r--indexer/feature_meta.hpp254
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);
+ }
+};
}