1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef SYNC_INTERNAL_API_PUBLIC_BASE_NODE_ORDINAL_H_
6#define SYNC_INTERNAL_API_PUBLIC_BASE_NODE_ORDINAL_H_
7
8#include "base/basictypes.h"
9#include "sync/base/sync_export.h"
10#include "sync/internal_api/public/base/ordinal.h"
11
12namespace syncer {
13
14// A NodeOrdinal is an Ordinal whose internal value comes from the
15// ordinal_in_parent field of SyncEntity (see sync.proto).  It uses
16// the entire uint8 range for backwards compatibility with the old
17// int64-based positioning.
18
19struct NodeOrdinalTraits {
20  static const uint8 kZeroDigit = 0;
21  static const uint8 kMaxDigit = kuint8max;
22  static const size_t kMinLength = 8;
23};
24
25typedef Ordinal<NodeOrdinalTraits> NodeOrdinal;
26
27COMPILE_ASSERT(static_cast<char>(NodeOrdinal::kZeroDigit) == '\x00',
28               NodeOrdinalHasCorrectZeroDigit);
29COMPILE_ASSERT(static_cast<char>(NodeOrdinal::kOneDigit) == '\x01',
30               NodeOrdinalHasCorrectOneDigit);
31COMPILE_ASSERT(static_cast<char>(NodeOrdinal::kMidDigit) == '\x80',
32               NodeOrdinalHasCorrectMidDigit);
33COMPILE_ASSERT(static_cast<char>(NodeOrdinal::kMaxDigit) == '\xff',
34               NodeOrdinalHasCorrectMaxDigit);
35COMPILE_ASSERT(NodeOrdinal::kMidDigitValue == 128,
36               NodeOrdinalHasCorrectMidDigitValue);
37COMPILE_ASSERT(NodeOrdinal::kMaxDigitValue == 255,
38               NodeOrdinalHasCorrectMaxDigitValue);
39COMPILE_ASSERT(NodeOrdinal::kRadix == 256,
40               NodeOrdinalHasCorrectRadix);
41
42// Converts an int64 position (usually from the position_in_parent
43// field of SyncEntity) to a NodeOrdinal.  This transformation
44// preserves the ordering relation: a < b under integer ordering if
45// and only if Int64ToNodeOrdinal(a) < Int64ToNodeOrdinal(b).
46SYNC_EXPORT_PRIVATE NodeOrdinal Int64ToNodeOrdinal(int64 x);
47
48// The inverse of Int64ToNodeOrdinal.  This conversion is, in general,
49// lossy: NodeOrdinals can have arbitrary fidelity, while numeric
50// positions contain only 64 bits of information (in fact, this is the
51// reason we've moved away from them).
52SYNC_EXPORT_PRIVATE int64 NodeOrdinalToInt64(const NodeOrdinal& ordinal);
53
54}  // namespace syncer
55
56#endif  // SYNC_INTERNAL_API_PUBLIC_BASE_NODE_ORDINAL_H_
57