HIBF 1.0.0-rc.1
All Classes Namespaces Files Functions Variables Typedefs Friends Macros Modules Pages Concepts
insert_iterator.hpp
1// SPDX-FileCopyrightText: 2006-2025, Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2025, Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <cassert> // for assert
8#include <cstddef> // for size_t, ptrdiff_t
9#include <cstdint> // for uint64_t, uint8_t
10#include <functional> // for function, equal_to
11#include <iterator> // for output_iterator_tag
12#include <memory> // for addressof
13
14#include <hibf/contrib/robin_hood.hpp> // for unordered_flat_set, hash
15#include <hibf/interleaved_bloom_filter.hpp> // for bin_index, interleaved_bloom_filter
16#include <hibf/platform.hpp>
17#include <hibf/sketch/hyperloglog.hpp> // for hyperloglog
18
19// IWYU pragma: private, include <hibf/config.hpp>
20
21namespace seqan::hibf
22{
23
25{
26public:
28 using value_type = void;
29 using difference_type = ptrdiff_t;
30 using pointer = void;
31 using reference = void;
32
33 constexpr insert_iterator() = default;
34 constexpr insert_iterator(insert_iterator const &) = default;
35 constexpr insert_iterator(insert_iterator &&) = default;
36 constexpr insert_iterator & operator=(insert_iterator const &) = default;
37 constexpr insert_iterator & operator=(insert_iterator &&) = default;
38 constexpr ~insert_iterator() = default;
39
40 using set_t = robin_hood::unordered_flat_set<uint64_t>;
43 using function_t = std::function<void(uint64_t const)>;
44
45 explicit constexpr insert_iterator(set_t & set) : ptr{std::addressof(set)}, type{data_type::unordered_set}
46 {}
47
48 explicit constexpr insert_iterator(sketch_t & sketch) : ptr{std::addressof(sketch)}, type{data_type::sketch}
49 {}
50
51 explicit constexpr insert_iterator(ibf_t & ibf, size_t ibf_bin_index) :
52 ptr{std::addressof(ibf)},
53 ibf_bin_idx{ibf_bin_index},
54 type{data_type::ibf}
55 {}
56
57 explicit constexpr insert_iterator(function_t & fun) : ptr{std::addressof(fun)}, type{data_type::function}
58 {}
59
60 [[gnu::always_inline, gnu::flatten]] inline insert_iterator & operator=(uint64_t const value) noexcept
61 {
62 assert(ptr != nullptr);
63
64 // NOLINTNEXTLINE(clang-diagnostic-switch-enum)
65 switch (type)
66 {
67 case data_type::unordered_set:
68 static_cast<set_t *>(ptr)->emplace(value);
69 break;
70 case data_type::sketch:
71 static_cast<sketch_t *>(ptr)->add(value);
72 break;
73 case data_type::ibf:
74 static_cast<ibf_t *>(ptr)->emplace(value, static_cast<bin_index>(ibf_bin_idx));
75 break;
76 default:
77 assert(type == data_type::function);
78 static_cast<function_t *>(ptr)->operator()(value);
79 }
80 return *this;
81 }
82
83 [[nodiscard]] constexpr insert_iterator & operator*() noexcept
84 {
85 return *this;
86 }
87
88 constexpr insert_iterator & operator++() noexcept
89 {
90 return *this;
91 }
92
93 constexpr insert_iterator operator++(int) noexcept
94 {
95 return *this;
96 }
97
98private:
99 void * ptr{nullptr};
100
101 enum class data_type : uint8_t
102 {
103 unordered_set,
104 sketch,
105 ibf,
106 function
107 };
108
109 size_t ibf_bin_idx{};
110 data_type type{};
111};
112
113} // namespace seqan::hibf
T addressof(T... args)
Definition insert_iterator.hpp:25
The IBF binning directory. A data structure that efficiently answers set-membership queries for multi...
Definition interleaved_bloom_filter.hpp:149
HyperLogLog estimates.
Definition hyperloglog.hpp:36
Provides seqan::hibf::sketch::hyperloglog.
Provides seqan::hibf::interleaved_bloom_filter.
Provides platform and dependency checks.
A strong type that represents the bin index for the seqan::hibf::interleaved_bloom_filter.
Definition interleaved_bloom_filter.hpp:73