Add Google's LevelDB support
[novacoin.git] / src / leveldb / db / snapshot.h
1 // Copyright (c) 2011 The LevelDB 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. See the AUTHORS file for names of contributors.
4
5 #ifndef STORAGE_LEVELDB_DB_SNAPSHOT_H_
6 #define STORAGE_LEVELDB_DB_SNAPSHOT_H_
7
8 #include "leveldb/db.h"
9
10 namespace leveldb {
11
12 class SnapshotList;
13
14 // Snapshots are kept in a doubly-linked list in the DB.
15 // Each SnapshotImpl corresponds to a particular sequence number.
16 class SnapshotImpl : public Snapshot {
17  public:
18   SequenceNumber number_;  // const after creation
19
20  private:
21   friend class SnapshotList;
22
23   // SnapshotImpl is kept in a doubly-linked circular list
24   SnapshotImpl* prev_;
25   SnapshotImpl* next_;
26
27   SnapshotList* list_;                 // just for sanity checks
28 };
29
30 class SnapshotList {
31  public:
32   SnapshotList() {
33     list_.prev_ = &list_;
34     list_.next_ = &list_;
35   }
36
37   bool empty() const { return list_.next_ == &list_; }
38   SnapshotImpl* oldest() const { assert(!empty()); return list_.next_; }
39   SnapshotImpl* newest() const { assert(!empty()); return list_.prev_; }
40
41   const SnapshotImpl* New(SequenceNumber seq) {
42     SnapshotImpl* s = new SnapshotImpl;
43     s->number_ = seq;
44     s->list_ = this;
45     s->next_ = &list_;
46     s->prev_ = list_.prev_;
47     s->prev_->next_ = s;
48     s->next_->prev_ = s;
49     return s;
50   }
51
52   void Delete(const SnapshotImpl* s) {
53     assert(s->list_ == this);
54     s->prev_->next_ = s->next_;
55     s->next_->prev_ = s->prev_;
56     delete s;
57   }
58
59  private:
60   // Dummy head of doubly-linked list of snapshots
61   SnapshotImpl list_;
62 };
63
64 }  // namespace leveldb
65
66 #endif  // STORAGE_LEVELDB_DB_SNAPSHOT_H_