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:
authorVladimir Byko-Ianko <v.bykoianko@corp.mail.ru>2017-10-31 09:40:40 +0300
committerDaria Volvenkova <d.volvenkova@corp.mail.ru>2017-10-31 17:49:30 +0300
commit9b695237032e0b705fdd6741efc8b55b90dec570 (patch)
tree552efbf730041f922f26f9e7bae73592c9b414bf
parenta1f0d166338770f1d3febeba88fa361e9acc98f6 (diff)
Implementation serializer and deserializer for transit section header with keeping fix size numbers.
-rw-r--r--generator/transit_generator.cpp5
-rw-r--r--routing/transit_graph_loader.cpp3
-rw-r--r--routing_common/routing_common_tests/transit_test.cpp21
-rw-r--r--routing_common/transit_serdes.hpp38
-rw-r--r--routing_common/transit_types.hpp22
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<FileWriter> serializer(w);
- header.Visit(serializer);
+ FixSizeNumberSerializer<FileWriter> numberSerializer(w);
+ header.Visit(numberSerializer);
vector<Stop> 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<TransitGraph> TransitGraphLoader::CreateTransitGraph(NumMwmId numMwmI
FilesContainerR::TReader reader(mwmValue.m_cont.GetReader(TRANSIT_FILE_TAG));
ReaderSource<FilesContainerR::TReader> src(reader);
transit::Deserializer<ReaderSource<FilesContainerR::TReader>> deserializer(src);
+ transit::FixSizeNumberDeserializer<ReaderSource<FilesContainerR::TReader>> numberDeserializer(src);
transit::TransitHeader header;
- header.Visit(deserializer);
+ header.Visit(numberDeserializer);
vector<transit::Stop> 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<class Obj>
-void TestSerialization(Obj const &obj)
+template<class S, class D, class Obj>
+void TestCommonSerialization(Obj const & obj)
{
vector<uint8_t> buffer;
MemWriter<vector<uint8_t>> writer(buffer);
- Serializer<MemWriter<vector<uint8_t>>> serializer(writer);
+ S serializer(writer);
obj.Visit(serializer);
MemReader reader(buffer.data(), buffer.size());
ReaderSource<MemReader> src(reader);
Obj deserializedObj;
- Deserializer<ReaderSource<MemReader>> deserializer(src);
+ D deserializer(src);
deserializedObj.Visit(deserializer);
TEST(obj.IsEqualForTesting(deserializedObj), (obj, deserializedObj));
}
+
+void TestSerialization(TransitHeader const & header)
+{
+ TestCommonSerialization<FixSizeNumberSerializer<MemWriter<vector<uint8_t>>>,
+ FixSizeNumberDeserializer<ReaderSource<MemReader>>>(header);
+}
+
+template<class Obj>
+void TestSerialization(Obj const & obj)
+{
+ TestCommonSerialization<Serializer<MemWriter<vector<uint8_t>>>,
+ Deserializer<ReaderSource<MemReader>>>(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 <typename Sink>
class Serializer
{
public:
- Serializer(Sink & sink) : m_sink(sink) {}
+ explicit Serializer(Sink & sink) : m_sink(sink) {}
template <typename T>
typename std::enable_if<(std::is_integral<T>::value || std::is_enum<T>::value) &&
@@ -128,7 +128,7 @@ template <typename Source>
class Deserializer
{
public:
- Deserializer(Source & source) : m_source(source) {}
+ explicit Deserializer(Source & source) : m_source(source) {}
template <typename T>
typename std::enable_if<(std::is_integral<T>::value || std::is_enum<T>::value) &&
@@ -219,5 +219,39 @@ public:
private:
Source & m_source;
};
+
+template <typename Sink>
+class FixSizeNumberSerializer
+{
+public:
+ explicit FixSizeNumberSerializer(Sink & sink) : m_sink(sink) {}
+
+ template <typename T>
+ typename enable_if<is_integral<T>::value || is_enum<T>::value, void>::type operator()(
+ T const & t, char const * /* name */ = nullptr)
+ {
+ WriteToSink(m_sink, t);
+ }
+
+private:
+ Sink & m_sink;
+};
+
+template <typename Source>
+class FixSizeNumberDeserializer
+{
+public:
+ explicit FixSizeNumberDeserializer(Source & source) : m_source(source) {}
+
+ template <typename T>
+ typename enable_if<is_integral<T>::value || is_enum<T>::value, void>::type operator()(
+ T & t, char const * name = nullptr)
+ {
+ ReadPrimitiveFromSource(m_source, t);
+ }
+
+private:
+ Source & m_source;
+};
} // namespace transit
} // namespace routing
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<TransferId>::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<class Sink> friend class Serializer; \
- template<class Source> 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<class Obj> friend void TestSerialization(Obj const & obj); \
+#define DECLARE_TRANSIT_TYPE_FRIENDS \
+ template <class Sink> \
+ friend class Serializer; \
+ template <class Source> \
+ 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 <class Ser, class Deser, class Obj> \
+ void friend TestCommonSerialization(Obj const & obj); \
struct TransitHeader
{