annotate foosdk/sdk/pfc/map.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "avltree.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 PFC_DECLARE_EXCEPTION(exception_map_entry_not_found,exception,"Map entry not found");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 template<typename t_destination> class __map_overwrite_wrapper {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 __map_overwrite_wrapper(t_destination & p_destination) : m_destination(p_destination) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 template<typename t_key,typename t_value> void operator() (const t_key & p_key,const t_value & p_value) {m_destination.set(p_key,p_value);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 t_destination & m_destination;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 template<typename t_storage_key, typename t_storage_value, typename t_comparator = comparator_default>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 class map_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 typedef map_t<t_storage_key,t_storage_value,t_comparator> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 typedef t_storage_key t_key; typedef t_storage_value t_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 template<typename _t_key,typename _t_value>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 void set(const _t_key & p_key, const _t_value & p_value) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 bool isnew;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 t_storage & storage = m_data.add_ex(t_search_set<_t_key,_t_value>(p_key,p_value), isnew);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 if (!isnew) storage.m_value = p_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 template<typename _t_key>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 t_storage_value & find_or_add(_t_key const & p_key) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 return m_data.add(t_search_query<_t_key>(p_key)).m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 template<typename _t_key>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 t_storage_value & find_or_add_ex(_t_key const & p_key,bool & p_isnew) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 return m_data.add_ex(t_search_query<_t_key>(p_key),p_isnew).m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 template<typename _t_key>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 bool have_item(const _t_key & p_key) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 return m_data.have_item(t_search_query<_t_key>(p_key));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 template<typename key_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 bool contains(key_t const& arg) const { return have_item(arg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 template<typename _t_key,typename _t_value>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 bool query(const _t_key & p_key,_t_value & p_value) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 const t_storage * storage = m_data.find_ptr(t_search_query<_t_key>(p_key));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 if (storage == NULL) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 p_value = storage->m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 template<typename _t_key>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 const t_storage_value & operator[] (const _t_key & p_key) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 const t_storage_value * ptr = query_ptr(p_key);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 if (ptr == NULL) throw exception_map_entry_not_found();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 return *ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 template<typename _t_key>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 t_storage_value & operator[] (const _t_key & p_key) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 return find_or_add(p_key);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 template<typename _t_key>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 const t_storage_value * query_ptr(const _t_key & p_key) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 const t_storage * storage = m_data.find_ptr(t_search_query<_t_key>(p_key));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 if (storage == NULL) return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 return &storage->m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 template<typename _t_key>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 t_storage_value * query_ptr(const _t_key & p_key) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 t_storage * storage = m_data.find_ptr(t_search_query<_t_key>(p_key));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 if (storage == NULL) return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 return &storage->m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 template<typename _t_key>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 bool query_ptr(const _t_key & p_key, const t_storage_value * & out) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 const t_storage * storage = m_data.find_ptr(t_search_query<_t_key>(p_key));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 if (storage == NULL) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 out = &storage->m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 template<typename _t_key>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 bool query_ptr(const _t_key & p_key, t_storage_value * & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 t_storage * storage = m_data.find_ptr(t_search_query<_t_key>(p_key));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 if (storage == NULL) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 out = &storage->m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 template<bool inclusive,bool above,typename _t_key>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 const t_storage_value * query_nearest_ptr(_t_key & p_key) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 const t_storage * storage = m_data.template find_nearest_item<inclusive,above>(t_search_query<_t_key>(p_key));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 if (storage == NULL) return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 p_key = storage->m_key;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 return &storage->m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 template<bool inclusive,bool above,typename _t_key>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 t_storage_value * query_nearest_ptr(_t_key & p_key) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 t_storage * storage = m_data.template find_nearest_item<inclusive,above>(t_search_query<_t_key>(p_key));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 if (storage == NULL) return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 p_key = storage->m_key;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 return &storage->m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 template<bool inclusive,bool above,typename _t_key,typename _t_value>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 bool query_nearest(_t_key & p_key,_t_value & p_value) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 const t_storage * storage = m_data.template find_nearest_item<inclusive,above>(t_search_query<_t_key>(p_key));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 if (storage == NULL) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 p_key = storage->m_key;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 p_value = storage->m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 template<typename _t_key>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 bool remove(const _t_key & p_key) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 return m_data.remove_item(t_search_query<_t_key>(p_key));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 template<typename t_callback>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 void enumerate(t_callback && p_callback) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 enumeration_wrapper<t_callback> cb(p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 m_data.enumerate(cb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 template<typename t_callback>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 void enumerate(t_callback && p_callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 enumeration_wrapper_var<t_callback> cb(p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 m_data._enumerate_var(cb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 t_size get_count() const throw() {return m_data.get_count();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 size_t size() const throw() { return get_count(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 void remove_all() throw() {m_data.remove_all();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 void clear() throw() { remove_all(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 template<typename t_source>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 void overwrite(const t_source & p_source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 __map_overwrite_wrapper<t_self> wrapper(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 p_source.enumerate(wrapper);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 //backwards compatibility method wrappers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 template<typename _t_key> bool exists(const _t_key & p_key) const {return have_item(p_key);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 template<typename _t_key> bool get_first(_t_key & p_out) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 t_retrieve_key<_t_key> wrap(p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 return m_data.get_first(wrap);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 template<typename _t_key> bool get_last(_t_key & p_out) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 t_retrieve_key<_t_key> wrap(p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 return m_data.get_last(wrap);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 map_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 map_t( const t_self & other ) : m_data( other.m_data ) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 map_t( t_self && other ) : m_data( std::move(other.m_data) ) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 const t_self & operator=( const t_self & other ) {m_data = other.m_data; return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 const t_self & operator=( t_self && other ) { m_data = std::move(other.m_data); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 void move_from(t_self & other) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 m_data.move_from( other.m_data );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 template<typename _t_key>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 struct t_retrieve_key {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 typedef t_retrieve_key<_t_key> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 t_retrieve_key(_t_key & p_key) : m_key(p_key) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 template<typename t_what> const t_self & operator=(const t_what & p_what) {m_key = p_what.m_key; return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 _t_key & m_key;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 template<typename _t_key>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 struct t_search_query {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 t_search_query(const _t_key & p_key) : m_key(p_key) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 _t_key const & m_key;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 template<typename _t_key,typename _t_value>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 struct t_search_set {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 t_search_set(const _t_key & p_key, const _t_value & p_value) : m_key(p_key), m_value(p_value) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 _t_key const & m_key;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 _t_value const & m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 struct t_storage {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 const t_storage_key m_key;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 t_storage_value m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 template<typename _t_key>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 t_storage(t_search_query<_t_key> const & p_source) : m_key(p_source.m_key), m_value() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 template<typename _t_key,typename _t_value>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 t_storage(t_search_set<_t_key,_t_value> const & p_source) : m_key(p_source.m_key), m_value(p_source.m_value) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 static bool equals(const t_storage & v1, const t_storage & v2) {return v1.m_key == v2.m_key && v1.m_value == v2.m_value;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 bool operator==(const t_storage & other) const {return equals(*this,other);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 bool operator!=(const t_storage & other) const {return !equals(*this,other);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 class comparator_wrapper {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 template<typename t1,typename t2>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 inline static int compare(const t1 & p_item1,const t2 & p_item2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 return t_comparator::compare(p_item1.m_key,p_item2.m_key);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 template<typename t_callback>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 class enumeration_wrapper {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 enumeration_wrapper(t_callback & p_callback) : m_callback(p_callback) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 void operator()(const t_storage & p_item) {m_callback(p_item.m_key,p_item.m_value);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 t_callback & m_callback;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 template<typename t_callback>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 class enumeration_wrapper_var {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 enumeration_wrapper_var(t_callback & p_callback) : m_callback(p_callback) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 void operator()(t_storage & p_item) {m_callback(implicit_cast<t_storage_key const&>(p_item.m_key),p_item.m_value);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 t_callback & m_callback;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 typedef avltree_t<t_storage,comparator_wrapper> t_content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 t_content m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 typedef traits_t<t_content> traits;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 typedef typename t_content::const_iterator const_iterator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 typedef typename t_content::iterator iterator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 typedef typename t_content::forward_iterator forward_iterator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 typedef typename t_content::forward_const_iterator forward_const_iterator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 iterator first() throw() {return m_data._first_var();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 iterator last() throw() {return m_data._last_var();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 const_iterator first() const throw() {return m_data.first();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 const_iterator last() const throw() {return m_data.last();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 const_iterator cfirst() const throw() {return m_data.first();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 const_iterator clast() const throw() {return m_data.last();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 forward_iterator begin() { return first(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 forward_const_iterator begin() const { return first(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 forward_iterator end() { return forward_iterator(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 forward_const_iterator end() const { return forward_const_iterator(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 template<typename _t_key> iterator find(const _t_key & key) {return m_data.find(t_search_query<_t_key>(key));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 template<typename _t_key> const_iterator find(const _t_key & key) const {return m_data.find(t_search_query<_t_key>(key));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 static bool equals(const t_self & v1, const t_self & v2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 return t_content::equals(v1.m_data,v2.m_data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 bool operator==(const t_self & other) const {return equals(*this,other);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 bool operator!=(const t_self & other) const {return !equals(*this,other);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 bool remove(iterator const& iter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 PFC_ASSERT(iter.is_valid());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 return m_data.remove(iter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 //should never return false unless there's a bug in calling code
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 bool remove(const_iterator const& iter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 PFC_ASSERT(iter.is_valid());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 return m_data.remove(iter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 //should never return false unless there's a bug in calling code
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 }