4 #include <rudiments/stdio.h>
5 #include <rudiments/private/nodeinlines.h>
7 #define DICTIONARY_TEMPLATE \
8 template <class keytype, class valuetype>
10 #define DICTIONARY_CLASS \
11 dictionary<keytype,valuetype>
15 DICTIONARY_CLASS::dictionary() {
16 trackinsertionorder=
true;
21 DICTIONARY_CLASS::~dictionary() {
27 bool DICTIONARY_CLASS::setTrackInsertionOrder(
bool trackinsertionorder) {
28 if (!tree.getLength()) {
29 this->trackinsertionorder=trackinsertionorder;
37 bool DICTIONARY_CLASS::getTrackInsertionOrder() {
38 return trackinsertionorder;
43 void DICTIONARY_CLASS::setValue(keytype key, valuetype value) {
50 if (trackinsertionorder) {
58 void DICTIONARY_CLASS::setValues(keytype *keys, valuetype *values) {
60 valuetype *value=values;
62 setValue(*key,*value);
70 void DICTIONARY_CLASS::setValues(keytype
const *keys, valuetype
const *values) {
72 keytype
const *key=keys;
73 valuetype
const *value=values;
75 setValue(*key,*value);
84 void DICTIONARY_CLASS::setValues(keytype *keys, valuetype *values,
88 valuetype *value=values;
89 for (uint64_t i=0; i<count; i++) {
90 setValue(*key,*value);
99 void DICTIONARY_CLASS::setValues(keytype
const *keys, valuetype
const *values,
101 if (keys && values) {
102 keytype
const *key=keys;
103 valuetype
const *value=values;
104 for (uint64_t i=0; i<count; i++) {
105 setValue(*key,*value);
117 *node=dict->
getList()->getFirst();
118 node; node=node->getNext()) {
119 setValue(node->getValue()->getKey(),
120 node->getValue()->getValue());
127 bool DICTIONARY_CLASS::getValue(keytype key, valuetype *value) {
138 valuetype DICTIONARY_CLASS::getValue(keytype key) {
140 if (getValue(key,&value)) {
158 bool DICTIONARY_CLASS::remove(keytype key) {
161 if (trackinsertionorder) {
165 return tree.remove(tnode);
172 bool DICTIONARY_CLASS::removeAndDelete(keytype key) {
175 if (trackinsertionorder) {
179 delete tnode->
getValue()->getValue();
181 return tree.remove(tnode);
188 bool DICTIONARY_CLASS::removeAndArrayDelete(keytype key) {
191 if (trackinsertionorder) {
194 delete[] tnode->
getValue()->getKey();
195 delete[] tnode->
getValue()->getValue();
197 return tree.remove(tnode);
204 bool DICTIONARY_CLASS::removeAndDeleteKey(keytype key) {
207 if (trackinsertionorder) {
212 return tree.remove(tnode);
219 bool DICTIONARY_CLASS::removeAndArrayDeleteKey(keytype key) {
222 if (trackinsertionorder) {
225 delete[] tnode->
getValue()->getKey();
227 return tree.remove(tnode);
234 bool DICTIONARY_CLASS::removeAndDeleteValue(keytype key) {
237 if (trackinsertionorder) {
240 delete tnode->
getValue()->getValue();
242 return tree.remove(tnode);
249 bool DICTIONARY_CLASS::removeAndArrayDeleteValue(keytype key) {
252 if (trackinsertionorder) {
255 delete[] tnode->
getValue()->getValue();
257 return tree.remove(tnode);
264 bool DICTIONARY_CLASS::removeAndDeleteKeyAndArrayDeleteValue(keytype key) {
267 if (trackinsertionorder) {
271 delete[] tnode->
getValue()->getValue();
273 return tree.remove(tnode);
280 bool DICTIONARY_CLASS::removeAndArrayDeleteKeyAndDeleteValue(keytype key) {
283 if (trackinsertionorder) {
286 delete[] tnode->
getValue()->getKey();
287 delete tnode->
getValue()->getValue();
289 return tree.remove(tnode);
298 *tnode=tree.find(node);
300 if (trackinsertionorder) {
304 return tree.remove(tnode);
311 bool DICTIONARY_CLASS::removeAndDelete(
314 *tnode=tree.find(node);
316 if (trackinsertionorder) {
320 delete tnode->
getValue()->getValue();
322 return tree.remove(tnode);
329 bool DICTIONARY_CLASS::removeAndArrayDelete(
332 *tnode=tree.find(node);
334 if (trackinsertionorder) {
337 delete[] tnode->
getValue()->getKey();
338 delete[] tnode->
getValue()->getValue();
340 return tree.remove(tnode);
347 bool DICTIONARY_CLASS::removeAndDeleteKey(
350 *tnode=tree.find(node);
352 if (trackinsertionorder) {
357 return tree.remove(tnode);
364 bool DICTIONARY_CLASS::removeAndArrayDeleteKey(
367 *tnode=tree.find(node);
369 if (trackinsertionorder) {
372 delete[] tnode->
getValue()->getKey();
374 return tree.remove(tnode);
381 bool DICTIONARY_CLASS::removeAndDeleteValue(
384 *tnode=tree.find(node);
386 if (trackinsertionorder) {
389 delete tnode->
getValue()->getValue();
391 return tree.remove(tnode);
398 bool DICTIONARY_CLASS::removeAndArrayDeleteValue(
401 *tnode=tree.find(node);
403 if (trackinsertionorder) {
406 delete[] tnode->
getValue()->getValue();
408 return tree.remove(tnode);
415 bool DICTIONARY_CLASS::removeAndDeleteKeyAndArrayDeleteValue(
418 *tnode=tree.find(node);
420 if (trackinsertionorder) {
424 delete[] tnode->
getValue()->getValue();
426 return tree.remove(tnode);
433 bool DICTIONARY_CLASS::removeAndArrayDeleteKeyAndDeleteValue(
436 *tnode=tree.find(node);
438 if (trackinsertionorder) {
441 delete[] tnode->
getValue()->getKey();
442 delete tnode->
getValue()->getValue();
444 return tree.remove(tnode);
451 void DICTIONARY_CLASS::clear() {
453 list.getFirst(); node; node=node->getNext()) {
462 void DICTIONARY_CLASS::clearAndDelete() {
464 list.getFirst(); node; node=node->getNext()) {
466 delete node->
getValue()->getValue();
475 void DICTIONARY_CLASS::clearAndArrayDelete() {
477 list.getFirst(); node; node=node->getNext()) {
478 delete[] node->
getValue()->getKey();
479 delete[] node->
getValue()->getValue();
488 void DICTIONARY_CLASS::clearAndDeleteKeys() {
490 list.getFirst(); node; node=node->getNext()) {
500 void DICTIONARY_CLASS::clearAndArrayDeleteKeys() {
502 list.getFirst(); node; node=node->getNext()) {
503 delete[] node->
getValue()->getKey();
512 void DICTIONARY_CLASS::clearAndDeleteValues() {
514 list.getFirst(); node; node=node->getNext()) {
515 delete node->
getValue()->getValue();
524 void DICTIONARY_CLASS::clearAndArrayDeleteValues() {
526 list.getFirst(); node; node=node->getNext()) {
527 delete[] node->
getValue()->getValue();
536 void DICTIONARY_CLASS::clearAndDeleteKeysAndArrayDeleteValues() {
538 list.getFirst(); node; node=node->getNext()) {
540 delete[] node->
getValue()->getValue();
549 void DICTIONARY_CLASS::clearAndArrayDeleteKeysAndDeleteValues() {
551 list.getFirst(); node; node=node->getNext()) {
552 delete[] node->
getValue()->getKey();
553 delete node->
getValue()->getValue();
565 *node=getList()->getFirst(); node; node=node->getNext()) {
580 if (!trackinsertionorder) {
583 *node=tree.getFirst(); node; node=node->getNext()) {
592 void DICTIONARY_CLASS::print() {
594 list.getFirst(); node; node=node->getNext()) {
605 return tree.find(&fnode);
608 #define DICTIONARYNODE_TEMPLATE \
609 template <class keytype, class valuetype>
611 #define DICTIONARYNODE_CLASS \
612 dictionarynode<keytype,valuetype>
614 DICTIONARYNODE_TEMPLATE
616 DICTIONARYNODE_CLASS::dictionarynode(keytype key, valuetype value) {
621 DICTIONARYNODE_TEMPLATE
623 DICTIONARYNODE_CLASS::~dictionarynode() {}
625 DICTIONARYNODE_TEMPLATE
627 void DICTIONARYNODE_CLASS::setKey(keytype key) {
631 DICTIONARYNODE_TEMPLATE
633 void DICTIONARYNODE_CLASS::setValue(valuetype value) {
637 DICTIONARYNODE_TEMPLATE
639 keytype DICTIONARYNODE_CLASS::getKey()
const {
643 DICTIONARYNODE_TEMPLATE
645 valuetype DICTIONARYNODE_CLASS::getValue()
const {
649 DICTIONARYNODE_TEMPLATE
651 int32_t DICTIONARYNODE_CLASS::compare(keytype testkey)
const {
652 return node_compare(key,testkey);
655 DICTIONARYNODE_TEMPLATE
657 int32_t DICTIONARYNODE_CLASS::compare(
659 return node_compare(key,testnode->key);
662 DICTIONARYNODE_TEMPLATE
664 void DICTIONARYNODE_CLASS::print()
const {
672 DICTIONARYNODE_TEMPLATE
674 int32_t node_compare(
680 DICTIONARYNODE_TEMPLATE
valuetype getValue() const
Definition: dictionary.h:63
linkedlist< dictionarynode< keytype, valuetype > * > * getList()
Definition: dictionary.h:12
valuetype getValue() const
void setValue(valuetype value)
size_t printf(const char *format,...)
Definition: linkedlist.h:60
void append(valuetype value)
Definition: linkedlist.h:11