Skip to content

Commit

Permalink
Split EPTree and EPTreeIterator to different files (#65)
Browse files Browse the repository at this point in the history
  • Loading branch information
koolkdev authored May 4, 2024
1 parent b3adceb commit 47fd413
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 89 deletions.
47 changes: 0 additions & 47 deletions src/eptree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,53 +9,6 @@

#include "eptree.h"

EPTreeIterator& EPTreeIterator::operator++() {
assert(!is_end());
auto rnode = nodes_.rbegin();
while ((++rnode->iterator).is_end()) {
if (++rnode == nodes_.rend()) {
while (--rnode != nodes_.rbegin())
--rnode->iterator;
return *this; // end
}
}
uint32_t node_block_number = (*rnode->iterator).value;
for (auto node = rnode.base(); node != nodes_.end(); ++node) {
*node = {allocator_->LoadAllocatorBlock(node_block_number)};
node->iterator = node->node->begin();
node_block_number = (*node->iterator).value;
}
return *this;
}

EPTreeIterator& EPTreeIterator::operator--() {
assert(!is_begin());
auto rnode = nodes_.rbegin();
for (; rnode->iterator.is_begin(); rnode++) {
if (rnode == nodes_.rend())
return *this; // begin
}
uint32_t node_block_number = (*--rnode->iterator).value;
for (auto node = rnode.base(); node != nodes_.end(); ++node) {
*node = {allocator_->LoadAllocatorBlock(node_block_number)};
node->iterator = node->node->end();
node_block_number = (*--node->iterator).value;
}
return *this;
}

EPTreeIterator EPTreeIterator::operator++(int) {
EPTreeIterator tmp(*this);
++(*this);
return tmp;
}

EPTreeIterator EPTreeIterator::operator--(int) {
EPTreeIterator tmp(*this);
--(*this);
return tmp;
}

void EPTree::Init(uint32_t block_number) {
RTree{block()}.Init(1, block_number);
}
Expand Down
43 changes: 1 addition & 42 deletions src/eptree.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,51 +7,10 @@

#pragma once

#include <iterator>
#include <memory>
#include <vector>

#include "eptree_iterator.h"
#include "free_blocks_allocator.h"
#include "rtree.h"

class EPTreeIterator {
public:
using iterator_category = std::bidirectional_iterator_tag;
using difference_type = int;
using value_type = RTree::iterator::value_type;

using reference = RTree::iterator::reference;

using node_info = node_iterator_info<RTree>;

EPTreeIterator() = default;

EPTreeIterator(FreeBlocksAllocator* allocator, std::vector<node_info> nodes)
: allocator_(allocator), nodes_(std::move(nodes)) {}

reference operator*() const { return *nodes_.back().iterator; }

EPTreeIterator& operator++();
EPTreeIterator& operator--();
EPTreeIterator operator++(int);
EPTreeIterator operator--(int);

bool operator==(const EPTreeIterator& other) const { return nodes_.back().iterator == other.nodes_.back().iterator; }

std::vector<node_info>& nodes() { return nodes_; };
const std::vector<node_info>& nodes() const { return nodes_; };

bool is_begin() const {
return std::ranges::all_of(nodes_, [](const node_info& node) { return node.iterator.is_begin(); });
}
bool is_end() const { return nodes_.back().iterator.is_end(); }

private:
FreeBlocksAllocator* allocator_;

std::vector<node_info> nodes_;
};
static_assert(std::bidirectional_iterator<EPTreeIterator>);

class EPTree : public EPTreeBlock {
public:
Expand Down
57 changes: 57 additions & 0 deletions src/eptree_iterator.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*
* Copyright (C) 2024 koolkdev
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/

#include "eptree_iterator.h"

#include "free_blocks_allocator.h"

EPTreeIterator& EPTreeIterator::operator++() {
assert(!is_end());
auto rnode = nodes_.rbegin();
while ((++rnode->iterator).is_end()) {
if (++rnode == nodes_.rend()) {
while (--rnode != nodes_.rbegin())
--rnode->iterator;
return *this; // end
}
}
uint32_t node_block_number = (*rnode->iterator).value;
for (auto node = rnode.base(); node != nodes_.end(); ++node) {
*node = {allocator_->LoadAllocatorBlock(node_block_number)};
node->iterator = node->node->begin();
node_block_number = (*node->iterator).value;
}
return *this;
}

EPTreeIterator& EPTreeIterator::operator--() {
assert(!is_begin());
auto rnode = nodes_.rbegin();
for (; rnode->iterator.is_begin(); rnode++) {
if (rnode == nodes_.rend())
return *this; // begin
}
uint32_t node_block_number = (*--rnode->iterator).value;
for (auto node = rnode.base(); node != nodes_.end(); ++node) {
*node = {allocator_->LoadAllocatorBlock(node_block_number)};
node->iterator = node->node->end();
node_block_number = (*--node->iterator).value;
}
return *this;
}

EPTreeIterator EPTreeIterator::operator++(int) {
EPTreeIterator tmp(*this);
++(*this);
return tmp;
}

EPTreeIterator EPTreeIterator::operator--(int) {
EPTreeIterator tmp(*this);
--(*this);
return tmp;
}
55 changes: 55 additions & 0 deletions src/eptree_iterator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* Copyright (C) 2024 koolkdev
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/

#pragma once

#include <iterator>
#include <memory>
#include <vector>

#include "rtree.h"

class FreeBlocksAllocator;

class EPTreeIterator {
public:
using iterator_category = std::bidirectional_iterator_tag;
using difference_type = int;
using value_type = RTree::iterator::value_type;

using reference = RTree::iterator::reference;

using node_info = node_iterator_info<RTree>;

EPTreeIterator() = default;

EPTreeIterator(FreeBlocksAllocator* allocator, std::vector<node_info> nodes)
: allocator_(allocator), nodes_(std::move(nodes)) {}

reference operator*() const { return *nodes_.back().iterator; }

EPTreeIterator& operator++();
EPTreeIterator& operator--();
EPTreeIterator operator++(int);
EPTreeIterator operator--(int);

bool operator==(const EPTreeIterator& other) const { return nodes_.back().iterator == other.nodes_.back().iterator; }

std::vector<node_info>& nodes() { return nodes_; };
const std::vector<node_info>& nodes() const { return nodes_; };

bool is_begin() const {
return std::ranges::all_of(nodes_, [](const node_info& node) { return node.iterator.is_begin(); });
}
bool is_end() const { return nodes_.back().iterator.is_end(); }

private:
FreeBlocksAllocator* allocator_;

std::vector<node_info> nodes_;
};
static_assert(std::bidirectional_iterator<EPTreeIterator>);

0 comments on commit 47fd413

Please sign in to comment.