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:
authorvng <viktor.govako@gmail.com>2011-05-06 20:51:46 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:17:02 +0300
commit76ddd0f420696cd3c1b1925b272d192ec7545ca4 (patch)
treee07bc3c9747f488042fa7592a543d9a9b7e56f3b /coding/value_opt_string.hpp
parent0e8efdd5574b2b365af5309d02858efb31e2cbdf (diff)
Add string that optimized for integer positive values serialization.
Diffstat (limited to 'coding/value_opt_string.hpp')
-rw-r--r--coding/value_opt_string.hpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/coding/value_opt_string.hpp b/coding/value_opt_string.hpp
new file mode 100644
index 0000000000..7bbdf5cd24
--- /dev/null
+++ b/coding/value_opt_string.hpp
@@ -0,0 +1,64 @@
+#pragma once
+
+#include "varint.hpp"
+
+#include "../base/string_utils.hpp"
+#include "../base/assert.hpp"
+
+#include "../std/string.hpp"
+
+
+class StringNumericOptimal
+{
+ string m_s;
+
+ static const uint8_t numeric_bit = 1;
+
+public:
+ inline void Set(string const & s)
+ {
+ CHECK ( !s.empty(), () );
+ m_s = s;
+ }
+ inline void Set(char const * p)
+ {
+ m_s = p;
+ CHECK ( !m_s.empty(), () );
+ }
+ template <class T> void Set(T const & s)
+ {
+ m_s = utils::to_string(s);
+ CHECK ( !m_s.empty(), () );
+ }
+
+ inline string Get() const { return m_s; }
+
+ template <class TSink> void Write(TSink & sink)
+ {
+ int n;
+ if (utils::to_int(m_s, n) && n >= 0)
+ WriteVarUint(sink, static_cast<uint32_t>((n << 1) | numeric_bit));
+ else
+ {
+ size_t const sz = m_s.size();
+ ASSERT_GREATER ( sz, 0, () );
+
+ WriteVarUint(sink, static_cast<uint32_t>((sz-1) << 1));
+ sink.Write(m_s.c_str(), sz);
+ }
+ }
+
+ template <class TSource> void Read(TSource & src)
+ {
+ uint32_t sz = ReadVarUint<uint32_t>(src);
+
+ if ((sz & numeric_bit) != 0)
+ m_s = utils::to_string(sz >> 1);
+ else
+ {
+ sz = (sz >> 1) + 1;
+ m_s.resize(sz);
+ src.Read(&m_s[0], sz);
+ }
+ }
+};