// 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. // // Defines ChangeReorderBuffer, which can be used to sort a list of item // actions to achieve the ordering constraint required by the SyncObserver // interface of the SyncAPI. #ifndef SYNC_INTERNAL_API_CHANGE_REORDER_BUFFER_H_ #define SYNC_INTERNAL_API_CHANGE_REORDER_BUFFER_H_ #include <map> #include <vector> #include "base/compiler_specific.h" #include "base/memory/linked_ptr.h" #include "sync/internal_api/public/change_record.h" #include "sync/protocol/sync.pb.h" namespace syncer { class BaseTransaction; // ChangeReorderBuffer is a utility type which accepts an unordered set // of changes (via its Push methods), and yields an ImmutableChangeRecordList // (via the GetAllChangesInTreeOrder method) that are in the order that // the SyncObserver expects them to be. A buffer is initially empty. // // The ordering produced by ChangeReorderBuffer is as follows: // (a) All Deleted items appear first. // (b) For Updated and/or Added items, parents appear before their children. // // The sibling order is not necessarily preserved. class ChangeReorderBuffer { public: ChangeReorderBuffer(); ~ChangeReorderBuffer(); // Insert an item, identified by the metahandle |id|, into the reorder buffer. // This item will appear in the output list as an ACTION_ADD ChangeRecord. void PushAddedItem(int64 id); // Insert an item, identified by the metahandle |id|, into the reorder buffer. // This item will appear in the output list as an ACTION_DELETE ChangeRecord. void PushDeletedItem(int64 id); // Insert an item, identified by the metahandle |id|, into the reorder buffer. // This item will appear in the output list as an ACTION_UPDATE ChangeRecord. void PushUpdatedItem(int64 id); void SetExtraDataForId(int64 id, ExtraPasswordChangeRecordData* extra); void SetSpecificsForId(int64 id, const sync_pb::EntitySpecifics& specifics); // Reset the buffer, forgetting any pushed items, so that it can be used again // to reorder a new set of changes. void Clear(); bool IsEmpty() const; // Output a reordered list of changes to |changes| using the items // that were pushed into the reorder buffer. |sync_trans| is used to // determine the ordering. Returns true if successful, or false if // an error was encountered. bool GetAllChangesInTreeOrder( const BaseTransaction* sync_trans, ImmutableChangeRecordList* changes) WARN_UNUSED_RESULT; private: class Traversal; typedef std::map<int64, ChangeRecord::Action> OperationMap; typedef std::map<int64, sync_pb::EntitySpecifics> SpecificsMap; typedef std::map<int64, linked_ptr<ExtraPasswordChangeRecordData> > ExtraDataMap; // Stores the items that have been pushed into the buffer, and the type of // operation that was associated with them. OperationMap operations_; // Stores entity-specific ChangeRecord data per-ID. SpecificsMap specifics_; // Stores type-specific extra data per-ID. ExtraDataMap extra_data_; DISALLOW_COPY_AND_ASSIGN(ChangeReorderBuffer); }; } // namespace syncer #endif // SYNC_INTERNAL_API_CHANGE_REORDER_BUFFER_H_