| 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..bc6ff1a9f09a395ddae32942615fc48da41ab783
|
| --- /dev/null
|
| +++ b/sync/internal_api/public/base/unique_position.h
|
| @@ -0,0 +1,115 @@
|
| +// 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.
|
| +//
|
| +// Valid UniquePosition objects have the following properties:
|
| +//
|
| +// - a < b and b < c implies a < c (transitivity);
|
| +// - exactly one of a < b, b < a and a = b holds (trichotomy);
|
| +// - if a < b, there is a UniquePosition such that a < x < b (density);
|
| +// - there are UniquePositions x and y such that x < a < y (unboundedness);
|
| +// - if a and b were constructed with different unique suffixes, then a != b.
|
| +//
|
| +// As long as all UniquePositions used to sort a list were created with unique
|
| +// suffixes, then if any item changes its position in the list, only its
|
| +// UniquePosition value has to change to represent the new order, and all other
|
| +// values can stay the same.
|
| +//
|
| +// Note that the 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;
|
| +
|
| + 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);
|
| +
|
| + // This constructor creates an invalid value.
|
| + 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|) < |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|) > |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|) < |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_
|
|
|