00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef NMAP_HPP
00023 #define NMAP_HPP
00024
00035 template <typename K, typename V>
00036 class NMap {
00037 public:
00038 class iterator;
00039 typedef const iterator const_iterator;
00044 NMap(void);
00045
00049 ~NMap(void);
00050
00056 bool contains(const K &keyname) const;
00057
00064 bool contains(const K &keyname, const V &val) const;
00065
00071 nuint64 size(void) const;
00072
00077 nuint64 count(void) const;
00078
00087 nuint64 count(const K &keyname) const;
00088
00095 iterator begin(void);
00096
00103 const_iterator constBegin(void) const;
00104
00111 iterator end(void);
00112
00119 const_iterator constEnd(void) const;
00120
00127 bool erase(iterator pos);
00128
00134 iterator find(const K &keyname);
00135
00142 iterator find(const K &keyname, const V &val);
00143
00149 const_iterator constFind(const K &keyname) const;
00150
00157 const_iterator constFind(const K &keyname, const V &val) const;
00158
00166 iterator insert(const K &keyname, const V &val);
00167
00172 bool isEmpty(void) const;
00173
00179 const K key(const V val) const;
00180
00185 NList<K> keys(void) const;
00186
00192 NList<K> keys(const V val);
00193
00199 nuint64 remove(const K &keyname);
00200
00207 V take(const K &keyname);
00208
00214 V value(const K &keyname) const;
00215
00223 V value(const K &keyname, const V &defaultValue) const;
00224
00229 NList<V> values(void) const;
00230
00236 NList<V> values(const K &keyname) const;
00237
00241 void clear(void);
00242
00247 void copy(const NMap<K, V> &rhs);
00248
00254 NMap<K, V> &operator=(const NMap<K, V> &rhs);
00255
00261 bool operator!=(const NMap<K, V> &rhs) const;
00262
00268 bool operator==(const NMap<K, V> &rhs) const;
00269
00275 V operator[](const K &keyname);
00276
00282 const V &operator[](const K &keyname) const;
00283
00284 private:
00285 typedef NSkipList<NMapItem<K, V> > NMapSkip;
00286 NMapSkip m_skip;
00287 };
00288
00289
00290 template <typename K, typename V>
00291 NMap<K, V>::NMap(void)
00292 : m_skip()
00293 {
00294
00295 }
00296
00297 template <typename K, typename V>
00298 NMap<K, V>::~NMap(void) {
00299
00300 }
00301
00302
00303 template <typename K, typename V>
00304 nuint64 NMap<K, V>::size(void) const {
00305 return m_skip.count();
00306 }
00307
00308
00309 template <typename K, typename V>
00310 nuint64 NMap<K, V>::count(void) const {
00311 return m_skip.count();
00312 }
00313
00314
00315 template <typename K, typename V>
00316 nuint64 NMap<K, V>::count(const K &keyname) const {
00317 nuint64 items = 0;
00318
00319 for (typename NMapSkip::iterator i = m_skip.begin();
00320 i != m_skip.end();
00321 i++)
00322 {
00323 if ((*i).key == keyname) {
00324 items++;
00325 }
00326 }
00327
00328 return items;
00329 }
00330
00331
00336 template <typename K, typename V>
00337 class NMap<K, V>::iterator {
00338 public:
00342 iterator(void): m_it(NULL) { }
00343
00348 iterator(const iterator &other): m_it(NULL) {
00349 m_it = other.m_it;
00350 }
00351
00356 iterator(const typename NMapSkip::iterator &it): m_it(it) {
00357
00358 }
00359
00364 K key(void) const {
00365 return (*m_it).key;
00366 }
00367
00372 V value(void) const {
00373 return (*m_it).value;
00374 }
00375
00381 iterator &operator=(const iterator &rhs) {
00382 m_it = rhs.m_it;
00383
00384 return *this;
00385 }
00386
00392 bool operator==(const iterator &rhs) const {
00393 if (m_it == rhs.m_it) {
00394 return true;
00395 }
00396
00397 return false;
00398 }
00399
00400
00406 bool operator!=(const iterator &rhs) const {
00407 if (m_it != rhs.m_it) {
00408 return true;
00409 }
00410
00411 return false;
00412 }
00413
00418 NMapItem<K, V> operator*(void) const {
00419 return *m_it;
00420 }
00421
00426 iterator inc(void) {
00427 iterator tmp(*this);
00428
00429 m_it++;
00430 return tmp;
00431 }
00432
00437 iterator operator++(int) {
00438 iterator tmp(*this);
00439
00440 inc();
00441 return tmp;
00442 }
00443
00444
00449 const iterator &operator++(void) const {
00450 iterator tmp(*this);
00451
00452 m_it++;
00453 return *this;
00454 }
00455
00456
00461 const iterator operator++(int) const {
00462 iterator tmp(*this);
00463
00464 ++(*this);
00465 return tmp;
00466 }
00467
00468 private:
00469 typename NMapSkip::iterator m_it;
00470 };
00471
00472 template <typename K, typename V>
00473 typename NMap<K, V>::iterator NMap<K, V>::begin(void) {
00474 return typename NMap<K, V>::iterator(m_skip.begin());
00475 }
00476
00477
00478 template <typename K, typename V>
00479 NMAPITERATOR_CONST NMap<K, V>::constBegin(void) const {
00480 return typename NMap<K, V>::const_iterator(m_skip.constBegin());
00481 }
00482
00483
00484
00485
00486 template <typename K, typename V>
00487 typename NMap<K, V>::iterator NMap<K, V>::end(void) {
00488 return typename NMap<K, V>::iterator(m_skip.end());
00489 }
00490
00491
00492 template <typename K, typename V>
00493 NMAPITERATOR_CONST NMap<K, V>::constEnd(void) const {
00494 return typename NMap<K, V>::const_iterator(m_skip.constEnd());
00495 }
00496
00497
00498 template <typename K, typename V>
00499 bool NMap<K, V>::erase(iterator pos) {
00500 return m_skip.erase(*pos);
00501 }
00502
00503
00504 template <typename K, typename V>
00505 typename NMap<K, V>::iterator NMap<K, V>::find(const K &keyname) {
00506 for (typename NMapSkip::iterator i = m_skip.begin(); i != m_skip.end(); i++) {
00507 if ((*i).key == keyname) {
00508 return typename NMap<K, V>::iterator(i);
00509 }
00510
00511 }
00512
00513 return typename NMap<K, V>::iterator(m_skip.end());
00514 }
00515
00516
00517 template <typename K, typename V>
00518 NMAPITERATOR_CONST NMap<K, V>::constFind(const K &keyname) const {
00519 for (typename NMapSkip::const_iterator i = m_skip.constBegin();
00520 i != m_skip.constEnd(); i++)
00521 {
00522 if ((*i).key == keyname) {
00523 return typename NMap<K, V>::const_iterator(i);
00524 }
00525
00526 }
00527
00528 return typename NMap<K, V>::const_iterator(m_skip.constEnd());
00529 }
00530
00531
00532 template <typename K, typename V>
00533 typename NMap<K, V>::iterator NMap<K, V>::find(const K &keyname, const V &val) {
00534 for (typename NMapSkip::iterator i = m_skip.begin(); i != m_skip.end(); i++) {
00535 if ((*i).key == keyname && (*i).value == val) {
00536 return typename NMap<K, V>::iterator(i);
00537 }
00538 }
00539
00540 return typename NMap<K, V>::iterator(m_skip.end());
00541 }
00542
00543
00544 template <typename K, typename V>
00545 NMAPITERATOR_CONST NMap<K, V>::constFind(const K &keyname, const V &val) const {
00546 for (typename NMapSkip::const_iterator i = m_skip.constBegin();
00547 i != m_skip.constEnd(); i++)
00548 {
00549 if ((*i).key == keyname && (*i).value == val) {
00550 return typename NMap<K, V>::const_iterator(i);
00551 }
00552 }
00553
00554 return typename NMap<K, V>::const_iterator(m_skip.constEnd());
00555 }
00556
00557
00558 template <typename K, typename V>
00559 typename NMap<K, V>::iterator NMap<K, V>::insert(const K &keyname, const V &val) {
00560 NMapItem<K, V> item;
00561
00562 item.key = keyname;
00563 item.value = val;
00564
00565 return typename NMap<K, V>::iterator(m_skip.insert(item));
00566 }
00567
00568 template <typename K, typename V>
00569 bool NMap<K, V>::isEmpty(void) const {
00570 return m_skip.isEmpty();
00571 }
00572
00573
00574 template <typename K, typename V>
00575 const K NMap<K, V>::key(const V val) const {
00576 K tmp;
00577
00578 for (typename NMapSkip::iterator i = m_skip.begin(); i != m_skip.end(); i++) {
00579 if ((*i).value == val) {
00580 tmp = (*i).key;
00581 break;
00582 }
00583 }
00584
00585 return tmp;
00586 }
00587
00588
00589 template <typename K, typename V>
00590 NList<K> NMap<K, V>::keys(void) const {
00591 NList<K> ret;
00592
00593
00594 for (typename NMapSkip::const_iterator i = m_skip.constBegin();
00595 i != m_skip.constEnd(); i++)
00596 {
00597 ret.append((*i).key);
00598 }
00599
00600 return ret;
00601 }
00602
00603
00604 template <typename K, typename V>
00605 NList<K> NMap<K, V>::keys(const V val) {
00606 NList<K> ret;
00607
00608 for (typename NMapSkip::iterator i = m_skip.begin(); i != m_skip.end(); i++) {
00609 if ((*i).value == val) {
00610 ret.append((*i).key);
00611 break;
00612 }
00613 }
00614
00615 return ret;
00616 }
00617
00618
00619 template <typename K, typename V>
00620 nuint64 NMap<K, V>::remove(const K &keyname) {
00621 nuint64 items = 0;
00622
00623 for (typename NMapSkip::iterator i = m_skip.begin(); i != m_skip.end(); i++) {
00624 if ((*i).key == keyname) {
00625 if (m_skip.remove((*i))) {
00626 items++;
00627 }
00628 }
00629 }
00630
00631 return items;
00632 }
00633
00634 template <typename K, typename V>
00635 V NMap<K, V>::take(const K &keyname) {
00636 V tmp;
00637
00638 for (typename NMapSkip::iterator i = m_skip.begin(); i != m_skip.end(); i++) {
00639 if ((*i).key == keyname) {
00640 tmp = (*i).value;
00641 m_skip.remove((*i));
00642 }
00643 }
00644 }
00645
00646
00647 template <typename K, typename V>
00648 V NMap<K, V>::value(const K &keyname) const {
00649 V tmp;
00650
00651 for (typename NMapSkip::const_iterator i = m_skip.constBegin();
00652 i != m_skip.constEnd(); i++)
00653 {
00654 if ((*i).key == keyname) {
00655 tmp = (*i).value;
00656 break;
00657 }
00658 }
00659
00660 return tmp;
00661
00662 }
00663
00664 template <typename K, typename V>
00665 V NMap<K, V>::value(const K &keyname, const V &defaultValue) const {
00666 V tmp = defaultValue;
00667
00668 for (typename NMapSkip::const_iterator i = m_skip.constBegin();
00669 i != m_skip.constEnd(); i++)
00670 {
00671 if ((*i).key == keyname) {
00672 tmp = (*i).value;
00673 break;
00674 }
00675 }
00676
00677 return tmp;
00678 }
00679
00680
00681 template <typename K, typename V>
00682 NList<V> NMap<K, V>::values(void) const {
00683 NList<V> ret;
00684
00685 for (typename NMapSkip::const_iterator i = m_skip.constBegin();
00686 i != m_skip.constEnd(); i++)
00687 {
00688 ret.append((*i).value);
00689 }
00690
00691 return ret;
00692 }
00693
00694 template <typename K, typename V>
00695 NList<V> NMap<K, V>::values(const K &keyname) const {
00696 NList<V> ret;
00697
00698 for (typename NMapSkip::const_iterator i = m_skip.constBegin();
00699 i != m_skip.constEnd(); i++)
00700 {
00701 if ((*i).key == keyname) {
00702 ret.append((*i).value);
00703 }
00704 }
00705
00706 return ret;
00707 }
00708
00709
00710 template <typename K, typename V>
00711 void NMap<K, V>::copy(const NMap<K, V> &rhs) {
00712 m_skip.clear();
00713
00714 for (typename NMapSkip::iterator i = rhs.begin(); i != rhs.end(); i++) {
00715 insert((*i).key, (*i).value);
00716 }
00717 }
00718
00719
00720 template <typename K, typename V>
00721 bool NMap<K, V>::contains(const K &keyname) const {
00722 if (constFind(keyname) != constEnd()) {
00723 return true;
00724 }
00725
00726 return false;
00727 }
00728
00729
00730 template <typename K, typename V>
00731 bool NMap<K, V>::contains(const K &keyname, const V &val) const {
00732 if (constFind(keyname, val) != constEnd()) {
00733 return true;
00734 }
00735
00736 return false;
00737 }
00738
00739
00740
00741 template <typename K, typename V>
00742 NMap<K, V> &NMap<K, V>::operator=(const NMap<K, V> &rhs) {
00743 copy(rhs);
00744
00745 return *this;
00746 }
00747
00748
00749 template <typename K, typename V>
00750 bool NMap<K, V>::operator!=(const NMap<K, V> &rhs) const {
00751 for (typename NMapSkip::iterator i = rhs.begin(); i != rhs.end(); i++) {
00752 if (contains((*i).key, (*i).value)) {
00753 return false;
00754 }
00755 }
00756
00757 return true;
00758 }
00759
00760
00761 template <typename K, typename V>
00762 bool NMap<K, V>::operator==(const NMap<K, V> &rhs) const {
00763 for (typename NMapSkip::iterator i = rhs.begin(); i != rhs.end(); i++) {
00764 if (!contains((*i).key, (*i).value)) {
00765 return false;
00766 }
00767 }
00768
00769 return true;
00770 }
00771
00772
00773 template <typename K, typename V>
00774 V NMap<K, V>::operator[](const K &keyname) {
00775 return value(keyname);
00776 }
00777
00778
00779 template <typename K, typename V>
00780 const V &NMap<K, V>::operator[](const K &keyname) const {
00781 return value(keyname);
00782 }
00783
00784 #endif // NMAP_HPP