50 lines
1.3 KiB
C++
50 lines
1.3 KiB
C++
|
#pragma once
|
||
|
|
||
|
#include <atomic>
|
||
|
|
||
|
#include "storage/indexes/index_base.hpp"
|
||
|
#include "utils/option.hpp"
|
||
|
#include "utils/option_ptr.hpp"
|
||
|
|
||
|
namespace tx
|
||
|
{
|
||
|
class Transaction;
|
||
|
}
|
||
|
|
||
|
// Holds onde index which can be changed.
|
||
|
// TG - type group
|
||
|
// K - key of index_records
|
||
|
template <class TG, class K>
|
||
|
class IndexHolder
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
IndexHolder() = default;
|
||
|
|
||
|
IndexHolder(IndexHolder const &) = delete;
|
||
|
|
||
|
IndexHolder(IndexHolder &&) = default;
|
||
|
|
||
|
// Sets index for this property family. Treturns false if index is already
|
||
|
// present.
|
||
|
bool set_index(std::unique_ptr<IndexBase<TG, K>> inx);
|
||
|
|
||
|
// Returns index for read only if it is present and it's valid for read.
|
||
|
OptionPtr<IndexBase<TG, K>> get_read() const;
|
||
|
|
||
|
// Returns index for write only if it's present and transaction is
|
||
|
// responsibly for updating it.
|
||
|
OptionPtr<IndexBase<TG, K>> get_write(const tx::Transaction &t) const;
|
||
|
|
||
|
// Removes index if it is given index. Caller is now responsable of
|
||
|
// disposing index in a safe way.
|
||
|
Option<std::unique_ptr<IndexBase<TG, K>>>
|
||
|
remove_index(IndexBase<TG, K> *index);
|
||
|
|
||
|
// Caller is now responsable of disposing index in a safe way.
|
||
|
Option<std::unique_ptr<IndexBase<TG, K>>> remove_index();
|
||
|
|
||
|
private:
|
||
|
std::atomic<IndexBase<TG, K> *> index = {nullptr};
|
||
|
};
|