1// Copyright (c) 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_API_STRING_ORDINAL_H_
6#define SYNC_API_STRING_ORDINAL_H_
7
8#include "base/basictypes.h"
9#include "sync/internal_api/public/base/ordinal.h"
10
11namespace syncer {
12
13// A StringOrdinal is an Ordinal with range 'a'-'z' for printability
14// of its internal byte string representation.  (Think of
15// StringOrdinal as being short for PrintableStringOrdinal.)  It
16// should be used for data types that want to maintain one or more
17// orderings for nodes.
18//
19// Since StringOrdinals contain only printable characters, it is safe
20// to store as a string in a protobuf.
21
22struct StringOrdinalTraits {
23  static const uint8 kZeroDigit = 'a';
24  static const uint8 kMaxDigit = 'z';
25  static const size_t kMinLength = 1;
26};
27
28typedef Ordinal<StringOrdinalTraits> StringOrdinal;
29
30COMPILE_ASSERT(StringOrdinal::kZeroDigit == 'a',
31               StringOrdinalHasCorrectZeroDigit);
32COMPILE_ASSERT(StringOrdinal::kOneDigit == 'b',
33               StringOrdinalHasCorrectOneDigit);
34COMPILE_ASSERT(StringOrdinal::kMidDigit == 'n',
35               StringOrdinalHasCorrectMidDigit);
36COMPILE_ASSERT(StringOrdinal::kMaxDigit == 'z',
37               StringOrdinalHasCorrectMaxDigit);
38COMPILE_ASSERT(StringOrdinal::kMidDigitValue == 13,
39               StringOrdinalHasCorrectMidDigitValue);
40COMPILE_ASSERT(StringOrdinal::kMaxDigitValue == 25,
41               StringOrdinalHasCorrectMaxDigitValue);
42COMPILE_ASSERT(StringOrdinal::kRadix == 26,
43               StringOrdinalHasCorrectRadix);
44
45}  // namespace syncer
46
47#endif  // SYNC_API_STRING_ORDINAL_H_
48