table_iterator.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // Copyright (c) Meta Platforms, Inc. and affiliates.
  2. //
  3. // This source code is licensed under both the GPLv2 (found in the
  4. // COPYING file in the root directory) and Apache 2.0 License
  5. // (found in the LICENSE.Apache file in the root directory).
  6. #pragma once
  7. #include "rocksdb/iterator.h"
  8. #include "table/internal_iterator.h"
  9. namespace ROCKSDB_NAMESPACE {
  10. // An iterator wrapper class used to wrap an `InternalIterator` created by API
  11. // `TableReader::NewIterator`. The `InternalIterator` should be allocated with
  12. // the default allocator, not on an arena.
  13. // NOTE: Callers should ensure the wrapped `InternalIterator*` is a valid
  14. // pointer before constructing a `TableIterator` with it.
  15. class TableIterator : public Iterator {
  16. void reset(InternalIterator* iter) noexcept {
  17. if (iter_ != nullptr) {
  18. delete iter_;
  19. }
  20. iter_ = iter;
  21. }
  22. public:
  23. explicit TableIterator(InternalIterator* iter) : iter_(iter) {}
  24. TableIterator(const TableIterator&) = delete;
  25. TableIterator& operator=(const TableIterator&) = delete;
  26. TableIterator(TableIterator&& o) noexcept {
  27. iter_ = o.iter_;
  28. o.iter_ = nullptr;
  29. }
  30. TableIterator& operator=(TableIterator&& o) noexcept {
  31. reset(o.iter_);
  32. o.iter_ = nullptr;
  33. return *this;
  34. }
  35. InternalIterator* operator->() { return iter_; }
  36. InternalIterator* get() { return iter_; }
  37. ~TableIterator() override { reset(nullptr); }
  38. bool Valid() const override { return iter_->Valid(); }
  39. void SeekToFirst() override { return iter_->SeekToFirst(); }
  40. void SeekToLast() override { return iter_->SeekToLast(); }
  41. void Seek(const Slice& target) override { return iter_->Seek(target); }
  42. void SeekForPrev(const Slice& target) override {
  43. return iter_->SeekForPrev(target);
  44. }
  45. void Next() override { return iter_->Next(); }
  46. void Prev() override { return iter_->Prev(); }
  47. Slice key() const override { return iter_->key(); }
  48. Slice value() const override { return iter_->value(); }
  49. Status status() const override { return iter_->status(); }
  50. Status GetProperty(std::string /*prop_name*/,
  51. std::string* /*prop*/) override {
  52. assert(false);
  53. return Status::NotSupported("TableIterator does not support GetProperty.");
  54. }
  55. private:
  56. InternalIterator* iter_;
  57. };
  58. } // namespace ROCKSDB_NAMESPACE