#pragma once
#include <cassert>
+
#include "port/likely.h"
#include "rocksdb/cache.h"
#include "rocksdb/cleanable.h"
template <class T>
class CachableEntry {
-public:
+ public:
CachableEntry() = default;
CachableEntry(T* value, Cache* cache, Cache::Handle* cache_handle,
- bool own_value)
- : value_(value)
- , cache_(cache)
- , cache_handle_(cache_handle)
- , own_value_(own_value)
- {
+ bool own_value)
+ : value_(value),
+ cache_(cache),
+ cache_handle_(cache_handle),
+ own_value_(own_value) {
assert(value_ != nullptr ||
- (cache_ == nullptr && cache_handle_ == nullptr && !own_value_));
+ (cache_ == nullptr && cache_handle_ == nullptr && !own_value_));
assert(!!cache_ == !!cache_handle_);
assert(!cache_handle_ || !own_value_);
}
CachableEntry(const CachableEntry&) = delete;
CachableEntry& operator=(const CachableEntry&) = delete;
- CachableEntry(CachableEntry&& rhs)
- : value_(rhs.value_)
- , cache_(rhs.cache_)
- , cache_handle_(rhs.cache_handle_)
- , own_value_(rhs.own_value_)
- {
+ CachableEntry(CachableEntry&& rhs) noexcept
+ : value_(rhs.value_),
+ cache_(rhs.cache_),
+ cache_handle_(rhs.cache_handle_),
+ own_value_(rhs.own_value_) {
assert(value_ != nullptr ||
- (cache_ == nullptr && cache_handle_ == nullptr && !own_value_));
+ (cache_ == nullptr && cache_handle_ == nullptr && !own_value_));
assert(!!cache_ == !!cache_handle_);
assert(!cache_handle_ || !own_value_);
rhs.ResetFields();
}
- CachableEntry& operator=(CachableEntry&& rhs) {
+ CachableEntry& operator=(CachableEntry&& rhs) noexcept {
if (UNLIKELY(this == &rhs)) {
return *this;
}
own_value_ = rhs.own_value_;
assert(value_ != nullptr ||
- (cache_ == nullptr && cache_handle_ == nullptr && !own_value_));
+ (cache_ == nullptr && cache_handle_ == nullptr && !own_value_));
assert(!!cache_ == !!cache_handle_);
assert(!cache_handle_ || !own_value_);
return *this;
}
- ~CachableEntry() {
- ReleaseResource();
- }
+ ~CachableEntry() { ReleaseResource(); }
bool IsEmpty() const {
return value_ == nullptr && cache_ == nullptr && cache_handle_ == nullptr &&
- !own_value_;
+ !own_value_;
}
bool IsCached() const {
ResetFields();
}
- void SetOwnedValue(T* value) {
- assert(value != nullptr);
+ void SetOwnedValue(std::unique_ptr<T>&& value) {
+ assert(value.get() != nullptr);
- if (UNLIKELY(value_ == value && own_value_)) {
+ if (UNLIKELY(value_ == value.get() && own_value_)) {
assert(cache_ == nullptr && cache_handle_ == nullptr);
return;
}
Reset();
- value_ = value;
+ value_ = value.release();
own_value_ = true;
}
}
void SetCachedValue(T* value, Cache* cache, Cache::Handle* cache_handle) {
- assert(value != nullptr);
assert(cache != nullptr);
assert(cache_handle != nullptr);
assert(!own_value_);
}
-private:
- void ReleaseResource() {
+ void UpdateCachedValue() {
+ assert(cache_ != nullptr);
+ assert(cache_handle_ != nullptr);
+
+ value_ = static_cast<T*>(cache_->Value(cache_handle_));
+ }
+
+ bool IsReady() {
+ if (!own_value_) {
+ assert(cache_ != nullptr);
+ assert(cache_handle_ != nullptr);
+ return cache_->IsReady(cache_handle_);
+ }
+ return true;
+ }
+
+ private:
+ void ReleaseResource() noexcept {
if (LIKELY(cache_handle_ != nullptr)) {
assert(cache_ != nullptr);
cache_->Release(cache_handle_);
}
}
- void ResetFields() {
+ void ResetFields() noexcept {
value_ = nullptr;
cache_ = nullptr;
cache_handle_ = nullptr;
delete static_cast<T*>(arg1);
}
-private:
+ private:
T* value_ = nullptr;
Cache* cache_ = nullptr;
Cache::Handle* cache_handle_ = nullptr;