Index: sync/internal_api/public/base/node_ordinal.cc |
diff --git a/sync/internal_api/public/base/node_ordinal.cc b/sync/internal_api/public/base/node_ordinal.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1b5c42cd132ec6e668fea8fffc10ff84841dbc89 |
--- /dev/null |
+++ b/sync/internal_api/public/base/node_ordinal.cc |
@@ -0,0 +1,47 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#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) { |
+ // 0 is a special case since |bytes| must not be all zeros. |
+ 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; |
+ // This is technically implementation-defined if y > INT64_MAX, so |
+ // we're assuming that we're on a twos-complement machine. |
+ return static_cast<int64>(y); |
+} |
+ |
+} // namespace syncer |