From 9b695237032e0b705fdd6741efc8b55b90dec570 Mon Sep 17 00:00:00 2001 From: Vladimir Byko-Ianko Date: Tue, 31 Oct 2017 09:40:40 +0300 Subject: Implementation serializer and deserializer for transit section header with keeping fix size numbers. --- generator/transit_generator.cpp | 5 +-- routing/transit_graph_loader.cpp | 3 +- .../routing_common_tests/transit_test.cpp | 21 +++++++++--- routing_common/transit_serdes.hpp | 38 ++++++++++++++++++++-- routing_common/transit_types.hpp | 22 +++++++------ 5 files changed, 70 insertions(+), 19 deletions(-) diff --git a/generator/transit_generator.cpp b/generator/transit_generator.cpp index aa826dee02..aadab9fb9a 100644 --- a/generator/transit_generator.cpp +++ b/generator/transit_generator.cpp @@ -282,7 +282,8 @@ void BuildTransit(string const & mwmDir, string const & countryId, auto const startOffset = w.Pos(); Serializer serializer(w); - header.Visit(serializer); + FixSizeNumberSerializer numberSerializer(w); + header.Visit(numberSerializer); vector stops; DeserializeFromJson(root, "stops", mapping, stops); @@ -317,7 +318,7 @@ void BuildTransit(string const & mwmDir, string const & countryId, CHECK(header.IsValid(), (header)); auto const endOffset = w.Pos(); w.Seek(startOffset); - header.Visit(serializer); + header.Visit(numberSerializer); w.Seek(endOffset); LOG(LINFO, (TRANSIT_FILE_TAG, "section is ready. Header:", header)); } diff --git a/routing/transit_graph_loader.cpp b/routing/transit_graph_loader.cpp index a594e7b0b7..96552e1a02 100644 --- a/routing/transit_graph_loader.cpp +++ b/routing/transit_graph_loader.cpp @@ -59,9 +59,10 @@ unique_ptr TransitGraphLoader::CreateTransitGraph(NumMwmId numMwmI FilesContainerR::TReader reader(mwmValue.m_cont.GetReader(TRANSIT_FILE_TAG)); ReaderSource src(reader); transit::Deserializer> deserializer(src); + transit::FixSizeNumberDeserializer> numberDeserializer(src); transit::TransitHeader header; - header.Visit(deserializer); + header.Visit(numberDeserializer); vector stops; deserializer(stops); diff --git a/routing_common/routing_common_tests/transit_test.cpp b/routing_common/routing_common_tests/transit_test.cpp index 2aec35460c..8e258b5c65 100644 --- a/routing_common/routing_common_tests/transit_test.cpp +++ b/routing_common/routing_common_tests/transit_test.cpp @@ -17,23 +17,36 @@ namespace routing { namespace transit { -template -void TestSerialization(Obj const &obj) +template +void TestCommonSerialization(Obj const & obj) { vector buffer; MemWriter> writer(buffer); - Serializer>> serializer(writer); + S serializer(writer); obj.Visit(serializer); MemReader reader(buffer.data(), buffer.size()); ReaderSource src(reader); Obj deserializedObj; - Deserializer> deserializer(src); + D deserializer(src); deserializedObj.Visit(deserializer); TEST(obj.IsEqualForTesting(deserializedObj), (obj, deserializedObj)); } + +void TestSerialization(TransitHeader const & header) +{ + TestCommonSerialization>>, + FixSizeNumberDeserializer>>(header); +} + +template +void TestSerialization(Obj const & obj) +{ + TestCommonSerialization>>, + Deserializer>>(obj); +} } // namespace transit } // namespace routing diff --git a/routing_common/transit_serdes.hpp b/routing_common/transit_serdes.hpp index 158dc3e710..05772d27fc 100644 --- a/routing_common/transit_serdes.hpp +++ b/routing_common/transit_serdes.hpp @@ -38,7 +38,7 @@ template class Serializer { public: - Serializer(Sink & sink) : m_sink(sink) {} + explicit Serializer(Sink & sink) : m_sink(sink) {} template typename std::enable_if<(std::is_integral::value || std::is_enum::value) && @@ -128,7 +128,7 @@ template class Deserializer { public: - Deserializer(Source & source) : m_source(source) {} + explicit Deserializer(Source & source) : m_source(source) {} template typename std::enable_if<(std::is_integral::value || std::is_enum::value) && @@ -216,6 +216,40 @@ public: t.Visit(*this); } +private: + Source & m_source; +}; + +template +class FixSizeNumberSerializer +{ +public: + explicit FixSizeNumberSerializer(Sink & sink) : m_sink(sink) {} + + template + typename enable_if::value || is_enum::value, void>::type operator()( + T const & t, char const * /* name */ = nullptr) + { + WriteToSink(m_sink, t); + } + +private: + Sink & m_sink; +}; + +template +class FixSizeNumberDeserializer +{ +public: + explicit FixSizeNumberDeserializer(Source & source) : m_source(source) {} + + template + typename enable_if::value || is_enum::value, void>::type operator()( + T & t, char const * name = nullptr) + { + ReadPrimitiveFromSource(m_source, t); + } + private: Source & m_source; }; diff --git a/routing_common/transit_types.hpp b/routing_common/transit_types.hpp index 3891563b60..395da67b9e 100644 --- a/routing_common/transit_types.hpp +++ b/routing_common/transit_types.hpp @@ -37,16 +37,18 @@ TransferId constexpr kInvalidTransferId = std::numeric_limits::max() // To convert double to uint32_t at better accuracy |kInvalidWeight| should be close to real weight. Weight constexpr kInvalidWeight = -1.0; -#define DECLARE_TRANSIT_TYPE_FRIENDS \ - template friend class Serializer; \ - template friend class Deserializer; \ - friend class DeserializerFromJson; \ - friend class routing::TransitGraphLoader; \ - friend void BuildTransit(std::string const & mwmDir, \ - std::string const & countryId, \ - std::string const & osmIdsToFeatureIdPath, \ - std::string const & transitDir); \ - template friend void TestSerialization(Obj const & obj); \ +#define DECLARE_TRANSIT_TYPE_FRIENDS \ + template \ + friend class Serializer; \ + template \ + friend class Deserializer; \ + friend class DeserializerFromJson; \ + friend class routing::TransitGraphLoader; \ + friend void BuildTransit(std::string const & mwmDir, std::string const & countryId, \ + std::string const & osmIdsToFeatureIdPath, \ + std::string const & transitDir); \ + template \ + void friend TestCommonSerialization(Obj const & obj); \ struct TransitHeader { -- cgit v1.2.3