mirror of
https://github.com/facebook/rocksdb.git
synced 2024-11-28 05:43:50 +00:00
917e98ff9e
Summary: Pull Request resolved: https://github.com/facebook/rocksdb/pull/13052 Currently, `MultiCfIteratorImpl` uses `std::function`s for `reset_func_` and `populate_func_`, which uses type erasure and has a performance overhead. The patch turns `MultiCfIteratorImpl` into a template that takes the two function object types as template parameters, and changes `AttributeGroupIteratorImpl` and `CoalescingIterator` so they pass in function objects of named types (as opposed to lambdas). Reviewed By: jaykorean Differential Revision: D63802598 fbshipit-source-id: e202f6d80c9054335e5b2571051a67a9e012c2d0
107 lines
3.3 KiB
C++
107 lines
3.3 KiB
C++
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
// This source code is licensed under both the GPLv2 (found in the
|
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
// (found in the LICENSE.Apache file in the root directory).
|
|
|
|
#pragma once
|
|
|
|
#include "db/multi_cf_iterator_impl.h"
|
|
#include "rocksdb/attribute_groups.h"
|
|
|
|
namespace ROCKSDB_NAMESPACE {
|
|
|
|
class AttributeGroupIteratorImpl : public AttributeGroupIterator {
|
|
public:
|
|
AttributeGroupIteratorImpl(
|
|
const Comparator* comparator,
|
|
const std::vector<ColumnFamilyHandle*>& column_families,
|
|
const std::vector<Iterator*>& child_iterators)
|
|
: impl_(comparator, column_families, child_iterators, ResetFunc(this),
|
|
PopulateFunc(this)) {}
|
|
~AttributeGroupIteratorImpl() override {}
|
|
|
|
// No copy allowed
|
|
AttributeGroupIteratorImpl(const AttributeGroupIteratorImpl&) = delete;
|
|
AttributeGroupIteratorImpl& operator=(const AttributeGroupIteratorImpl&) =
|
|
delete;
|
|
|
|
bool Valid() const override { return impl_.Valid(); }
|
|
void SeekToFirst() override { impl_.SeekToFirst(); }
|
|
void SeekToLast() override { impl_.SeekToLast(); }
|
|
void Seek(const Slice& target) override { impl_.Seek(target); }
|
|
void SeekForPrev(const Slice& target) override { impl_.SeekForPrev(target); }
|
|
void Next() override { impl_.Next(); }
|
|
void Prev() override { impl_.Prev(); }
|
|
Slice key() const override { return impl_.key(); }
|
|
Status status() const override { return impl_.status(); }
|
|
|
|
const IteratorAttributeGroups& attribute_groups() const override {
|
|
assert(Valid());
|
|
return attribute_groups_;
|
|
}
|
|
|
|
void Reset() { attribute_groups_.clear(); }
|
|
|
|
private:
|
|
class ResetFunc {
|
|
public:
|
|
explicit ResetFunc(AttributeGroupIteratorImpl* iter) : iter_(iter) {}
|
|
|
|
void operator()() const {
|
|
assert(iter_);
|
|
iter_->Reset();
|
|
}
|
|
|
|
private:
|
|
AttributeGroupIteratorImpl* iter_;
|
|
};
|
|
|
|
class PopulateFunc {
|
|
public:
|
|
explicit PopulateFunc(AttributeGroupIteratorImpl* iter) : iter_(iter) {}
|
|
|
|
void operator()(const autovector<MultiCfIteratorInfo>& items) const {
|
|
assert(iter_);
|
|
iter_->AddToAttributeGroups(items);
|
|
}
|
|
|
|
private:
|
|
AttributeGroupIteratorImpl* iter_;
|
|
};
|
|
|
|
MultiCfIteratorImpl<ResetFunc, PopulateFunc> impl_;
|
|
IteratorAttributeGroups attribute_groups_;
|
|
void AddToAttributeGroups(const autovector<MultiCfIteratorInfo>& items);
|
|
};
|
|
|
|
class EmptyAttributeGroupIterator : public AttributeGroupIterator {
|
|
public:
|
|
explicit EmptyAttributeGroupIterator(const Status& s) : status_(s) {}
|
|
bool Valid() const override { return false; }
|
|
void Seek(const Slice& /*target*/) override {}
|
|
void SeekForPrev(const Slice& /*target*/) override {}
|
|
void SeekToFirst() override {}
|
|
void SeekToLast() override {}
|
|
void Next() override { assert(false); }
|
|
void Prev() override { assert(false); }
|
|
Slice key() const override {
|
|
assert(false);
|
|
return Slice();
|
|
}
|
|
Status status() const override { return status_; }
|
|
|
|
const IteratorAttributeGroups& attribute_groups() const override {
|
|
return kNoIteratorAttributeGroups;
|
|
}
|
|
|
|
private:
|
|
Status status_;
|
|
};
|
|
|
|
inline std::unique_ptr<AttributeGroupIterator> NewAttributeGroupErrorIterator(
|
|
const Status& status) {
|
|
return std::make_unique<EmptyAttributeGroupIterator>(status);
|
|
}
|
|
|
|
} // namespace ROCKSDB_NAMESPACE
|