github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/leveldb.chai2010/src/snapshot.h (about)

     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_