Zen C++ Libraries
Zero-dependency re-usable components for C++
Loading...
Searching...
No Matches
assoc_list.hpp
1#ifndef ZEN_ASSOC_LIST_HPP
2#define ZEN_ASSOC_LIST_HPP
3
4#include <vector>
5#include <string>
6
7#include "zen/config.hpp"
8
9ZEN_NAMESPACE_START
10
11template<typename K, typename V>
12class assoc_list {
13
14 std::vector<std::pair<K, V>> elements;
15
16 template<typename T>
17 struct needle_type_helper {
18 using type = T;
19 };
20
21 template<typename CharT, typename Traits, typename Alloc>
22 struct needle_type_helper<std::basic_string<CharT, Traits, Alloc>> {
23 using type = std::basic_string_view<CharT, Traits>;
24 };
25
26 using needle_type = typename needle_type_helper<K>::type;
27
28public:
29
30 using value_type = std::pair<K, V>;
31 using iterator = typename std::vector<std::pair<K, V>>::iterator;
32 using const_iterator = typename std::vector<std::pair<K, V>>::const_iterator;
33 using size_type = typename std::vector<std::pair<K, V>>::size_type;
34
35 assoc_list() {}
36
37 assoc_list(std::initializer_list<std::pair<K, V>> elements):
38 elements(elements) {}
39
40 assoc_list(const assoc_list& other):
41 elements(other.elements) {}
42
43 assoc_list(assoc_list&& other):
44 elements(std::move(other.elements)) {}
45
46 bool empty() const {
47 return elements.empty();
48 }
49
50 size_type size() const {
51 return elements.size();
52 }
53
54 V& operator[](const needle_type& key) {
55 for (auto& [k, v]: elements) {
56 if (k == key) {
57 return v;
58 }
59 }
60 }
61
62 template<typename ...ForwardArg>
63 iterator push_back(ForwardArg&& ...args) {
64 elements.push_back(std::make_pair(std::forward<ForwardArg>(args)...));
65 return elements.end();
66 }
67
68 iterator find(const needle_type& key) {
69 auto end = elements.end();
70 for (auto iter = elements.begin(); iter != end; ++iter) {
71 if (iter->first == key) {
72 return iter;
73 }
74 }
75 return end;
76 }
77
78 const_iterator find(const needle_type& key) const {
79 auto end = elements.end();
80 for (auto iter = elements.begin(); iter != end; ++iter) {
81 if (iter->first == key) {
82 return iter;
83 }
84 }
85 return end;
86 }
87
88
89 bool contains(const needle_type& key) const {
90 auto end = elements.end();
91 for (auto iter = elements.begin(); iter != end; ++iter) {
92 if (iter->first == key) {
93 return true;
94 }
95 }
96 return false;
97 }
98
99 const_iterator cfind(const needle_type& key) const {
100 auto end = elements.end();
101 for (auto iter = elements.begin(); iter != end; ++iter) {
102 if (iter->first == key) {
103 return iter;
104 }
105 }
106 return end;
107 }
108
109 iterator begin() {
110 return elements.begin();
111 }
112
113 iterator end() {
114 return elements.end();
115 }
116
117 const_iterator begin() const {
118 return elements.cbegin();
119 }
120
121 const_iterator end() const {
122 return elements.cend();
123 }
124
125};
126
127ZEN_NAMESPACE_END
128
129#endif // of #ifndef ZEN_ASSOC_LIST_HPP