diff options
| author | Douglas Rumbaugh <dbr4@psu.edu> | 2023-05-22 14:58:22 -0400 |
|---|---|---|
| committer | Douglas Rumbaugh <dbr4@psu.edu> | 2023-05-22 14:58:22 -0400 |
| commit | 0cf160ee68d37be93665e665ef22ae6e211a157d (patch) | |
| tree | badaca4c5654e7abbe9291b18b08748aeeadc518 /include/framework/RecordInterface.h | |
| parent | 08d6c84b9d69b500c964a8ff66e726e1f01f2095 (diff) | |
| download | dynamic-extension-0cf160ee68d37be93665e665ef22ae6e211a157d.tar.gz | |
More updates/restructuring
Diffstat (limited to 'include/framework/RecordInterface.h')
| -rw-r--r-- | include/framework/RecordInterface.h | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/include/framework/RecordInterface.h b/include/framework/RecordInterface.h new file mode 100644 index 0000000..8afd90a --- /dev/null +++ b/include/framework/RecordInterface.h @@ -0,0 +1,121 @@ +/* + * include/framework/RecordInterface.h + * + * Copyright (C) 2023 Douglas Rumbaugh <drumbaugh@psu.edu> + * Dong Xie <dongx@psu.edu> + * + * All rights reserved. Published under the Modified BSD License. + * + */ +#pragma once + +#include <cstring> +#include <concepts> + +#include "util/base.h" + +namespace de { + +template<typename R> +concept RecordInterface = requires(R r, R s) { + r.key; + r.value; + + { r < s } ->std::convertible_to<bool>; + { r == s } ->std::convertible_to<bool>; +}; + +template<RecordInterface R> +struct WrappedRecord { + R rec; + uint32_t header; + + inline void set_delete() { + header |= 2; + } + + inline bool is_deleted() const { + return header & 2; + } + + inline void set_tombstone(bool val=true) { + if (val) { + header |= val; + } else { + header &= 0; + } + } + + inline bool is_tombstone() const { + return header & 1; + } +}; + +template <typename R> +concept WeightedRecordInterface = RecordInterface<R> && requires(R r) { + {r.weight} -> std::convertible_to<double>; +}; + +template <typename K, typename V> +struct Record { + K key; + V value; + uint32_t header = 0; + + inline bool operator<(const Record& other) const { + return key < other.key || (key == other.key && value < other.value); + } + + inline bool operator==(const Record& other) const { + return key == other.key && value == other.value; + } +}; + +template <typename K, typename V, typename W> +struct WeightedRecord { + K key; + V value; + W weight = 1; + uint32_t header = 0; + + inline void set_delete() { + header |= 2; + } + + inline bool is_deleted() const { + return header & 2; + } + + inline void set_tombstone(bool val=true) { + if (val) { + header |= val; + } else { + header &= 0; + } + } + + inline bool is_tombstone() const { + return header & 1; + } + + inline int match(const WeightedRecord* other) const { + return key == other->key && value == other->value; + } + + inline bool operator<(const WeightedRecord& other) const { + return key < other.key || (key == other.key && value < other.value); + } + + inline bool operator==(const WeightedRecord& other) const { + return key == other.key && value == other.value; + } +}; + + +template <RecordInterface R> +static bool memtable_record_cmp(const R& a, const R& b) { + return (a.key < b.key) || (a.key == b.key && a.value < b.value) + || (a.key == b.key && a.value == b.value && a.header < b.header); +} + +} |