Thoth
A functional, expressive, asynchronous C++26 webdev library
Loading...
Searching...
No Matches
LinearMap.hpp
Go to the documentation of this file.
1// esse deixei pra IA fds, mó preguiça de fazer
2#pragma once
3
4#include <vector>
5#include <utility>
6#include <concepts>
7#include <functional>
8#include <compare>
9
10namespace Thoth::Dsa {
11
12 template <class Key, class Relation>
14 requires(Relation r, Key a, Key b) { { std::invoke(r, a, b) } -> std::same_as<std::strong_ordering>; }
15 || requires(Relation r, Key a, Key b) { { std::invoke(r, a, b) } -> std::convertible_to<bool>; };
16
17 // unfortunately I have to use snake_case here to it be similar to STL algorithms/containers.
18
19 template<class KeyT, class ValT, class Pred = std::less<>>
20 requires strong_order_relation<KeyT, Pred>
21 struct LinearMap {
22 using key_type = KeyT;
23 using mapped_type = ValT;
24 using value_type = std::pair<KeyT, ValT>;
25 using key_compare = Pred;
26 using container_type = std::vector<value_type>;
27 using iterator = container_type::iterator;
28 using const_iterator = container_type::const_iterator;
29 using size_type = container_type::size_type;
30
31 private:
32 container_type _data;
33 key_compare _compare;
34
35 struct PairComparator {
36 const key_compare& _comp;
37
38 template <class LookupKeyT>
39 constexpr bool operator()(const value_type& pair, const LookupKeyT& key) const {
40 return std::invoke(_comp, pair.first, key);
41 }
42
43 template <class LookupKeyT>
44 constexpr bool operator()(const LookupKeyT& key, const value_type& pair) const {
45 return std::invoke(_comp, key, pair.first);
46 }
47 };
48
49 template <class LookupKeyT>
50 constexpr iterator find_position(const LookupKeyT& key);
51
52 template <class LookupKeyT>
53 constexpr const_iterator find_position(const LookupKeyT& key) const;
54
55 template <class LookupKeyT>
56 constexpr bool is_equivalent(const_iterator it, const LookupKeyT& key) const;
57
58 public:
59 constexpr LinearMap() = default;
60 constexpr LinearMap(const LinearMap&) = default;
61 constexpr LinearMap(LinearMap&&) = default;
62
63 constexpr explicit LinearMap(const key_compare& comp);
64 constexpr LinearMap(std::initializer_list<value_type> init, const key_compare& comp = key_compare{});
65
66
67 constexpr LinearMap& operator=(const LinearMap&);
68 constexpr LinearMap& operator=(LinearMap&&) noexcept;
69
70 constexpr bool operator==(const LinearMap& other) const;
71
72
73 constexpr void clear();
74
75 constexpr iterator begin();
76 constexpr iterator end();
77 constexpr const_iterator begin() const;
78 constexpr const_iterator end() const;
79 constexpr const_iterator cbegin() const;
80 constexpr const_iterator cend() const;
81
82 [[nodiscard]] constexpr bool empty() const;
83 constexpr size_type size() const;
84
85 template <class LookupKeyT, class MappedT>
86 constexpr std::pair<iterator, bool> try_emplace(LookupKeyT&& key, MappedT&& val);
87
88 template <class LookupKeyT, class MappedT>
89 constexpr std::pair<iterator, bool> insert_or_assign(LookupKeyT&& key, MappedT&& val);
90
91 template <class LookupKeyT>
92 constexpr bool erase(const LookupKeyT& key);
93
94 constexpr iterator erase(iterator pos);
95
97
98 template <class LookupKeyT>
99 constexpr iterator find(const LookupKeyT& key);
100
101 template <class LookupKeyT>
102 constexpr const_iterator find(const LookupKeyT& key) const;
103
104 template <class LookupKeyT>
105 constexpr bool exists(const LookupKeyT& key) const;
106
107 template <class LookupKeyT>
108 constexpr bool contains(const LookupKeyT& key) const;
109
110 template <class LookupKeyT>
111 ValT& operator[](LookupKeyT&& key);
112 };
113}
114
115#include <Thoth/Dsa/LinearMap.tpp>
Definition LinearMap.hpp:13
Definition Cow.hpp:5
Definition LinearMap.hpp:21
constexpr LinearMap()=default
constexpr bool empty() const
constexpr std::pair< iterator, bool > try_emplace(LookupKeyT &&key, MappedT &&val)
constexpr LinearMap(LinearMap &&)=default
constexpr LinearMap & operator=(LinearMap &&) noexcept
constexpr const_iterator cend() const
std::pair< KeyT, ValT > value_type
Definition LinearMap.hpp:24
ValT mapped_type
Definition LinearMap.hpp:23
constexpr const_iterator cbegin() const
container_type::iterator iterator
Definition LinearMap.hpp:27
std::vector< value_type > container_type
Definition LinearMap.hpp:26
constexpr iterator begin()
container_type::size_type size_type
Definition LinearMap.hpp:29
constexpr iterator find(const LookupKeyT &key)
constexpr std::pair< iterator, bool > insert_or_assign(LookupKeyT &&key, MappedT &&val)
constexpr LinearMap(std::initializer_list< value_type > init, const key_compare &comp=key_compare{})
Pred key_compare
Definition LinearMap.hpp:25
constexpr iterator end()
constexpr bool contains(const LookupKeyT &key) const
constexpr void clear()
constexpr bool exists(const LookupKeyT &key) const
constexpr LinearMap(const LinearMap &)=default
constexpr bool erase(const LookupKeyT &key)
constexpr LinearMap(const key_compare &comp)
KeyT key_type
Definition LinearMap.hpp:22
constexpr size_type size() const
container_type::const_iterator const_iterator
Definition LinearMap.hpp:28
constexpr LinearMap & operator=(const LinearMap &)