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
path: root/coding
diff options
context:
space:
mode:
authorMaxim Pimenov <m@maps.me>2015-10-30 19:43:07 +0300
committerSergey Yershov <yershov@corp.mail.ru>2016-03-23 16:02:37 +0300
commit907cb3786b0d10e2fcf44c906ee4c8625f41630b (patch)
tree61c7389d698413f34f91a842567bf05762a7213b /coding
parent0d5f7c4de8d3f499cdb96a5446a5d441877199ce (diff)
Review fixes.
Diffstat (limited to 'coding')
-rw-r--r--coding/coding_tests/trie_test.cpp80
-rw-r--r--coding/trie_reader.hpp2
2 files changed, 23 insertions, 59 deletions
diff --git a/coding/coding_tests/trie_test.cpp b/coding/coding_tests/trie_test.cpp
index 8ef2f3cc3e..890e6bdaff 100644
--- a/coding/coding_tests/trie_test.cpp
+++ b/coding/coding_tests/trie_test.cpp
@@ -17,7 +17,6 @@
namespace
{
-
struct ChildNodeInfo
{
bool m_isLeaf;
@@ -92,73 +91,32 @@ struct KeyValuePairBackInserter
vector<KeyValuePair> m_v;
};
-struct MaxValueCalc
-{
- using ValueType = uint8_t;
-
- ValueType operator() (void const * p, uint32_t size) const
- {
- ASSERT_EQUAL(size, 4, ());
- uint32_t value;
- memcpy(&value, p, 4);
- ASSERT_LESS(value, 256, ());
- return static_cast<uint8_t>(value);
- }
-};
-
-// The ValueList and SingleValueSerializer classes are similar to
+// The SingleValueSerializer and ValueList classes are similar to
// those in indexer/string_file_values.hpp but that file
// is not included to avoid coding_tests's dependency from indexer.
-class SingleValueSerializerChar
+template <typename TPrimitive>
+class SingleValueSerializer
{
public:
- template <typename TWriter>
- void Serialize(TWriter & writer, char const & v) const
- {
- WriteToSink(writer, v);
- }
-};
+ static_assert(is_trivially_copyable<TPrimitive>::value, "");
-class SingleValueSerializerUint32
-{
-public:
template <typename TWriter>
- void Serialize(TWriter & writer, uint32_t const & v) const
+ void Serialize(TWriter & writer, TPrimitive const & v) const
{
WriteToSink(writer, v);
}
};
-class ValueListChar
+template <typename TPrimitive>
+class ValueList
{
public:
- using TValue = char;
-
- ValueListChar(const string & s) : m_string(s) {}
+ using TValue = TPrimitive;
+ using TSerializer = SingleValueSerializer<TValue>;
- void Init(vector<TValue> const &) {}
+ static_assert(is_trivially_copyable<TPrimitive>::value, "");
- size_t Size() const { return m_string.size(); }
-
- bool IsEmpty() const { return m_string.empty(); }
-
- template <typename TSink, typename TSerializer>
- void Serialize(TSink & sink, TSerializer const & /* serializer */) const
- {
- sink.Write(m_string.data(), m_string.size());
- }
-
-private:
- string m_string;
-};
-
-class ValueListUint32
-{
-public:
- using TValue = uint32_t;
- using TSerializer = SingleValueSerializerUint32;
-
- ValueListUint32() = default;
+ ValueList() = default;
void Init(vector<TValue> const & values) { m_values = values; }
@@ -176,6 +134,11 @@ public:
template <typename TSource>
void Deserialize(TSource & src, uint32_t valueCount, TSerializer const & /* serializer */)
{
+ if (valueCount == 0)
+ {
+ Deserialize(src, TSerializer());
+ return;
+ }
m_values.resize(valueCount);
for (size_t i = 0; i < valueCount; ++i)
m_values[i] = ReadPrimitiveFromSource<TValue>(src);
@@ -215,8 +178,9 @@ UNIT_TEST(TrieBuilder_WriteNode_Smoke)
"abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij"),
ChildNodeInfo(true, 5, "a")};
- ValueListChar valueList("123");
- trie::WriteNode(sink, SingleValueSerializerChar(), 0, valueList, &children[0],
+ ValueList<char> valueList;
+ valueList.Init({'1', '2', '3'});
+ trie::WriteNode(sink, SingleValueSerializer<char>(), 0, valueList, &children[0],
&children[0] + ARRAY_SIZE(children));
uint8_t const expected [] =
{
@@ -282,13 +246,13 @@ UNIT_TEST(TrieBuilder_Build)
vector<uint8_t> buf;
PushBackByteSink<vector<uint8_t>> sink(buf);
- SingleValueSerializerUint32 serializer;
+ SingleValueSerializer<uint32_t> serializer;
trie::Build<PushBackByteSink<vector<uint8_t>>, typename vector<KeyValuePair>::iterator,
- ValueListUint32>(sink, serializer, v.begin(), v.end());
+ ValueList<uint32_t>>(sink, serializer, v.begin(), v.end());
reverse(buf.begin(), buf.end());
MemReader memReader = MemReader(&buf[0], buf.size());
- auto const root = trie::ReadTrie<MemReader, ValueListUint32>(memReader, serializer);
+ auto const root = trie::ReadTrie<MemReader, ValueList<uint32_t>>(memReader, serializer);
vector<KeyValuePair> res;
KeyValuePairBackInserter f;
trie::ForEachRef(*root, f, vector<trie::TrieChar>());
diff --git a/coding/trie_reader.hpp b/coding/trie_reader.hpp
index 4546e916fe..2b4c651762 100644
--- a/coding/trie_reader.hpp
+++ b/coding/trie_reader.hpp
@@ -21,7 +21,7 @@ public:
{
ReaderSource<TReader> src(reader);
if (src.Size() > 0)
- m_valueList.Deserialize(src, 1 /* valueCount */, serializer);
+ m_valueList.Deserialize(src, 0 /* valueCount */, serializer);
ASSERT_EQUAL(src.Size(), 0, ());
}