Pixie
Loading...
Searching...
No Matches
sdsl_sct.h
1#pragma once
2
3#ifndef SDSL_SUPPORT
4#error "pixie/rmq/sdsl_sct.h requires SDSL_SUPPORT"
5#endif
6
7#include <pixie/rmq.h>
8
9#include <cstddef>
10#include <functional>
11#include <sdsl/io.hpp>
12#include <sdsl/rmq_succinct_sct.hpp>
13#include <span>
14#include <type_traits>
15
16namespace pixie::rmq {
17
48template <class T, class Compare = std::less<T>, class Index = std::size_t>
49class SdslSct : public RmqBase<SdslSct<T, Compare, Index>, T> {
50 public:
51 static_assert(std::is_same_v<Compare, std::less<T>>,
52 "SDSL SCT RMQ wrapper supports only std::less");
53
54 static constexpr std::size_t npos =
56
60 SdslSct() = default;
61
71 explicit SdslSct(std::span<const T> values, Compare compare = Compare())
72 : values_(values), rmq_(&values_) {
73 (void)compare;
74 }
75
79 std::size_t size_impl() const { return values_.size(); }
80
84 T value_at_impl(std::size_t position) const { return values_[position]; }
85
92 std::size_t arg_min_impl(std::size_t left, std::size_t right) const {
93 if (left >= right || right > values_.size()) {
94 return npos;
95 }
96 return static_cast<std::size_t>(rmq_(left, right - 1));
97 }
98
105 std::size_t memory_usage_bytes_impl() const {
106 sdsl::nullstream out;
107 return sizeof(*this) + static_cast<std::size_t>(rmq_.serialize(out));
108 }
109
110 private:
111 std::span<const T> values_;
112 sdsl::rmq_succinct_sct<true> rmq_;
113};
114
115} // namespace pixie::rmq
CRTP facade for static range-minimum-query indexes.
Definition rmq.h:28
SdslSct(std::span< const T > values, Compare compare=Compare())
Build the SDSL SCT index over values.
Definition sdsl_sct.h:71
std::size_t arg_min_impl(std::size_t left, std::size_t right) const
Return the first minimum position in [left, right).
Definition sdsl_sct.h:92
T value_at_impl(std::size_t position) const
Return the value at an indexed position.
Definition sdsl_sct.h:84
std::size_t size_impl() const
Return the number of indexed values.
Definition sdsl_sct.h:79
SdslSct()=default
Construct an empty SDSL SCT RMQ adapter.
std::size_t memory_usage_bytes_impl() const
Return owned auxiliary memory usage in bytes.
Definition sdsl_sct.h:105
Definition rmq.h:15
Common interface for static range-minimum-query indexes.