Index: sync/internal_api/public/base/unique_position.h |
diff --git a/sync/internal_api/public/base/unique_position.h b/sync/internal_api/public/base/unique_position.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..959164f403cfa5af9cf4ac8db44696c4476de1f4 |
--- /dev/null |
+++ b/sync/internal_api/public/base/unique_position.h |
@@ -0,0 +1,118 @@ |
+// 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. |
+ |
+#ifndef SYNC_INTERNAL_API_PUBLIC_BASE_UNIQUE_POSITION_H_ |
+#define SYNC_INTERNAL_API_PUBLIC_BASE_UNIQUE_POSITION_H_ |
+ |
+#include <string> |
+ |
+#include "base/basictypes.h" |
+ |
+namespace syncer { |
+ |
+// A class to represent positions. |
+// |
+// By relying on the existence of unique suffixes, this class can ensure that it |
+// is always possible to create a new position between any two existing |
+// positions. It can also create new positions before or after any other |
+// position, which makes it easier to support insertion at the head or tail of a |
+// list. |
+// |
+// Note that these unique suffixes must be exactly |kSuffixLength| bytes long. |
+// |
+// The cost for all these features is potentially unbounded space usage. In |
+// practice, however, most ordinals should be not much longer than the suffix. |
+// |
+// This class currently has several bookmarks-related assumptions built in, |
+// though it could be adapted to be more generally useful. |
+class UniquePosition { |
+ public: |
+ static const size_t kSuffixLength = (64 + 128) / 8; |
+ static const char kTerminatorByte = kuint8max; |
+ |
+ static bool IsValidSuffix(const std::string& suffix); |
+ static bool IsValidBytes(const std::string& bytes); |
+ |
+ // Returns an invalid position. |
+ static UniquePosition CreateInvalid(); |
+ |
+ // Converts bytes from 'ToInternalValue()' back into a UniquePosition. |
+ static UniquePosition FromBytes(const std::string& bytes); |
+ |
+ // Creates a position with the given suffix. Ordering among positions created |
+ // from this function is the same as that of the integer parameters that were |
+ // passed in. |
+ static UniquePosition FromInt64(int64 i, const std::string& suffix); |
+ |
+ // Returns a valid position. Its ordering is not defined. |
+ static UniquePosition InitialPosition(const std::string& suffix); |
+ |
+ // Returns positions compare smaller than, greater than, or between the input |
+ // positions. |
+ static UniquePosition Before(const UniquePosition& x, |
+ const std::string& suffix); |
+ static UniquePosition After(const UniquePosition& x, |
+ const std::string& suffix); |
+ static UniquePosition Between(const UniquePosition& before, |
+ const UniquePosition& after, |
+ const std::string& suffix); |
+ |
+ // Create a random suffix. Should be used only as a last resort. |
+ static const std::string GenerateUniqueSuffix(); |
+ |
+ // Create a unique suffix based on the input parameters. The parameters are |
+ // sufficient to uniquely identify any bookmark within the database. |
+ static const std::string GenerateBookmarkSuffix( |
+ const std::string& decoded_originator_cache_guid, |
+ int64 numeric_originator_item_id); |
+ |
+ UniquePosition(); |
+ |
+ bool LessThan(const UniquePosition& other) const; |
+ bool Equals(const UniquePosition& other) const; |
+ |
+ // Serializes the position's internal state. To be used with FromBytes(). |
+ const std::string& ToInternalValue() const; |
+ |
+ // Returns a human-readable representation of this item's internal state. |
+ std::string ToDebugString() const; |
+ |
+ // Performs a lossy conversion to an int64 position. Positions converted to |
+ // and from int64s using this and the FromInt64 function should maintain their |
+ // relative orderings unless the int64 values conflict. |
+ int64 ToInt64() const; |
+ |
+ bool IsValid() const; |
+ |
+ private: |
+ friend class UniquePositionTest; |
+ |
+ // Returns a string X such that (X ++ |suffix| ++ |kTerminatorByte|) < |str|. |
+ // |str| must be a trailing substring of a valid ordinal. |
+ // |suffix| must be a valid unique suffix. |
+ static std::string FindSmallerWithSuffix(const std::string& str, |
+ const std::string& suffix); |
+ // Returns a string X such that (X ++ |suffix| ++ |kTerminatorByte|) > |str|. |
+ // |str| must be a trailing substring of a valid ordinal. |
+ // |suffix| must be a valid unique suffix. |
+ static std::string FindGreaterWithSuffix(const std::string& str, |
+ const std::string& suffix); |
+ // Returns a string X such that |
+ // |before| < (X ++ |suffix| ++ |kTerminatorByte|) < |after|. |
+ // |before| and after must be a trailing substrings of valid ordinals. |
+ // |suffix| must be a valid unique suffix. |
+ static std::string FindBetweenWithSuffix(const std::string& before, |
+ const std::string& after, |
+ const std::string& suffix); |
+ |
+ explicit UniquePosition(const std::string& internal_rep); |
+ UniquePosition(const std::string& prefix, const std::string& suffix); |
+ |
+ std::string bytes_; |
+ bool is_valid_; |
+}; |
+ |
+} // namespace syncer; |
+ |
+#endif // SYNC_INTERNAL_API_PUBLIC_BASE_UNIQUE_POSITION_H_ |