summaryrefslogtreecommitdiffstats
path: root/src/rocksdb/utilities/cassandra/serialize.h
blob: 4bd552bfc1fdbf26d26ce9476601f198d6db940a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//  Copyright (c) 2017-present, Facebook, Inc.  All rights reserved.
//  This source code is licensed under both the GPLv2 (found in the
//  COPYING file in the root directory) and Apache 2.0 License
//  (found in the LICENSE.Apache file in the root directory).

/**
 * Helper functions which serialize and deserialize integers
 * into bytes in big endian.
 */

#pragma once

#include <cstdint>
#include <string>

#include "rocksdb/rocksdb_namespace.h"

namespace ROCKSDB_NAMESPACE {
namespace cassandra {
namespace {
const int64_t kCharMask = 0xFFLL;
const int32_t kBitsPerByte = 8;
}  // namespace

template <typename T>
void Serialize(T val, std::string* dest);

template <typename T>
T Deserialize(const char* src, std::size_t offset = 0);

// Specializations
template <>
inline void Serialize<int8_t>(int8_t t, std::string* dest) {
  dest->append(1, static_cast<char>(t & kCharMask));
}

template <>
inline void Serialize<int32_t>(int32_t t, std::string* dest) {
  for (unsigned long i = 0; i < sizeof(int32_t); i++) {
    dest->append(
        1, static_cast<char>((t >> (sizeof(int32_t) - 1 - i) * kBitsPerByte) &
                             kCharMask));
  }
}

template <>
inline void Serialize<int64_t>(int64_t t, std::string* dest) {
  for (unsigned long i = 0; i < sizeof(int64_t); i++) {
    dest->append(
        1, static_cast<char>((t >> (sizeof(int64_t) - 1 - i) * kBitsPerByte) &
                             kCharMask));
  }
}

template <>
inline int8_t Deserialize<int8_t>(const char* src, std::size_t offset) {
  return static_cast<int8_t>(src[offset]);
}

template <>
inline int32_t Deserialize<int32_t>(const char* src, std::size_t offset) {
  int32_t result = 0;
  for (unsigned long i = 0; i < sizeof(int32_t); i++) {
    result |= static_cast<int32_t>(static_cast<unsigned char>(src[offset + i]))
              << ((sizeof(int32_t) - 1 - i) * kBitsPerByte);
  }
  return result;
}

template <>
inline int64_t Deserialize<int64_t>(const char* src, std::size_t offset) {
  int64_t result = 0;
  for (unsigned long i = 0; i < sizeof(int64_t); i++) {
    result |= static_cast<int64_t>(static_cast<unsigned char>(src[offset + i]))
              << ((sizeof(int64_t) - 1 - i) * kBitsPerByte);
  }
  return result;
}

}  // namespace cassandra
}  // namespace ROCKSDB_NAMESPACE