Packages
rocksdb
2.6.2
3.1.1
3.1.0
3.0.0
2.6.2
2.6.1
retired
2.6.0
retired
2.5.0
2.4.1
2.4.0
2.3.0
2.2.0
2.1.0
2.0.0
1.9.0
1.8.0
1.7.0
1.6.0
1.5.1
1.5.0
1.4.0
1.3.2
1.3.1
1.3.0
1.2.0
1.1.1
1.1.0
1.0.0
0.26.2
0.26.1
0.26.0
0.25.0
0.24.0
0.23.3
0.23.2
0.23.1
0.23.0
0.22.0
0.21.0
0.20.1
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.1
0.7.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
RocksDB for Erlang
Current section
Files
Jump to
Current section
Files
deps/rocksdb/util/vector_iterator.h
// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
#pragma once
#include <algorithm>
#include <string>
#include <vector>
#include "db/dbformat.h"
#include "rocksdb/comparator.h"
#include "rocksdb/iterator.h"
#include "rocksdb/slice.h"
#include "table/internal_iterator.h"
namespace ROCKSDB_NAMESPACE {
// Iterator over a vector of keys/values
class VectorIterator : public InternalIterator {
public:
VectorIterator(std::vector<std::string> keys, std::vector<std::string> values,
const CompareInterface* icmp = nullptr)
: keys_(std::move(keys)),
values_(std::move(values)),
current_(keys_.size()),
indexed_cmp_(icmp, &keys_) {
assert(keys_.size() == values_.size());
indices_.reserve(keys_.size());
for (size_t i = 0; i < keys_.size(); i++) {
indices_.push_back(i);
}
if (icmp != nullptr) {
std::sort(indices_.begin(), indices_.end(), indexed_cmp_);
}
}
bool Valid() const override {
return !indices_.empty() && current_ < indices_.size();
}
void SeekToFirst() override { current_ = 0; }
void SeekToLast() override { current_ = indices_.size() - 1; }
void Seek(const Slice& target) override {
if (indexed_cmp_.cmp != nullptr) {
current_ = std::lower_bound(indices_.begin(), indices_.end(), target,
indexed_cmp_) -
indices_.begin();
} else {
current_ =
std::lower_bound(keys_.begin(), keys_.end(), target.ToString()) -
keys_.begin();
}
}
void SeekForPrev(const Slice& target) override {
if (indexed_cmp_.cmp != nullptr) {
current_ = std::upper_bound(indices_.begin(), indices_.end(), target,
indexed_cmp_) -
indices_.begin();
} else {
current_ =
std::upper_bound(keys_.begin(), keys_.end(), target.ToString()) -
keys_.begin();
}
if (!Valid()) {
SeekToLast();
} else {
Prev();
}
}
void Next() override { current_++; }
void Prev() override { current_--; }
Slice key() const override { return Slice(keys_[indices_[current_]]); }
Slice value() const override { return Slice(values_[indices_[current_]]); }
Status status() const override { return Status::OK(); }
bool IsKeyPinned() const override { return true; }
bool IsValuePinned() const override { return true; }
protected:
std::vector<std::string> keys_;
std::vector<std::string> values_;
size_t current_;
private:
struct IndexedKeyComparator {
IndexedKeyComparator(const CompareInterface* c,
const std::vector<std::string>* ks)
: cmp(c), keys(ks) {}
bool operator()(size_t a, size_t b) const {
return cmp->Compare((*keys)[a], (*keys)[b]) < 0;
}
bool operator()(size_t a, const Slice& b) const {
return cmp->Compare((*keys)[a], b) < 0;
}
bool operator()(const Slice& a, size_t b) const {
return cmp->Compare(a, (*keys)[b]) < 0;
}
const CompareInterface* cmp;
const std::vector<std::string>* keys;
};
IndexedKeyComparator indexed_cmp_;
std::vector<size_t> indices_;
};
} // namespace ROCKSDB_NAMESPACE