HIBF 1.0.0-rc.1
Loading...
Searching...
No Matches
insert_iterator.hpp
1// SPDX-FileCopyrightText: 2006-2024, Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2024, 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 <cinttypes> // for uint64_t
9#include <cstddef> // for ptrdiff_t
10#include <functional> // for equal_to
11#include <iterator> // for output_iterator_tag
12#include <memory> // for addressof
13#include <vector> // for vector
14
15#include <hibf/contrib/robin_hood.hpp> // for unordered_flat_set, hash
16#include <hibf/platform.hpp>
17
18// IWYU pragma: private, include <hibf/config.hpp>
19
20namespace seqan::hibf
21{
22
24{
25public:
27 using value_type = void;
28 using difference_type = ptrdiff_t;
29 using pointer = void;
30 using reference = void;
31
32 insert_iterator() = delete;
33 insert_iterator(insert_iterator const &) = default;
34 insert_iterator(insert_iterator &&) = default;
35 insert_iterator & operator=(insert_iterator const &) = default;
36 insert_iterator & operator=(insert_iterator &&) = default;
37 ~insert_iterator() = default;
38
39 explicit constexpr insert_iterator(robin_hood::unordered_flat_set<uint64_t> & set) :
40 set{std::addressof(set)},
41 is_set{true}
42 {}
43
44 explicit constexpr insert_iterator(std::vector<uint64_t> & vec) : vec{std::addressof(vec)}, is_set{false}
45 {}
46
47 insert_iterator & operator=(uint64_t const value) noexcept
48 {
49 if (is_set)
50 {
51 assert(set != nullptr);
52 set->emplace(value);
53 }
54 else
55 {
56 assert(vec != nullptr);
57 vec->emplace_back(value);
58 }
59 return *this;
60 }
61
62 [[nodiscard]] constexpr insert_iterator & operator*() noexcept
63 {
64 return *this;
65 }
66
67 constexpr insert_iterator & operator++() noexcept
68 {
69 return *this;
70 }
71
72 constexpr insert_iterator operator++(int) noexcept
73 {
74 return *this;
75 }
76
77private:
78 robin_hood::unordered_flat_set<uint64_t> * set{nullptr};
79 std::vector<uint64_t> * vec{nullptr};
80 bool is_set{false};
81};
82
83} // namespace seqan::hibf
T addressof(T... args)
Definition insert_iterator.hpp:24
T emplace_back(T... args)
Provides platform and dependency checks.