This source file includes following definitions.
- Int64ToNodeOrdinal
- NodeOrdinalToInt64
#include "sync/internal_api/public/base/node_ordinal.h"
#include <algorithm>
namespace syncer {
NodeOrdinal Int64ToNodeOrdinal(int64 x) {
uint64 y = static_cast<uint64>(x);
y ^= 0x8000000000000000ULL;
std::string bytes(NodeOrdinal::kMinLength, '\x00');
if (y == 0) {
bytes.push_back('\x80');
} else {
for (int i = 7; i >= 0; --i) {
bytes[i] = static_cast<uint8>(y);
y >>= 8;
}
}
NodeOrdinal ordinal(bytes);
DCHECK(ordinal.IsValid());
return ordinal;
}
int64 NodeOrdinalToInt64(const NodeOrdinal& ordinal) {
uint64 y = 0;
const std::string& s = ordinal.ToInternalValue();
size_t l = NodeOrdinal::kMinLength;
if (s.length() < l) {
NOTREACHED();
l = s.length();
}
for (size_t i = 0; i < l; ++i) {
const uint8 byte = s[l - i - 1];
y |= static_cast<uint64>(byte) << (i * 8);
}
y ^= 0x8000000000000000ULL;
return static_cast<int64>(y);
}
}