Home | History | Annotate | Download | only in strings
      1 /* Copyright 2015 The TensorFlow Authors. All Rights Reserved.
      2 
      3 Licensed under the Apache License, Version 2.0 (the "License");
      4 you may not use this file except in compliance with the License.
      5 You may obtain a copy of the License at
      6 
      7     http://www.apache.org/licenses/LICENSE-2.0
      8 
      9 Unless required by applicable law or agreed to in writing, software
     10 distributed under the License is distributed on an "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 See the License for the specific language governing permissions and
     13 limitations under the License.
     14 ==============================================================================*/
     15 
     16 #include "tensorflow/core/lib/strings/ordered_code.h"
     17 
     18 #include <float.h>
     19 #include <stddef.h>
     20 #include <limits>
     21 #include <vector>
     22 
     23 #include "tensorflow/core/lib/core/stringpiece.h"
     24 #include "tensorflow/core/lib/random/simple_philox.h"
     25 #include "tensorflow/core/platform/logging.h"
     26 #include "tensorflow/core/platform/test.h"
     27 #include "tensorflow/core/platform/test_benchmark.h"
     28 #include "tensorflow/core/platform/types.h"
     29 
     30 namespace tensorflow {
     31 namespace strings {
     32 namespace {
     33 
     34 string RandomString(random::SimplePhilox* rnd, size_t len) {
     35   string x;
     36   for (size_t i = 0; i < len; i++) {
     37     x += rnd->Uniform(256);
     38   }
     39   return x;
     40 }
     41 
     42 // ---------------------------------------------------------------------
     43 // Utility template functions (they help templatize the tests below)
     44 
     45 // Read/WriteIncreasing are defined for string, uint64, int64 below.
     46 template <typename T>
     47 void OCWriteIncreasing(string* dest, const T& val);
     48 template <typename T>
     49 bool OCReadIncreasing(StringPiece* src, T* result);
     50 
     51 // Read/WriteIncreasing<string>
     52 template <>
     53 void OCWriteIncreasing<string>(string* dest, const string& val) {
     54   OrderedCode::WriteString(dest, val);
     55 }
     56 template <>
     57 bool OCReadIncreasing<string>(StringPiece* src, string* result) {
     58   return OrderedCode::ReadString(src, result);
     59 }
     60 
     61 // Read/WriteIncreasing<uint64>
     62 template <>
     63 void OCWriteIncreasing<uint64>(string* dest, const uint64& val) {
     64   OrderedCode::WriteNumIncreasing(dest, val);
     65 }
     66 template <>
     67 bool OCReadIncreasing<uint64>(StringPiece* src, uint64* result) {
     68   return OrderedCode::ReadNumIncreasing(src, result);
     69 }
     70 
     71 // Read/WriteIncreasing<int64>
     72 template <>
     73 void OCWriteIncreasing<int64>(string* dest, const int64& val) {
     74   OrderedCode::WriteSignedNumIncreasing(dest, val);
     75 }
     76 template <>
     77 bool OCReadIncreasing<int64>(StringPiece* src, int64* result) {
     78   return OrderedCode::ReadSignedNumIncreasing(src, result);
     79 }
     80 
     81 template <typename T>
     82 string OCWrite(T val) {
     83   string result;
     84   OCWriteIncreasing<T>(&result, val);
     85   return result;
     86 }
     87 
     88 template <typename T>
     89 void OCWriteToString(string* result, T val) {
     90   OCWriteIncreasing<T>(result, val);
     91 }
     92 
     93 template <typename T>
     94 bool OCRead(StringPiece* s, T* val) {
     95   return OCReadIncreasing<T>(s, val);
     96 }
     97 
     98 // ---------------------------------------------------------------------
     99 // Numbers
    100 
    101 template <typename T>
    102 T TestRead(const string& a) {
    103   // gracefully reject any proper prefix of an encoding
    104   for (int i = 0; i < a.size() - 1; ++i) {
    105     StringPiece s(a.data(), i);
    106     CHECK(!OCRead<T>(&s, nullptr));
    107     CHECK_EQ(s, a.substr(0, i));
    108   }
    109 
    110   StringPiece s(a);
    111   T v;
    112   CHECK(OCRead<T>(&s, &v));
    113   CHECK(s.empty());
    114   return v;
    115 }
    116 
    117 template <typename T>
    118 void TestWriteRead(T expected) {
    119   EXPECT_EQ(expected, TestRead<T>(OCWrite<T>(expected)));
    120 }
    121 
    122 // Verifies that the second Write* call appends a non-empty string to its
    123 // output.
    124 template <typename T, typename U>
    125 void TestWriteAppends(T first, U second) {
    126   string encoded;
    127   OCWriteToString<T>(&encoded, first);
    128   string encoded_first_only = encoded;
    129   OCWriteToString<U>(&encoded, second);
    130   EXPECT_NE(encoded, encoded_first_only);
    131   EXPECT_TRUE(StringPiece(encoded).starts_with(encoded_first_only));
    132 }
    133 
    134 template <typename T>
    135 void TestNumbers(T multiplier) {
    136   // first test powers of 2 (and nearby numbers)
    137   for (T x = std::numeric_limits<T>().max(); x != 0; x /= 2) {
    138     TestWriteRead(multiplier * (x - 1));
    139     TestWriteRead(multiplier * x);
    140     if (x != std::numeric_limits<T>::max()) {
    141       TestWriteRead(multiplier * (x + 1));
    142     } else if (multiplier < 0 && multiplier == -1) {
    143       TestWriteRead(-x - 1);
    144     }
    145   }
    146 
    147   random::PhiloxRandom philox(301, 17);
    148   random::SimplePhilox rnd(&philox);
    149   for (int bits = 1; bits <= std::numeric_limits<T>().digits; ++bits) {
    150     // test random non-negative numbers with given number of significant bits
    151     const uint64 mask = (~0ULL) >> (64 - bits);
    152     for (int i = 0; i < 1000; i++) {
    153       T x = rnd.Rand64() & mask;
    154       TestWriteRead(multiplier * x);
    155       T y = rnd.Rand64() & mask;
    156       TestWriteAppends(multiplier * x, multiplier * y);
    157     }
    158   }
    159 }
    160 
    161 // Return true iff 'a' is "before" 'b'
    162 bool CompareStrings(const string& a, const string& b) { return (a < b); }
    163 
    164 template <typename T>
    165 void TestNumberOrdering() {
    166   // first the negative numbers (if T is signed, otherwise no-op)
    167   string laststr = OCWrite<T>(std::numeric_limits<T>().min());
    168   for (T num = std::numeric_limits<T>().min() / 2; num != 0; num /= 2) {
    169     string strminus1 = OCWrite<T>(num - 1);
    170     string str = OCWrite<T>(num);
    171     string strplus1 = OCWrite<T>(num + 1);
    172 
    173     CHECK(CompareStrings(strminus1, str));
    174     CHECK(CompareStrings(str, strplus1));
    175 
    176     // Compare 'str' with 'laststr'.  When we approach 0, 'laststr' is
    177     // not necessarily before 'strminus1'.
    178     CHECK(CompareStrings(laststr, str));
    179     laststr = str;
    180   }
    181 
    182   // then the positive numbers
    183   laststr = OCWrite<T>(0);
    184   T num = 1;
    185   while (num < std::numeric_limits<T>().max() / 2) {
    186     num *= 2;
    187     string strminus1 = OCWrite<T>(num - 1);
    188     string str = OCWrite<T>(num);
    189     string strplus1 = OCWrite<T>(num + 1);
    190 
    191     CHECK(CompareStrings(strminus1, str));
    192     CHECK(CompareStrings(str, strplus1));
    193 
    194     // Compare 'str' with 'laststr'.
    195     CHECK(CompareStrings(laststr, str));
    196     laststr = str;
    197   }
    198 }
    199 
    200 // Helper routine for testing TEST_SkipToNextSpecialByte
    201 size_t FindSpecial(const string& x) {
    202   const char* p = x.data();
    203   const char* limit = p + x.size();
    204   const char* result = OrderedCode::TEST_SkipToNextSpecialByte(p, limit);
    205   return result - p;
    206 }
    207 
    208 // Helper function template to create strings from string literals (excluding
    209 // the terminal zero byte of the underlying character array).
    210 template <size_t N>
    211 string ByteSequence(const char (&arr)[N]) {
    212   return string(arr, N - 1);
    213 }
    214 
    215 TEST(OrderedCode, SkipToNextSpecialByte) {
    216   for (size_t len = 0; len < 256; len++) {
    217     random::PhiloxRandom philox(301, 17);
    218     random::SimplePhilox rnd(&philox);
    219     string x;
    220     while (x.size() < len) {
    221       char c = 1 + rnd.Uniform(254);
    222       ASSERT_NE(c, 0);
    223       ASSERT_NE(c, 255);
    224       x += c;  // No 0 bytes, no 255 bytes
    225     }
    226     EXPECT_EQ(FindSpecial(x), x.size());
    227     for (size_t special_pos = 0; special_pos < len; special_pos++) {
    228       for (size_t special_test = 0; special_test < 2; special_test++) {
    229         const char special_byte = (special_test == 0) ? 0 : 255;
    230         string y = x;
    231         y[special_pos] = special_byte;
    232         EXPECT_EQ(FindSpecial(y), special_pos);
    233         if (special_pos < 16) {
    234           // Add some special bytes after the one at special_pos to make sure
    235           // we still return the earliest special byte in the string
    236           for (size_t rest = special_pos + 1; rest < len; rest++) {
    237             if (rnd.OneIn(3)) {
    238               y[rest] = rnd.OneIn(2) ? 0 : 255;
    239               EXPECT_EQ(FindSpecial(y), special_pos);
    240             }
    241           }
    242         }
    243       }
    244     }
    245   }
    246 }
    247 
    248 TEST(OrderedCode, ExhaustiveFindSpecial) {
    249   char buf[16];
    250   char* limit = buf + sizeof(buf);
    251   int count = 0;
    252   for (int start_offset = 0; start_offset <= 5; start_offset += 5) {
    253     // We test exhaustively with all combinations of 3 bytes starting
    254     // at offset 0 and offset 5 (so as to test with the bytes at both
    255     // ends of a 64-bit word).
    256     for (size_t i = 0; i < sizeof(buf); i++) {
    257       buf[i] = 'a';  // Not a special byte
    258     }
    259     for (int b0 = 0; b0 < 256; b0++) {
    260       for (int b1 = 0; b1 < 256; b1++) {
    261         for (int b2 = 0; b2 < 256; b2++) {
    262           buf[start_offset + 0] = b0;
    263           buf[start_offset + 1] = b1;
    264           buf[start_offset + 2] = b2;
    265           char* expected;
    266           if (b0 == 0 || b0 == 255) {
    267             expected = &buf[start_offset];
    268           } else if (b1 == 0 || b1 == 255) {
    269             expected = &buf[start_offset + 1];
    270           } else if (b2 == 0 || b2 == 255) {
    271             expected = &buf[start_offset + 2];
    272           } else {
    273             expected = limit;
    274           }
    275           count++;
    276           EXPECT_EQ(expected,
    277                     OrderedCode::TEST_SkipToNextSpecialByte(buf, limit));
    278         }
    279       }
    280     }
    281   }
    282   EXPECT_EQ(count, 256 * 256 * 256 * 2);
    283 }
    284 
    285 TEST(Uint64, EncodeDecode) { TestNumbers<uint64>(1); }
    286 
    287 TEST(Uint64, Ordering) { TestNumberOrdering<uint64>(); }
    288 
    289 TEST(Int64, EncodeDecode) {
    290   TestNumbers<int64>(1);
    291   TestNumbers<int64>(-1);
    292 }
    293 
    294 TEST(Int64, Ordering) { TestNumberOrdering<int64>(); }
    295 
    296 // Returns the bitwise complement of s.
    297 inline string StrNot(const string& s) {
    298   string result;
    299   for (string::const_iterator it = s.begin(); it != s.end(); ++it)
    300     result.push_back(~*it);
    301   return result;
    302 }
    303 
    304 template <typename T>
    305 void TestInvalidEncoding(const string& s) {
    306   StringPiece p(s);
    307   EXPECT_FALSE(OCRead<T>(&p, nullptr));
    308   EXPECT_EQ(s, p);
    309 }
    310 
    311 TEST(OrderedCodeInvalidEncodingsTest, Overflow) {
    312   // 1U << 64, increasing and decreasing
    313   const string k2xx64U = "\x09\x01" + string(8, 0);
    314   TestInvalidEncoding<uint64>(k2xx64U);
    315 
    316   // 1 << 63 and ~(1 << 63), increasing and decreasing
    317   const string k2xx63 = "\xff\xc0\x80" + string(7, 0);
    318   TestInvalidEncoding<int64>(k2xx63);
    319   TestInvalidEncoding<int64>(StrNot(k2xx63));
    320 }
    321 
    322 TEST(OrderedCodeInvalidEncodingsDeathTest, NonCanonical) {
    323   // Test "ambiguous"/"non-canonical" encodings.
    324   // These are non-minimal (but otherwise "valid") encodings that
    325   // differ from the minimal encoding chosen by OrderedCode::WriteXXX
    326   // and thus should be avoided to not mess up the string ordering of
    327   // encodings.
    328 
    329   random::PhiloxRandom philox(301, 17);
    330   random::SimplePhilox rnd(&philox);
    331 
    332   for (int n = 2; n <= 9; ++n) {
    333     // The zero in non_minimal[1] is "redundant".
    334     string non_minimal =
    335         string(1, n - 1) + string(1, 0) + RandomString(&rnd, n - 2);
    336     EXPECT_EQ(n, non_minimal.length());
    337 
    338     EXPECT_NE(OCWrite<uint64>(0), non_minimal);
    339 #ifndef NDEBUG
    340     StringPiece s(non_minimal);
    341     EXPECT_DEATH(OrderedCode::ReadNumIncreasing(&s, nullptr),
    342                  "invalid encoding");
    343 #else
    344     TestRead<uint64>(non_minimal);
    345 #endif
    346   }
    347 
    348   for (int n = 2; n <= 10; ++n) {
    349     // Header with 1 sign bit and n-1 size bits.
    350     string header = string(n / 8, 0xff) + string(1, 0xff << (8 - (n % 8)));
    351     // There are more than 7 zero bits between header bits and "payload".
    352     string non_minimal = header +
    353                          string(1, rnd.Uniform(256) & ~*header.rbegin()) +
    354                          RandomString(&rnd, n - header.length() - 1);
    355     EXPECT_EQ(n, non_minimal.length());
    356 
    357     EXPECT_NE(OCWrite<int64>(0), non_minimal);
    358 #ifndef NDEBUG
    359     StringPiece s(non_minimal);
    360     EXPECT_DEATH(OrderedCode::ReadSignedNumIncreasing(&s, nullptr),
    361                  "invalid encoding")
    362         << n;
    363 #else
    364     TestRead<int64>(non_minimal);
    365 #endif
    366   }
    367 }
    368 
    369 // Returns random number with specified number of bits,
    370 // i.e., in the range [2^(bits-1),2^bits).
    371 uint64 NextBits(random::SimplePhilox* rnd, int bits) {
    372   return (bits != 0)
    373              ? (rnd->Rand64() % (1LL << (bits - 1))) + (1LL << (bits - 1))
    374              : 0;
    375 }
    376 
    377 template <typename T>
    378 void BM_WriteNum(int n, T multiplier) {
    379   constexpr int kValues = 64;
    380   T values[kValues];
    381   random::PhiloxRandom philox(301, 17);
    382   random::SimplePhilox rnd(&philox);
    383   // Use enough distinct values to confuse the branch predictor
    384   for (int i = 0; i < kValues; i++) {
    385     values[i] = NextBits(&rnd, n % 64) * multiplier;
    386   }
    387   string result;
    388   int index = 0;
    389   while (n-- > 0) {
    390     result.clear();
    391     OCWriteToString<T>(&result, values[index % kValues]);
    392     index++;
    393   }
    394 }
    395 
    396 template <typename T>
    397 void BM_ReadNum(int n, T multiplier) {
    398   string x;
    399   random::PhiloxRandom philox(301, 17);
    400   random::SimplePhilox rnd(&philox);
    401   // Use enough distinct values to confuse the branch predictor
    402   constexpr int kValues = 64;
    403   string values[kValues];
    404   for (int i = 0; i < kValues; i++) {
    405     T val = NextBits(&rnd, i % 64) * multiplier;
    406     values[i] = OCWrite<T>(val);
    407   }
    408   uint32 index = 0;
    409   while (n-- > 0) {
    410     T val;
    411     StringPiece s = values[index++ % kValues];
    412     OCRead<T>(&s, &val);
    413   }
    414 }
    415 
    416 #define BENCHMARK_NUM(name, T, multiplier)                      \
    417   void BM_Write##name(int n) { BM_WriteNum<T>(n, multiplier); } \
    418   BENCHMARK(BM_Write##name);                                    \
    419   void BM_Read##name(int n) { BM_ReadNum<T>(n, multiplier); }   \
    420   BENCHMARK(BM_Read##name)
    421 
    422 BENCHMARK_NUM(NumIncreasing, uint64, 1);
    423 BENCHMARK_NUM(SignedNum, int64, 1);
    424 BENCHMARK_NUM(SignedNumNegative, int64, -1);
    425 
    426 #undef BENCHMARK_NUM
    427 
    428 // ---------------------------------------------------------------------
    429 // Strings
    430 
    431 TEST(String, EncodeDecode) {
    432   random::PhiloxRandom philox(301, 17);
    433   random::SimplePhilox rnd(&philox);
    434 
    435   for (int len = 0; len < 256; len++) {
    436     const string a = RandomString(&rnd, len);
    437     TestWriteRead(a);
    438     for (int len2 = 0; len2 < 64; len2++) {
    439       const string b = RandomString(&rnd, len2);
    440 
    441       TestWriteAppends(a, b);
    442 
    443       string out;
    444       OCWriteToString<string>(&out, a);
    445       OCWriteToString<string>(&out, b);
    446 
    447       string a2, b2, dummy;
    448       StringPiece s = out;
    449       StringPiece s2 = out;
    450       CHECK(OCRead<string>(&s, &a2));
    451       CHECK(OCRead<string>(&s2, nullptr));
    452       CHECK_EQ(s, s2);
    453 
    454       CHECK(OCRead<string>(&s, &b2));
    455       CHECK(OCRead<string>(&s2, nullptr));
    456       CHECK_EQ(s, s2);
    457 
    458       CHECK(!OCRead<string>(&s, &dummy));
    459       CHECK(!OCRead<string>(&s2, nullptr));
    460       CHECK_EQ(a, a2);
    461       CHECK_EQ(b, b2);
    462       CHECK(s.empty());
    463       CHECK(s2.empty());
    464     }
    465   }
    466 }
    467 
    468 // 'str' is a string literal that may contain '\0'.
    469 #define STATIC_STR(str) StringPiece((str), sizeof(str) - 1)
    470 
    471 string EncodeStringIncreasing(StringPiece value) {
    472   string encoded;
    473   OrderedCode::WriteString(&encoded, value);
    474   return encoded;
    475 }
    476 
    477 TEST(String, Increasing) {
    478   // Here are a series of strings in non-decreasing order, including
    479   // consecutive strings such that the second one is equal to, a proper
    480   // prefix of, or has the same length as the first one.  Most also contain
    481   // the special escaping characters '\x00' and '\xff'.
    482   ASSERT_EQ(EncodeStringIncreasing(STATIC_STR("")),
    483             EncodeStringIncreasing(STATIC_STR("")));
    484 
    485   ASSERT_LT(EncodeStringIncreasing(STATIC_STR("")),
    486             EncodeStringIncreasing(STATIC_STR("\x00")));
    487 
    488   ASSERT_EQ(EncodeStringIncreasing(STATIC_STR("\x00")),
    489             EncodeStringIncreasing(STATIC_STR("\x00")));
    490 
    491   ASSERT_LT(EncodeStringIncreasing(STATIC_STR("\x00")),
    492             EncodeStringIncreasing(STATIC_STR("\x01")));
    493 
    494   ASSERT_LT(EncodeStringIncreasing(STATIC_STR("\x01")),
    495             EncodeStringIncreasing(STATIC_STR("a")));
    496 
    497   ASSERT_EQ(EncodeStringIncreasing(STATIC_STR("a")),
    498             EncodeStringIncreasing(STATIC_STR("a")));
    499 
    500   ASSERT_LT(EncodeStringIncreasing(STATIC_STR("a")),
    501             EncodeStringIncreasing(STATIC_STR("aa")));
    502 
    503   ASSERT_LT(EncodeStringIncreasing(STATIC_STR("aa")),
    504             EncodeStringIncreasing(STATIC_STR("\xff")));
    505 
    506   ASSERT_LT(EncodeStringIncreasing(STATIC_STR("\xff")),
    507             EncodeStringIncreasing(STATIC_STR("\xff\x00")));
    508 
    509   ASSERT_LT(EncodeStringIncreasing(STATIC_STR("\xff\x00")),
    510             EncodeStringIncreasing(STATIC_STR("\xff\x01")));
    511 }
    512 
    513 TEST(EncodingIsExpected, String) {
    514   std::vector<std::pair<string, string>> data = {
    515       {"", string("\x00\x01", 2)},
    516       {"foo", string("foo\x00\x01", 5)},
    517       {"hello", string("hello\x00\x01", 7)},
    518       {string("\x00\x01\xff", 3), string("\x00\xff\x01\xff\x00\x00\x01", 7)},
    519   };
    520   for (const auto& t : data) {
    521     string result;
    522     OrderedCode::WriteString(&result, t.first);
    523     EXPECT_EQ(t.second, result);
    524 
    525     StringPiece in = result;
    526     string decoded;
    527     EXPECT_TRUE(OrderedCode::ReadString(&in, &decoded));
    528     EXPECT_EQ(t.first, decoded);
    529     EXPECT_EQ("", in);
    530   }
    531 }
    532 
    533 TEST(EncodingIsExpected, Unsigned) {
    534   std::vector<std::pair<uint64, string>> data = {
    535       {0x0ull, ByteSequence("\000")},
    536       {0x1ull, ByteSequence("\001\001")},
    537       {0x2ull, ByteSequence("\001\002")},
    538       {0x1ull, ByteSequence("\001\001")},
    539       {0x2ull, ByteSequence("\001\002")},
    540       {0x3ull, ByteSequence("\001\003")},
    541       {0x3ull, ByteSequence("\001\003")},
    542       {0x4ull, ByteSequence("\001\004")},
    543       {0x5ull, ByteSequence("\001\005")},
    544       {0x7ull, ByteSequence("\001\007")},
    545       {0x8ull, ByteSequence("\001\010")},
    546       {0x9ull, ByteSequence("\001\t")},
    547       {0xfull, ByteSequence("\001\017")},
    548       {0x10ull, ByteSequence("\001\020")},
    549       {0x11ull, ByteSequence("\001\021")},
    550       {0x1full, ByteSequence("\001\037")},
    551       {0x20ull, ByteSequence("\001 ")},
    552       {0x21ull, ByteSequence("\001!")},
    553       {0x3full, ByteSequence("\001?")},
    554       {0x40ull, ByteSequence("\001@")},
    555       {0x41ull, ByteSequence("\001A")},
    556       {0x7full, ByteSequence("\001\177")},
    557       {0x80ull, ByteSequence("\001\200")},
    558       {0x81ull, ByteSequence("\001\201")},
    559       {0xffull, ByteSequence("\001\377")},
    560       {0x100ull, ByteSequence("\002\001\000")},
    561       {0x101ull, ByteSequence("\002\001\001")},
    562       {0x1ffull, ByteSequence("\002\001\377")},
    563       {0x200ull, ByteSequence("\002\002\000")},
    564       {0x201ull, ByteSequence("\002\002\001")},
    565       {0x3ffull, ByteSequence("\002\003\377")},
    566       {0x400ull, ByteSequence("\002\004\000")},
    567       {0x401ull, ByteSequence("\002\004\001")},
    568       {0x7ffull, ByteSequence("\002\007\377")},
    569       {0x800ull, ByteSequence("\002\010\000")},
    570       {0x801ull, ByteSequence("\002\010\001")},
    571       {0xfffull, ByteSequence("\002\017\377")},
    572       {0x1000ull, ByteSequence("\002\020\000")},
    573       {0x1001ull, ByteSequence("\002\020\001")},
    574       {0x1fffull, ByteSequence("\002\037\377")},
    575       {0x2000ull, ByteSequence("\002 \000")},
    576       {0x2001ull, ByteSequence("\002 \001")},
    577       {0x3fffull, ByteSequence("\002?\377")},
    578       {0x4000ull, ByteSequence("\002@\000")},
    579       {0x4001ull, ByteSequence("\002@\001")},
    580       {0x7fffull, ByteSequence("\002\177\377")},
    581       {0x8000ull, ByteSequence("\002\200\000")},
    582       {0x8001ull, ByteSequence("\002\200\001")},
    583       {0xffffull, ByteSequence("\002\377\377")},
    584       {0x10000ull, ByteSequence("\003\001\000\000")},
    585       {0x10001ull, ByteSequence("\003\001\000\001")},
    586       {0x1ffffull, ByteSequence("\003\001\377\377")},
    587       {0x20000ull, ByteSequence("\003\002\000\000")},
    588       {0x20001ull, ByteSequence("\003\002\000\001")},
    589       {0x3ffffull, ByteSequence("\003\003\377\377")},
    590       {0x40000ull, ByteSequence("\003\004\000\000")},
    591       {0x40001ull, ByteSequence("\003\004\000\001")},
    592       {0x7ffffull, ByteSequence("\003\007\377\377")},
    593       {0x80000ull, ByteSequence("\003\010\000\000")},
    594       {0x80001ull, ByteSequence("\003\010\000\001")},
    595       {0xfffffull, ByteSequence("\003\017\377\377")},
    596       {0x100000ull, ByteSequence("\003\020\000\000")},
    597       {0x100001ull, ByteSequence("\003\020\000\001")},
    598       {0x1fffffull, ByteSequence("\003\037\377\377")},
    599       {0x200000ull, ByteSequence("\003 \000\000")},
    600       {0x200001ull, ByteSequence("\003 \000\001")},
    601       {0x3fffffull, ByteSequence("\003?\377\377")},
    602       {0x400000ull, ByteSequence("\003@\000\000")},
    603       {0x400001ull, ByteSequence("\003@\000\001")},
    604       {0x7fffffull, ByteSequence("\003\177\377\377")},
    605       {0x800000ull, ByteSequence("\003\200\000\000")},
    606       {0x800001ull, ByteSequence("\003\200\000\001")},
    607       {0xffffffull, ByteSequence("\003\377\377\377")},
    608       {0x1000000ull, ByteSequence("\004\001\000\000\000")},
    609       {0x1000001ull, ByteSequence("\004\001\000\000\001")},
    610       {0x1ffffffull, ByteSequence("\004\001\377\377\377")},
    611       {0x2000000ull, ByteSequence("\004\002\000\000\000")},
    612       {0x2000001ull, ByteSequence("\004\002\000\000\001")},
    613       {0x3ffffffull, ByteSequence("\004\003\377\377\377")},
    614       {0x4000000ull, ByteSequence("\004\004\000\000\000")},
    615       {0x4000001ull, ByteSequence("\004\004\000\000\001")},
    616       {0x7ffffffull, ByteSequence("\004\007\377\377\377")},
    617       {0x8000000ull, ByteSequence("\004\010\000\000\000")},
    618       {0x8000001ull, ByteSequence("\004\010\000\000\001")},
    619       {0xfffffffull, ByteSequence("\004\017\377\377\377")},
    620       {0x10000000ull, ByteSequence("\004\020\000\000\000")},
    621       {0x10000001ull, ByteSequence("\004\020\000\000\001")},
    622       {0x1fffffffull, ByteSequence("\004\037\377\377\377")},
    623       {0x20000000ull, ByteSequence("\004 \000\000\000")},
    624       {0x20000001ull, ByteSequence("\004 \000\000\001")},
    625       {0x3fffffffull, ByteSequence("\004?\377\377\377")},
    626       {0x40000000ull, ByteSequence("\004@\000\000\000")},
    627       {0x40000001ull, ByteSequence("\004@\000\000\001")},
    628       {0x7fffffffull, ByteSequence("\004\177\377\377\377")},
    629       {0x80000000ull, ByteSequence("\004\200\000\000\000")},
    630       {0x80000001ull, ByteSequence("\004\200\000\000\001")},
    631       {0xffffffffull, ByteSequence("\004\377\377\377\377")},
    632       {0x100000000ull, ByteSequence("\005\001\000\000\000\000")},
    633       {0x100000001ull, ByteSequence("\005\001\000\000\000\001")},
    634       {0x1ffffffffull, ByteSequence("\005\001\377\377\377\377")},
    635       {0x200000000ull, ByteSequence("\005\002\000\000\000\000")},
    636       {0x200000001ull, ByteSequence("\005\002\000\000\000\001")},
    637       {0x3ffffffffull, ByteSequence("\005\003\377\377\377\377")},
    638       {0x400000000ull, ByteSequence("\005\004\000\000\000\000")},
    639       {0x400000001ull, ByteSequence("\005\004\000\000\000\001")},
    640       {0x7ffffffffull, ByteSequence("\005\007\377\377\377\377")},
    641       {0x800000000ull, ByteSequence("\005\010\000\000\000\000")},
    642       {0x800000001ull, ByteSequence("\005\010\000\000\000\001")},
    643       {0xfffffffffull, ByteSequence("\005\017\377\377\377\377")},
    644       {0x1000000000ull, ByteSequence("\005\020\000\000\000\000")},
    645       {0x1000000001ull, ByteSequence("\005\020\000\000\000\001")},
    646       {0x1fffffffffull, ByteSequence("\005\037\377\377\377\377")},
    647       {0x2000000000ull, ByteSequence("\005 \000\000\000\000")},
    648       {0x2000000001ull, ByteSequence("\005 \000\000\000\001")},
    649       {0x3fffffffffull, ByteSequence("\005?\377\377\377\377")},
    650       {0x4000000000ull, ByteSequence("\005@\000\000\000\000")},
    651       {0x4000000001ull, ByteSequence("\005@\000\000\000\001")},
    652       {0x7fffffffffull, ByteSequence("\005\177\377\377\377\377")},
    653       {0x8000000000ull, ByteSequence("\005\200\000\000\000\000")},
    654       {0x8000000001ull, ByteSequence("\005\200\000\000\000\001")},
    655       {0xffffffffffull, ByteSequence("\005\377\377\377\377\377")},
    656       {0x10000000000ull, ByteSequence("\006\001\000\000\000\000\000")},
    657       {0x10000000001ull, ByteSequence("\006\001\000\000\000\000\001")},
    658       {0x1ffffffffffull, ByteSequence("\006\001\377\377\377\377\377")},
    659       {0x20000000000ull, ByteSequence("\006\002\000\000\000\000\000")},
    660       {0x20000000001ull, ByteSequence("\006\002\000\000\000\000\001")},
    661       {0x3ffffffffffull, ByteSequence("\006\003\377\377\377\377\377")},
    662       {0x40000000000ull, ByteSequence("\006\004\000\000\000\000\000")},
    663       {0x40000000001ull, ByteSequence("\006\004\000\000\000\000\001")},
    664       {0x7ffffffffffull, ByteSequence("\006\007\377\377\377\377\377")},
    665       {0x80000000000ull, ByteSequence("\006\010\000\000\000\000\000")},
    666       {0x80000000001ull, ByteSequence("\006\010\000\000\000\000\001")},
    667       {0xfffffffffffull, ByteSequence("\006\017\377\377\377\377\377")},
    668       {0x100000000000ull, ByteSequence("\006\020\000\000\000\000\000")},
    669       {0x100000000001ull, ByteSequence("\006\020\000\000\000\000\001")},
    670       {0x1fffffffffffull, ByteSequence("\006\037\377\377\377\377\377")},
    671       {0x200000000000ull, ByteSequence("\006 \000\000\000\000\000")},
    672       {0x200000000001ull, ByteSequence("\006 \000\000\000\000\001")},
    673       {0x3fffffffffffull, ByteSequence("\006?\377\377\377\377\377")},
    674       {0x400000000000ull, ByteSequence("\006@\000\000\000\000\000")},
    675       {0x400000000001ull, ByteSequence("\006@\000\000\000\000\001")},
    676       {0x7fffffffffffull, ByteSequence("\006\177\377\377\377\377\377")},
    677       {0x800000000000ull, ByteSequence("\006\200\000\000\000\000\000")},
    678       {0x800000000001ull, ByteSequence("\006\200\000\000\000\000\001")},
    679       {0xffffffffffffull, ByteSequence("\006\377\377\377\377\377\377")},
    680       {0x1000000000000ull, ByteSequence("\007\001\000\000\000\000\000\000")},
    681       {0x1000000000001ull, ByteSequence("\007\001\000\000\000\000\000\001")},
    682       {0x1ffffffffffffull, ByteSequence("\007\001\377\377\377\377\377\377")},
    683       {0x2000000000000ull, ByteSequence("\007\002\000\000\000\000\000\000")},
    684       {0x2000000000001ull, ByteSequence("\007\002\000\000\000\000\000\001")},
    685       {0x3ffffffffffffull, ByteSequence("\007\003\377\377\377\377\377\377")},
    686       {0x4000000000000ull, ByteSequence("\007\004\000\000\000\000\000\000")},
    687       {0x4000000000001ull, ByteSequence("\007\004\000\000\000\000\000\001")},
    688       {0x7ffffffffffffull, ByteSequence("\007\007\377\377\377\377\377\377")},
    689       {0x8000000000000ull, ByteSequence("\007\010\000\000\000\000\000\000")},
    690       {0x8000000000001ull, ByteSequence("\007\010\000\000\000\000\000\001")},
    691       {0xfffffffffffffull, ByteSequence("\007\017\377\377\377\377\377\377")},
    692       {0x10000000000000ull, ByteSequence("\007\020\000\000\000\000\000\000")},
    693       {0x10000000000001ull, ByteSequence("\007\020\000\000\000\000\000\001")},
    694       {0x1fffffffffffffull, ByteSequence("\007\037\377\377\377\377\377\377")},
    695       {0x20000000000000ull, ByteSequence("\007 \000\000\000\000\000\000")},
    696       {0x20000000000001ull, ByteSequence("\007 \000\000\000\000\000\001")},
    697       {0x3fffffffffffffull, ByteSequence("\007?\377\377\377\377\377\377")},
    698       {0x40000000000000ull, ByteSequence("\007@\000\000\000\000\000\000")},
    699       {0x40000000000001ull, ByteSequence("\007@\000\000\000\000\000\001")},
    700       {0x7fffffffffffffull, ByteSequence("\007\177\377\377\377\377\377\377")},
    701       {0x80000000000000ull, ByteSequence("\007\200\000\000\000\000\000\000")},
    702       {0x80000000000001ull, ByteSequence("\007\200\000\000\000\000\000\001")},
    703       {0xffffffffffffffull, ByteSequence("\007\377\377\377\377\377\377\377")},
    704       {0x100000000000000ull,
    705        ByteSequence("\010\001\000\000\000\000\000\000\000")},
    706       {0x100000000000001ull,
    707        ByteSequence("\010\001\000\000\000\000\000\000\001")},
    708       {0x1ffffffffffffffull,
    709        ByteSequence("\010\001\377\377\377\377\377\377\377")},
    710       {0x200000000000000ull,
    711        ByteSequence("\010\002\000\000\000\000\000\000\000")},
    712       {0x200000000000001ull,
    713        ByteSequence("\010\002\000\000\000\000\000\000\001")},
    714       {0x3ffffffffffffffull,
    715        ByteSequence("\010\003\377\377\377\377\377\377\377")},
    716       {0x400000000000000ull,
    717        ByteSequence("\010\004\000\000\000\000\000\000\000")},
    718       {0x400000000000001ull,
    719        ByteSequence("\010\004\000\000\000\000\000\000\001")},
    720       {0x7ffffffffffffffull,
    721        ByteSequence("\010\007\377\377\377\377\377\377\377")},
    722       {0x800000000000000ull,
    723        ByteSequence("\010\010\000\000\000\000\000\000\000")},
    724       {0x800000000000001ull,
    725        ByteSequence("\010\010\000\000\000\000\000\000\001")},
    726       {0xfffffffffffffffull,
    727        ByteSequence("\010\017\377\377\377\377\377\377\377")},
    728       {0x1000000000000000ull,
    729        ByteSequence("\010\020\000\000\000\000\000\000\000")},
    730       {0x1000000000000001ull,
    731        ByteSequence("\010\020\000\000\000\000\000\000\001")},
    732       {0x1fffffffffffffffull,
    733        ByteSequence("\010\037\377\377\377\377\377\377\377")},
    734       {0x2000000000000000ull,
    735        ByteSequence("\010 \000\000\000\000\000\000\000")},
    736       {0x2000000000000001ull,
    737        ByteSequence("\010 \000\000\000\000\000\000\001")},
    738       {0x3fffffffffffffffull,
    739        ByteSequence("\010?\377\377\377\377\377\377\377")},
    740       {0x4000000000000000ull,
    741        ByteSequence("\010@\000\000\000\000\000\000\000")},
    742       {0x4000000000000001ull,
    743        ByteSequence("\010@\000\000\000\000\000\000\001")},
    744       {0x7fffffffffffffffull,
    745        ByteSequence("\010\177\377\377\377\377\377\377\377")},
    746       {0x8000000000000000ull,
    747        ByteSequence("\010\200\000\000\000\000\000\000\000")},
    748       {0x8000000000000001ull,
    749        ByteSequence("\010\200\000\000\000\000\000\000\001")},
    750   };
    751   for (const auto& t : data) {
    752     uint64 num = t.first;
    753     string result;
    754     OrderedCode::WriteNumIncreasing(&result, num);
    755     EXPECT_EQ(t.second, result) << std::hex << num;
    756 
    757     StringPiece in = result;
    758     uint64 decoded;
    759     EXPECT_TRUE(OrderedCode::ReadNumIncreasing(&in, &decoded));
    760     EXPECT_EQ(num, decoded);
    761     EXPECT_EQ("", in);
    762   }
    763 }
    764 
    765 TEST(EncodingIsExpected, Signed) {
    766   std::vector<std::pair<int64, string>> data = {
    767       {0ll, ByteSequence("\200")},
    768       {1ll, ByteSequence("\201")},
    769       {2ll, ByteSequence("\202")},
    770       {1ll, ByteSequence("\201")},
    771       {2ll, ByteSequence("\202")},
    772       {3ll, ByteSequence("\203")},
    773       {3ll, ByteSequence("\203")},
    774       {4ll, ByteSequence("\204")},
    775       {5ll, ByteSequence("\205")},
    776       {7ll, ByteSequence("\207")},
    777       {8ll, ByteSequence("\210")},
    778       {9ll, ByteSequence("\211")},
    779       {15ll, ByteSequence("\217")},
    780       {16ll, ByteSequence("\220")},
    781       {17ll, ByteSequence("\221")},
    782       {31ll, ByteSequence("\237")},
    783       {32ll, ByteSequence("\240")},
    784       {33ll, ByteSequence("\241")},
    785       {63ll, ByteSequence("\277")},
    786       {64ll, ByteSequence("\300@")},
    787       {65ll, ByteSequence("\300A")},
    788       {127ll, ByteSequence("\300\177")},
    789       {128ll, ByteSequence("\300\200")},
    790       {129ll, ByteSequence("\300\201")},
    791       {255ll, ByteSequence("\300\377")},
    792       {256ll, ByteSequence("\301\000")},
    793       {257ll, ByteSequence("\301\001")},
    794       {511ll, ByteSequence("\301\377")},
    795       {512ll, ByteSequence("\302\000")},
    796       {513ll, ByteSequence("\302\001")},
    797       {1023ll, ByteSequence("\303\377")},
    798       {1024ll, ByteSequence("\304\000")},
    799       {1025ll, ByteSequence("\304\001")},
    800       {2047ll, ByteSequence("\307\377")},
    801       {2048ll, ByteSequence("\310\000")},
    802       {2049ll, ByteSequence("\310\001")},
    803       {4095ll, ByteSequence("\317\377")},
    804       {4096ll, ByteSequence("\320\000")},
    805       {4097ll, ByteSequence("\320\001")},
    806       {8191ll, ByteSequence("\337\377")},
    807       {8192ll, ByteSequence("\340 \000")},
    808       {8193ll, ByteSequence("\340 \001")},
    809       {16383ll, ByteSequence("\340?\377")},
    810       {16384ll, ByteSequence("\340@\000")},
    811       {16385ll, ByteSequence("\340@\001")},
    812       {32767ll, ByteSequence("\340\177\377")},
    813       {32768ll, ByteSequence("\340\200\000")},
    814       {32769ll, ByteSequence("\340\200\001")},
    815       {65535ll, ByteSequence("\340\377\377")},
    816       {65536ll, ByteSequence("\341\000\000")},
    817       {65537ll, ByteSequence("\341\000\001")},
    818       {131071ll, ByteSequence("\341\377\377")},
    819       {131072ll, ByteSequence("\342\000\000")},
    820       {131073ll, ByteSequence("\342\000\001")},
    821       {262143ll, ByteSequence("\343\377\377")},
    822       {262144ll, ByteSequence("\344\000\000")},
    823       {262145ll, ByteSequence("\344\000\001")},
    824       {524287ll, ByteSequence("\347\377\377")},
    825       {524288ll, ByteSequence("\350\000\000")},
    826       {524289ll, ByteSequence("\350\000\001")},
    827       {1048575ll, ByteSequence("\357\377\377")},
    828       {1048576ll, ByteSequence("\360\020\000\000")},
    829       {1048577ll, ByteSequence("\360\020\000\001")},
    830       {2097151ll, ByteSequence("\360\037\377\377")},
    831       {2097152ll, ByteSequence("\360 \000\000")},
    832       {2097153ll, ByteSequence("\360 \000\001")},
    833       {4194303ll, ByteSequence("\360?\377\377")},
    834       {4194304ll, ByteSequence("\360@\000\000")},
    835       {4194305ll, ByteSequence("\360@\000\001")},
    836       {8388607ll, ByteSequence("\360\177\377\377")},
    837       {8388608ll, ByteSequence("\360\200\000\000")},
    838       {8388609ll, ByteSequence("\360\200\000\001")},
    839       {16777215ll, ByteSequence("\360\377\377\377")},
    840       {16777216ll, ByteSequence("\361\000\000\000")},
    841       {16777217ll, ByteSequence("\361\000\000\001")},
    842       {33554431ll, ByteSequence("\361\377\377\377")},
    843       {33554432ll, ByteSequence("\362\000\000\000")},
    844       {33554433ll, ByteSequence("\362\000\000\001")},
    845       {67108863ll, ByteSequence("\363\377\377\377")},
    846       {67108864ll, ByteSequence("\364\000\000\000")},
    847       {67108865ll, ByteSequence("\364\000\000\001")},
    848       {134217727ll, ByteSequence("\367\377\377\377")},
    849       {134217728ll, ByteSequence("\370\010\000\000\000")},
    850       {134217729ll, ByteSequence("\370\010\000\000\001")},
    851       {268435455ll, ByteSequence("\370\017\377\377\377")},
    852       {268435456ll, ByteSequence("\370\020\000\000\000")},
    853       {268435457ll, ByteSequence("\370\020\000\000\001")},
    854       {536870911ll, ByteSequence("\370\037\377\377\377")},
    855       {536870912ll, ByteSequence("\370 \000\000\000")},
    856       {536870913ll, ByteSequence("\370 \000\000\001")},
    857       {1073741823ll, ByteSequence("\370?\377\377\377")},
    858       {1073741824ll, ByteSequence("\370@\000\000\000")},
    859       {1073741825ll, ByteSequence("\370@\000\000\001")},
    860       {2147483647ll, ByteSequence("\370\177\377\377\377")},
    861       {2147483648ll, ByteSequence("\370\200\000\000\000")},
    862       {2147483649ll, ByteSequence("\370\200\000\000\001")},
    863       {4294967295ll, ByteSequence("\370\377\377\377\377")},
    864       {4294967296ll, ByteSequence("\371\000\000\000\000")},
    865       {4294967297ll, ByteSequence("\371\000\000\000\001")},
    866       {8589934591ll, ByteSequence("\371\377\377\377\377")},
    867       {8589934592ll, ByteSequence("\372\000\000\000\000")},
    868       {8589934593ll, ByteSequence("\372\000\000\000\001")},
    869       {17179869183ll, ByteSequence("\373\377\377\377\377")},
    870       {17179869184ll, ByteSequence("\374\004\000\000\000\000")},
    871       {17179869185ll, ByteSequence("\374\004\000\000\000\001")},
    872       {34359738367ll, ByteSequence("\374\007\377\377\377\377")},
    873       {34359738368ll, ByteSequence("\374\010\000\000\000\000")},
    874       {34359738369ll, ByteSequence("\374\010\000\000\000\001")},
    875       {68719476735ll, ByteSequence("\374\017\377\377\377\377")},
    876       {68719476736ll, ByteSequence("\374\020\000\000\000\000")},
    877       {68719476737ll, ByteSequence("\374\020\000\000\000\001")},
    878       {137438953471ll, ByteSequence("\374\037\377\377\377\377")},
    879       {137438953472ll, ByteSequence("\374 \000\000\000\000")},
    880       {137438953473ll, ByteSequence("\374 \000\000\000\001")},
    881       {274877906943ll, ByteSequence("\374?\377\377\377\377")},
    882       {274877906944ll, ByteSequence("\374@\000\000\000\000")},
    883       {274877906945ll, ByteSequence("\374@\000\000\000\001")},
    884       {549755813887ll, ByteSequence("\374\177\377\377\377\377")},
    885       {549755813888ll, ByteSequence("\374\200\000\000\000\000")},
    886       {549755813889ll, ByteSequence("\374\200\000\000\000\001")},
    887       {1099511627775ll, ByteSequence("\374\377\377\377\377\377")},
    888       {1099511627776ll, ByteSequence("\375\000\000\000\000\000")},
    889       {1099511627777ll, ByteSequence("\375\000\000\000\000\001")},
    890       {2199023255551ll, ByteSequence("\375\377\377\377\377\377")},
    891       {2199023255552ll, ByteSequence("\376\002\000\000\000\000\000")},
    892       {2199023255553ll, ByteSequence("\376\002\000\000\000\000\001")},
    893       {4398046511103ll, ByteSequence("\376\003\377\377\377\377\377")},
    894       {4398046511104ll, ByteSequence("\376\004\000\000\000\000\000")},
    895       {4398046511105ll, ByteSequence("\376\004\000\000\000\000\001")},
    896       {8796093022207ll, ByteSequence("\376\007\377\377\377\377\377")},
    897       {8796093022208ll, ByteSequence("\376\010\000\000\000\000\000")},
    898       {8796093022209ll, ByteSequence("\376\010\000\000\000\000\001")},
    899       {17592186044415ll, ByteSequence("\376\017\377\377\377\377\377")},
    900       {17592186044416ll, ByteSequence("\376\020\000\000\000\000\000")},
    901       {17592186044417ll, ByteSequence("\376\020\000\000\000\000\001")},
    902       {35184372088831ll, ByteSequence("\376\037\377\377\377\377\377")},
    903       {35184372088832ll, ByteSequence("\376 \000\000\000\000\000")},
    904       {35184372088833ll, ByteSequence("\376 \000\000\000\000\001")},
    905       {70368744177663ll, ByteSequence("\376?\377\377\377\377\377")},
    906       {70368744177664ll, ByteSequence("\376@\000\000\000\000\000")},
    907       {70368744177665ll, ByteSequence("\376@\000\000\000\000\001")},
    908       {140737488355327ll, ByteSequence("\376\177\377\377\377\377\377")},
    909       {140737488355328ll, ByteSequence("\376\200\000\000\000\000\000")},
    910       {140737488355329ll, ByteSequence("\376\200\000\000\000\000\001")},
    911       {281474976710655ll, ByteSequence("\376\377\377\377\377\377\377")},
    912       {281474976710656ll, ByteSequence("\377\001\000\000\000\000\000\000")},
    913       {281474976710657ll, ByteSequence("\377\001\000\000\000\000\000\001")},
    914       {562949953421311ll, ByteSequence("\377\001\377\377\377\377\377\377")},
    915       {562949953421312ll, ByteSequence("\377\002\000\000\000\000\000\000")},
    916       {562949953421313ll, ByteSequence("\377\002\000\000\000\000\000\001")},
    917       {1125899906842623ll, ByteSequence("\377\003\377\377\377\377\377\377")},
    918       {1125899906842624ll, ByteSequence("\377\004\000\000\000\000\000\000")},
    919       {1125899906842625ll, ByteSequence("\377\004\000\000\000\000\000\001")},
    920       {2251799813685247ll, ByteSequence("\377\007\377\377\377\377\377\377")},
    921       {2251799813685248ll, ByteSequence("\377\010\000\000\000\000\000\000")},
    922       {2251799813685249ll, ByteSequence("\377\010\000\000\000\000\000\001")},
    923       {4503599627370495ll, ByteSequence("\377\017\377\377\377\377\377\377")},
    924       {4503599627370496ll, ByteSequence("\377\020\000\000\000\000\000\000")},
    925       {4503599627370497ll, ByteSequence("\377\020\000\000\000\000\000\001")},
    926       {9007199254740991ll, ByteSequence("\377\037\377\377\377\377\377\377")},
    927       {9007199254740992ll, ByteSequence("\377 \000\000\000\000\000\000")},
    928       {9007199254740993ll, ByteSequence("\377 \000\000\000\000\000\001")},
    929       {18014398509481983ll, ByteSequence("\377?\377\377\377\377\377\377")},
    930       {18014398509481984ll, ByteSequence("\377@\000\000\000\000\000\000")},
    931       {18014398509481985ll, ByteSequence("\377@\000\000\000\000\000\001")},
    932       {36028797018963967ll, ByteSequence("\377\177\377\377\377\377\377\377")},
    933       {36028797018963968ll,
    934        ByteSequence("\377\200\200\000\000\000\000\000\000")},
    935       {36028797018963969ll,
    936        ByteSequence("\377\200\200\000\000\000\000\000\001")},
    937       {72057594037927935ll,
    938        ByteSequence("\377\200\377\377\377\377\377\377\377")},
    939       {72057594037927936ll,
    940        ByteSequence("\377\201\000\000\000\000\000\000\000")},
    941       {72057594037927937ll,
    942        ByteSequence("\377\201\000\000\000\000\000\000\001")},
    943       {144115188075855871ll,
    944        ByteSequence("\377\201\377\377\377\377\377\377\377")},
    945       {144115188075855872ll,
    946        ByteSequence("\377\202\000\000\000\000\000\000\000")},
    947       {144115188075855873ll,
    948        ByteSequence("\377\202\000\000\000\000\000\000\001")},
    949       {288230376151711743ll,
    950        ByteSequence("\377\203\377\377\377\377\377\377\377")},
    951       {288230376151711744ll,
    952        ByteSequence("\377\204\000\000\000\000\000\000\000")},
    953       {288230376151711745ll,
    954        ByteSequence("\377\204\000\000\000\000\000\000\001")},
    955       {576460752303423487ll,
    956        ByteSequence("\377\207\377\377\377\377\377\377\377")},
    957       {576460752303423488ll,
    958        ByteSequence("\377\210\000\000\000\000\000\000\000")},
    959       {576460752303423489ll,
    960        ByteSequence("\377\210\000\000\000\000\000\000\001")},
    961       {1152921504606846975ll,
    962        ByteSequence("\377\217\377\377\377\377\377\377\377")},
    963       {1152921504606846976ll,
    964        ByteSequence("\377\220\000\000\000\000\000\000\000")},
    965       {1152921504606846977ll,
    966        ByteSequence("\377\220\000\000\000\000\000\000\001")},
    967       {2305843009213693951ll,
    968        ByteSequence("\377\237\377\377\377\377\377\377\377")},
    969       {2305843009213693952ll,
    970        ByteSequence("\377\240\000\000\000\000\000\000\000")},
    971       {2305843009213693953ll,
    972        ByteSequence("\377\240\000\000\000\000\000\000\001")},
    973       {4611686018427387903ll,
    974        ByteSequence("\377\277\377\377\377\377\377\377\377")},
    975       {4611686018427387904ll,
    976        ByteSequence("\377\300@\000\000\000\000\000\000\000")},
    977       {4611686018427387905ll,
    978        ByteSequence("\377\300@\000\000\000\000\000\000\001")},
    979       {9223372036854775807ll,
    980        ByteSequence("\377\300\177\377\377\377\377\377\377\377")},
    981       {-9223372036854775807ll,
    982        ByteSequence("\000?\200\000\000\000\000\000\000\001")},
    983       {0ll, ByteSequence("\200")},
    984       {-1ll, ByteSequence("\177")},
    985       {-2ll, ByteSequence("~")},
    986       {-1ll, ByteSequence("\177")},
    987       {-2ll, ByteSequence("~")},
    988       {-3ll, ByteSequence("}")},
    989       {-3ll, ByteSequence("}")},
    990       {-4ll, ByteSequence("|")},
    991       {-5ll, ByteSequence("{")},
    992       {-7ll, ByteSequence("y")},
    993       {-8ll, ByteSequence("x")},
    994       {-9ll, ByteSequence("w")},
    995       {-15ll, ByteSequence("q")},
    996       {-16ll, ByteSequence("p")},
    997       {-17ll, ByteSequence("o")},
    998       {-31ll, ByteSequence("a")},
    999       {-32ll, ByteSequence("`")},
   1000       {-33ll, ByteSequence("_")},
   1001       {-63ll, ByteSequence("A")},
   1002       {-64ll, ByteSequence("@")},
   1003       {-65ll, ByteSequence("?\277")},
   1004       {-127ll, ByteSequence("?\201")},
   1005       {-128ll, ByteSequence("?\200")},
   1006       {-129ll, ByteSequence("?\177")},
   1007       {-255ll, ByteSequence("?\001")},
   1008       {-256ll, ByteSequence("?\000")},
   1009       {-257ll, ByteSequence(">\377")},
   1010       {-511ll, ByteSequence(">\001")},
   1011       {-512ll, ByteSequence(">\000")},
   1012       {-513ll, ByteSequence("=\377")},
   1013       {-1023ll, ByteSequence("<\001")},
   1014       {-1024ll, ByteSequence("<\000")},
   1015       {-1025ll, ByteSequence(";\377")},
   1016       {-2047ll, ByteSequence("8\001")},
   1017       {-2048ll, ByteSequence("8\000")},
   1018       {-2049ll, ByteSequence("7\377")},
   1019       {-4095ll, ByteSequence("0\001")},
   1020       {-4096ll, ByteSequence("0\000")},
   1021       {-4097ll, ByteSequence("/\377")},
   1022       {-8191ll, ByteSequence(" \001")},
   1023       {-8192ll, ByteSequence(" \000")},
   1024       {-8193ll, ByteSequence("\037\337\377")},
   1025       {-16383ll, ByteSequence("\037\300\001")},
   1026       {-16384ll, ByteSequence("\037\300\000")},
   1027       {-16385ll, ByteSequence("\037\277\377")},
   1028       {-32767ll, ByteSequence("\037\200\001")},
   1029       {-32768ll, ByteSequence("\037\200\000")},
   1030       {-32769ll, ByteSequence("\037\177\377")},
   1031       {-65535ll, ByteSequence("\037\000\001")},
   1032       {-65536ll, ByteSequence("\037\000\000")},
   1033       {-65537ll, ByteSequence("\036\377\377")},
   1034       {-131071ll, ByteSequence("\036\000\001")},
   1035       {-131072ll, ByteSequence("\036\000\000")},
   1036       {-131073ll, ByteSequence("\035\377\377")},
   1037       {-262143ll, ByteSequence("\034\000\001")},
   1038       {-262144ll, ByteSequence("\034\000\000")},
   1039       {-262145ll, ByteSequence("\033\377\377")},
   1040       {-524287ll, ByteSequence("\030\000\001")},
   1041       {-524288ll, ByteSequence("\030\000\000")},
   1042       {-524289ll, ByteSequence("\027\377\377")},
   1043       {-1048575ll, ByteSequence("\020\000\001")},
   1044       {-1048576ll, ByteSequence("\020\000\000")},
   1045       {-1048577ll, ByteSequence("\017\357\377\377")},
   1046       {-2097151ll, ByteSequence("\017\340\000\001")},
   1047       {-2097152ll, ByteSequence("\017\340\000\000")},
   1048       {-2097153ll, ByteSequence("\017\337\377\377")},
   1049       {-4194303ll, ByteSequence("\017\300\000\001")},
   1050       {-4194304ll, ByteSequence("\017\300\000\000")},
   1051       {-4194305ll, ByteSequence("\017\277\377\377")},
   1052       {-8388607ll, ByteSequence("\017\200\000\001")},
   1053       {-8388608ll, ByteSequence("\017\200\000\000")},
   1054       {-8388609ll, ByteSequence("\017\177\377\377")},
   1055       {-16777215ll, ByteSequence("\017\000\000\001")},
   1056       {-16777216ll, ByteSequence("\017\000\000\000")},
   1057       {-16777217ll, ByteSequence("\016\377\377\377")},
   1058       {-33554431ll, ByteSequence("\016\000\000\001")},
   1059       {-33554432ll, ByteSequence("\016\000\000\000")},
   1060       {-33554433ll, ByteSequence("\r\377\377\377")},
   1061       {-67108863ll, ByteSequence("\014\000\000\001")},
   1062       {-67108864ll, ByteSequence("\014\000\000\000")},
   1063       {-67108865ll, ByteSequence("\013\377\377\377")},
   1064       {-134217727ll, ByteSequence("\010\000\000\001")},
   1065       {-134217728ll, ByteSequence("\010\000\000\000")},
   1066       {-134217729ll, ByteSequence("\007\367\377\377\377")},
   1067       {-268435455ll, ByteSequence("\007\360\000\000\001")},
   1068       {-268435456ll, ByteSequence("\007\360\000\000\000")},
   1069       {-268435457ll, ByteSequence("\007\357\377\377\377")},
   1070       {-536870911ll, ByteSequence("\007\340\000\000\001")},
   1071       {-536870912ll, ByteSequence("\007\340\000\000\000")},
   1072       {-536870913ll, ByteSequence("\007\337\377\377\377")},
   1073       {-1073741823ll, ByteSequence("\007\300\000\000\001")},
   1074       {-1073741824ll, ByteSequence("\007\300\000\000\000")},
   1075       {-1073741825ll, ByteSequence("\007\277\377\377\377")},
   1076       {-2147483647ll, ByteSequence("\007\200\000\000\001")},
   1077       {-2147483648ll, ByteSequence("\007\200\000\000\000")},
   1078       {-2147483649ll, ByteSequence("\007\177\377\377\377")},
   1079       {-4294967295ll, ByteSequence("\007\000\000\000\001")},
   1080       {-4294967296ll, ByteSequence("\007\000\000\000\000")},
   1081       {-4294967297ll, ByteSequence("\006\377\377\377\377")},
   1082       {-8589934591ll, ByteSequence("\006\000\000\000\001")},
   1083       {-8589934592ll, ByteSequence("\006\000\000\000\000")},
   1084       {-8589934593ll, ByteSequence("\005\377\377\377\377")},
   1085       {-17179869183ll, ByteSequence("\004\000\000\000\001")},
   1086       {-17179869184ll, ByteSequence("\004\000\000\000\000")},
   1087       {-17179869185ll, ByteSequence("\003\373\377\377\377\377")},
   1088       {-34359738367ll, ByteSequence("\003\370\000\000\000\001")},
   1089       {-34359738368ll, ByteSequence("\003\370\000\000\000\000")},
   1090       {-34359738369ll, ByteSequence("\003\367\377\377\377\377")},
   1091       {-68719476735ll, ByteSequence("\003\360\000\000\000\001")},
   1092       {-68719476736ll, ByteSequence("\003\360\000\000\000\000")},
   1093       {-68719476737ll, ByteSequence("\003\357\377\377\377\377")},
   1094       {-137438953471ll, ByteSequence("\003\340\000\000\000\001")},
   1095       {-137438953472ll, ByteSequence("\003\340\000\000\000\000")},
   1096       {-137438953473ll, ByteSequence("\003\337\377\377\377\377")},
   1097       {-274877906943ll, ByteSequence("\003\300\000\000\000\001")},
   1098       {-274877906944ll, ByteSequence("\003\300\000\000\000\000")},
   1099       {-274877906945ll, ByteSequence("\003\277\377\377\377\377")},
   1100       {-549755813887ll, ByteSequence("\003\200\000\000\000\001")},
   1101       {-549755813888ll, ByteSequence("\003\200\000\000\000\000")},
   1102       {-549755813889ll, ByteSequence("\003\177\377\377\377\377")},
   1103       {-1099511627775ll, ByteSequence("\003\000\000\000\000\001")},
   1104       {-1099511627776ll, ByteSequence("\003\000\000\000\000\000")},
   1105       {-1099511627777ll, ByteSequence("\002\377\377\377\377\377")},
   1106       {-2199023255551ll, ByteSequence("\002\000\000\000\000\001")},
   1107       {-2199023255552ll, ByteSequence("\002\000\000\000\000\000")},
   1108       {-2199023255553ll, ByteSequence("\001\375\377\377\377\377\377")},
   1109       {-4398046511103ll, ByteSequence("\001\374\000\000\000\000\001")},
   1110       {-4398046511104ll, ByteSequence("\001\374\000\000\000\000\000")},
   1111       {-4398046511105ll, ByteSequence("\001\373\377\377\377\377\377")},
   1112       {-8796093022207ll, ByteSequence("\001\370\000\000\000\000\001")},
   1113       {-8796093022208ll, ByteSequence("\001\370\000\000\000\000\000")},
   1114       {-8796093022209ll, ByteSequence("\001\367\377\377\377\377\377")},
   1115       {-17592186044415ll, ByteSequence("\001\360\000\000\000\000\001")},
   1116       {-17592186044416ll, ByteSequence("\001\360\000\000\000\000\000")},
   1117       {-17592186044417ll, ByteSequence("\001\357\377\377\377\377\377")},
   1118       {-35184372088831ll, ByteSequence("\001\340\000\000\000\000\001")},
   1119       {-35184372088832ll, ByteSequence("\001\340\000\000\000\000\000")},
   1120       {-35184372088833ll, ByteSequence("\001\337\377\377\377\377\377")},
   1121       {-70368744177663ll, ByteSequence("\001\300\000\000\000\000\001")},
   1122       {-70368744177664ll, ByteSequence("\001\300\000\000\000\000\000")},
   1123       {-70368744177665ll, ByteSequence("\001\277\377\377\377\377\377")},
   1124       {-140737488355327ll, ByteSequence("\001\200\000\000\000\000\001")},
   1125       {-140737488355328ll, ByteSequence("\001\200\000\000\000\000\000")},
   1126       {-140737488355329ll, ByteSequence("\001\177\377\377\377\377\377")},
   1127       {-281474976710655ll, ByteSequence("\001\000\000\000\000\000\001")},
   1128       {-281474976710656ll, ByteSequence("\001\000\000\000\000\000\000")},
   1129       {-281474976710657ll, ByteSequence("\000\376\377\377\377\377\377\377")},
   1130       {-562949953421311ll, ByteSequence("\000\376\000\000\000\000\000\001")},
   1131       {-562949953421312ll, ByteSequence("\000\376\000\000\000\000\000\000")},
   1132       {-562949953421313ll, ByteSequence("\000\375\377\377\377\377\377\377")},
   1133       {-1125899906842623ll, ByteSequence("\000\374\000\000\000\000\000\001")},
   1134       {-1125899906842624ll, ByteSequence("\000\374\000\000\000\000\000\000")},
   1135       {-1125899906842625ll, ByteSequence("\000\373\377\377\377\377\377\377")},
   1136       {-2251799813685247ll, ByteSequence("\000\370\000\000\000\000\000\001")},
   1137       {-2251799813685248ll, ByteSequence("\000\370\000\000\000\000\000\000")},
   1138       {-2251799813685249ll, ByteSequence("\000\367\377\377\377\377\377\377")},
   1139       {-4503599627370495ll, ByteSequence("\000\360\000\000\000\000\000\001")},
   1140       {-4503599627370496ll, ByteSequence("\000\360\000\000\000\000\000\000")},
   1141       {-4503599627370497ll, ByteSequence("\000\357\377\377\377\377\377\377")},
   1142       {-9007199254740991ll, ByteSequence("\000\340\000\000\000\000\000\001")},
   1143       {-9007199254740992ll, ByteSequence("\000\340\000\000\000\000\000\000")},
   1144       {-9007199254740993ll, ByteSequence("\000\337\377\377\377\377\377\377")},
   1145       {-18014398509481983ll, ByteSequence("\000\300\000\000\000\000\000\001")},
   1146       {-18014398509481984ll, ByteSequence("\000\300\000\000\000\000\000\000")},
   1147       {-18014398509481985ll, ByteSequence("\000\277\377\377\377\377\377\377")},
   1148       {-36028797018963967ll, ByteSequence("\000\200\000\000\000\000\000\001")},
   1149       {-36028797018963968ll, ByteSequence("\000\200\000\000\000\000\000\000")},
   1150       {-36028797018963969ll,
   1151        ByteSequence("\000\177\177\377\377\377\377\377\377")},
   1152       {-72057594037927935ll,
   1153        ByteSequence("\000\177\000\000\000\000\000\000\001")},
   1154       {-72057594037927936ll,
   1155        ByteSequence("\000\177\000\000\000\000\000\000\000")},
   1156       {-72057594037927937ll, ByteSequence("\000~\377\377\377\377\377\377\377")},
   1157       {-144115188075855871ll,
   1158        ByteSequence("\000~\000\000\000\000\000\000\001")},
   1159       {-144115188075855872ll,
   1160        ByteSequence("\000~\000\000\000\000\000\000\000")},
   1161       {-144115188075855873ll,
   1162        ByteSequence("\000}\377\377\377\377\377\377\377")},
   1163       {-288230376151711743ll,
   1164        ByteSequence("\000|\000\000\000\000\000\000\001")},
   1165       {-288230376151711744ll,
   1166        ByteSequence("\000|\000\000\000\000\000\000\000")},
   1167       {-288230376151711745ll,
   1168        ByteSequence("\000{\377\377\377\377\377\377\377")},
   1169       {-576460752303423487ll,
   1170        ByteSequence("\000x\000\000\000\000\000\000\001")},
   1171       {-576460752303423488ll,
   1172        ByteSequence("\000x\000\000\000\000\000\000\000")},
   1173       {-576460752303423489ll,
   1174        ByteSequence("\000w\377\377\377\377\377\377\377")},
   1175       {-1152921504606846975ll,
   1176        ByteSequence("\000p\000\000\000\000\000\000\001")},
   1177       {-1152921504606846976ll,
   1178        ByteSequence("\000p\000\000\000\000\000\000\000")},
   1179       {-1152921504606846977ll,
   1180        ByteSequence("\000o\377\377\377\377\377\377\377")},
   1181       {-2305843009213693951ll,
   1182        ByteSequence("\000`\000\000\000\000\000\000\001")},
   1183       {-2305843009213693952ll,
   1184        ByteSequence("\000`\000\000\000\000\000\000\000")},
   1185       {-2305843009213693953ll,
   1186        ByteSequence("\000_\377\377\377\377\377\377\377")},
   1187       {-4611686018427387903ll,
   1188        ByteSequence("\000@\000\000\000\000\000\000\001")},
   1189       {-4611686018427387904ll,
   1190        ByteSequence("\000@\000\000\000\000\000\000\000")},
   1191       {-4611686018427387905ll,
   1192        ByteSequence("\000?\277\377\377\377\377\377\377\377")},
   1193       {-9223372036854775807ll,
   1194        ByteSequence("\000?\200\000\000\000\000\000\000\001")},
   1195       {9223372036854775807ll,
   1196        ByteSequence("\377\300\177\377\377\377\377\377\377\377")},
   1197   };
   1198   for (const auto& t : data) {
   1199     int64 num = t.first;
   1200     string result;
   1201     OrderedCode::WriteSignedNumIncreasing(&result, num);
   1202     EXPECT_EQ(t.second, result) << std::hex << num;
   1203 
   1204     StringPiece in = result;
   1205     int64 decoded;
   1206     EXPECT_TRUE(OrderedCode::ReadSignedNumIncreasing(&in, &decoded));
   1207     EXPECT_EQ(num, decoded);
   1208     EXPECT_EQ("", in);
   1209   }
   1210 }
   1211 
   1212 void BM_WriteString(int n, int len) {
   1213   testing::StopTiming();
   1214   random::PhiloxRandom philox(301, 17);
   1215   random::SimplePhilox rnd(&philox);
   1216   string x;
   1217   for (int i = 0; i < len; i++) {
   1218     x += rnd.Uniform(256);
   1219   }
   1220   string y;
   1221 
   1222   testing::BytesProcessed(n * len);
   1223   testing::StartTiming();
   1224   while (n-- > 0) {
   1225     y.clear();
   1226     OCWriteToString<string>(&y, x);
   1227   }
   1228 }
   1229 
   1230 void BM_ReadString(int n, int len) {
   1231   testing::StopTiming();
   1232   random::PhiloxRandom philox(301, 17);
   1233   random::SimplePhilox rnd(&philox);
   1234   string x;
   1235   for (int i = 0; i < len; i++) {
   1236     x += rnd.Uniform(256);
   1237   }
   1238   string data;
   1239   OCWriteToString<string>(&data, x);
   1240   string result;
   1241 
   1242   testing::BytesProcessed(n * len);
   1243   testing::StartTiming();
   1244   while (n-- > 0) {
   1245     result.clear();
   1246     StringPiece s = data;
   1247     OCRead<string>(&s, &result);
   1248   }
   1249 }
   1250 
   1251 void BM_WriteStringIncreasing(int n, int len) { BM_WriteString(n, len); }
   1252 void BM_ReadStringIncreasing(int n, int len) { BM_ReadString(n, len); }
   1253 
   1254 BENCHMARK(BM_WriteStringIncreasing)->Range(0, 1024);
   1255 BENCHMARK(BM_ReadStringIncreasing)->Range(0, 1024);
   1256 
   1257 }  // namespace
   1258 }  // namespace strings
   1259 }  // namespace tensorflow
   1260