attachment_id.h revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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
15namespace sync_pb {
16class AttachmentIdProto;
17}  // namespace sync_pb
18
19namespace syncer {
20
21// Uniquely identifies an attachment.
22//
23// Two attachments with equal (operator==) AttachmentIds are considered
24// equivalent.
25class 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 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
68typedef std::vector<AttachmentId> AttachmentIdList;
69typedef std::set<AttachmentId> AttachmentIdSet;
70
71}  // namespace syncer
72
73#endif  // SYNC_API_ATTACHMENTS_ATTACHMENT_ID_H_
74