1 // Copyright 2014 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_ATTACHMENTS_ATTACHMENT_ID_H_ 6 #define SYNC_API_ATTACHMENTS_ATTACHMENT_ID_H_ 7 8 #include <set> 9 #include <string> 10 #include <vector> 11 12 #include "sync/base/sync_export.h" 13 #include "sync/internal_api/public/util/immutable.h" 14 15 namespace sync_pb { 16 class AttachmentIdProto; 17 } // namespace sync_pb 18 19 namespace syncer { 20 21 // Uniquely identifies an attachment. 22 // 23 // Two attachments with equal (operator==) AttachmentIds are considered 24 // equivalent. 25 class SYNC_EXPORT AttachmentId { 26 public: 27 ~AttachmentId(); 28 29 // Default copy and assignment are welcome. 30 31 bool operator==(const AttachmentId& other) const; 32 33 bool operator!=(const AttachmentId& other) const; 34 35 // Needed for using AttachmentId as key in std::map. 36 bool operator<(const AttachmentId& other) const; 37 38 // Creates a unique attachment id. 39 static AttachmentId Create(); 40 41 // Creates an attachment id from an initialized proto. 42 static AttachmentId CreateFromProto(const sync_pb::AttachmentIdProto& proto); 43 44 const sync_pb::AttachmentIdProto& GetProto() const; 45 46 private: 47 // Necessary since we forward-declare sync_pb::AttachmentIdProto; see comments 48 // in immutable.h. 49 struct SYNC_EXPORT ImmutableAttachmentIdProtoTraits { 50 typedef sync_pb::AttachmentIdProto* Wrapper; 51 static void InitializeWrapper(Wrapper* wrapper); 52 static void DestroyWrapper(Wrapper* wrapper); 53 static const sync_pb::AttachmentIdProto& Unwrap(const Wrapper& wrapper); 54 static sync_pb::AttachmentIdProto* UnwrapMutable(Wrapper* wrapper); 55 static void Swap(sync_pb::AttachmentIdProto* t1, 56 sync_pb::AttachmentIdProto* t2); 57 }; 58 59 typedef Immutable<sync_pb::AttachmentIdProto, 60 ImmutableAttachmentIdProtoTraits> 61 ImmutableAttachmentIdProto; 62 63 ImmutableAttachmentIdProto proto_; 64 65 AttachmentId(sync_pb::AttachmentIdProto* proto); 66 }; 67 68 typedef std::vector<AttachmentId> AttachmentIdList; 69 typedef std::set<AttachmentId> AttachmentIdSet; 70 71 } // namespace syncer 72 73 #endif // SYNC_API_ATTACHMENTS_ATTACHMENT_ID_H_ 74