nmap.hpp

Go to the documentation of this file.
00001 // LICENSE: (Please see the file COPYING for details)
00002 //
00003 // NUS - Nemesis Utilities System: A C++ application development framework 
00004 // Copyright (C) 2006, 2008 Otavio Rodolfo Piske
00005 //
00006 //  This file is part of NUS
00007 //
00008 //  This library is free software; you can redistribute it and/or
00009 //  modify it under the terms of the GNU Lesser General Public
00010 //  License as published by the Free Software Foundation version 2.1
00011 //  of the License.
00012 //
00013 //  This library is distributed in the hope that it will be useful,
00014 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016 //  Lesser General Public License for more details.
00017 //
00018 //  You should have received a copy of the GNU Lesser General Public
00019 //  License along with this library; if not, write to the Free Software
00020 //  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
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

Generated on Wed Mar 5 23:10:35 2008 for NemesisUtilitiesSystem by  doxygen 1.5.4