diff options
author | vng <viktor.govako@gmail.com> | 2011-05-06 20:51:46 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:17:02 +0300 |
commit | 76ddd0f420696cd3c1b1925b272d192ec7545ca4 (patch) | |
tree | e07bc3c9747f488042fa7592a543d9a9b7e56f3b /coding/value_opt_string.hpp | |
parent | 0e8efdd5574b2b365af5309d02858efb31e2cbdf (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.hpp | 64 |
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); + } + } +}; |