source: XMLIO_V2/dev/dev_rv/xmlio_container.hpp @ 88

Last change on this file since 88 was 88, checked in by hozdoba, 12 years ago

Version expérimentale, commit pour sauvegarde.

File size: 4.5 KB
Line 
1#ifndef __XMLIO_CONTAINER__
2#define __XMLIO_CONTAINER__
3
4// Classes utilisées issues de Poco
5using Poco::HashMap;
6using Poco::Hash;
7
8// Classes utilisées issues de la STL
9using std::vector;
10using std::string;
11using std::pair;
12using std::ostream;
13
14// Classes XMLIOSERVER
15using XMLIOSERVER::XMLIOUndefinedValueException;
16
17namespace XMLIOSERVER
18{
19   template<class Key, class Mapped, class HashFunc = Hash<Key> >
20      class ExHashMap
21         : private HashMap<Key, Mapped, Hash<Key> >
22   {
23      public :
24         ExHashMap() :  HashMap<Key, Mapped, Hash<Key> >(), _elemList()
25         {/* Ne rien faire de plus */}
26               
27         Mapped& operator[] (const Key& kval) throw (XMLIOUndefinedValueException)
28         { 
29            if(!hasMappedValue(kval))
30               throw XMLIOUndefinedValueException("Appel de la méthode ExHashMap::operator[] invalide.");
31            return (find(kval)->second); 
32         }
33         
34         bool hasMappedValue(const Key& kval) {return (find(kval) != this->end());}
35         
36         const vector<Mapped*> getVector(void) { return (this->_elemList); }         
37
38         size_t getVectorSize(void) const {return (this->_elemList.size());}
39         size_t getSize(void) const {return (this->size());}
40         
41         virtual ~ExHashMap()
42         {/* Ne rien faire de plus */}
43         
44      protected :
45     
46         bool addValue(const Key& kval, Mapped& element)
47         {
48            pair<typename ExHashMap::Iterator,bool> p = this->insert(make_pair (kval,element));
49            if(!p.second) return (false);
50            return (this->addValue(element));
51         }
52         
53         bool addValue(Mapped& element)
54         {   this->_elemList.insert(this->_elemList.end(), &element);   return (true);   }   
55         
56         
57         void removeValue(const Key& kval)
58         { Mapped& element = find(kval)->second; removeValue(element); this->erase(kval);   }
59         
60         void removeValue(const Mapped& element)
61         {
62            for (int i = 0; i < this->_elemList.size(); i++)             
63               if (*this->_elemList[i] == element ) this->_elemList.erase(this->_elemList.begin()+i);
64         }
65         
66      private :   
67         vector<Mapped*> _elemList;
68         
69   }; // class ExHashMap
70   
71   /////////////////////////////////////////////////////////////
72   
73   template<class Mapped>
74      class StrHashMap
75         : public ExHashMap<string, Mapped, Hash<string> >
76   {
77      public :
78     
79         StrHashMap() :  ExHashMap<string, Mapped, Hash<string> >()   
80         {/* Ne rien faire de plus */}   
81         
82         bool addObject(Mapped& element)
83         { if(element.hasId()) return(addValue(element.getId(), element));   return(addValue(element));   }
84         
85         bool addPtrObject(Mapped element)
86         { if(element->hasId()) return(addValue(element->getId(), element));   return(addValue(element));   }
87         
88         bool removeObject(const string& kval)
89         { 
90            if(!ExHashMap<string, Mapped, Hash<string> >::hasMappedValue(kval)) return (false);
91            ExHashMap<string, Mapped, Hash<string> >::removeValue(kval); return (true); 
92         }
93         
94         virtual ~StrHashMap()   
95         {/* Ne rien faire de plus */}
96         
97
98#define   STRHASHMAP_TEST(DESC, SIZE, VECTORSIZE) \
99         if(map.getSize() != SIZE or map.getVectorSize() != VECTORSIZE) \
100         { log << "Test de la classe StrHashMap > " << DESC << "... echec !" << std::endl; return (false); }
101     
102         /// POUR TESTS ///
103         static bool CLASS_TEST(ostream& log = std::clog)
104         {
105            StrHashMap<Mapped> map;
106            Mapped obj0("toto"), obj1("titi"),  obj3;
107           
108            ////////////////////////////////////////////////////////////////////
109            map.addObject(obj0);   map.addObject(obj1);
110            STRHASHMAP_TEST("Ajout d'objets identifiés au conteneur", 2, 2);
111            map.removeObject("toto");
112            STRHASHMAP_TEST("Suppression d'objets identifiés du conteneur", 1, 1);
113            map.addObject(obj3);   
114            STRHASHMAP_TEST("Ajout d'objets non-identifiés au conteneur", 1, 2);
115            // A étoffer en cas de soucis avec cette classe ...
116            ////////////////////////////////////////////////////////////////////
117           
118            log << "Test  StrHashMap ... ok !" << std::endl;
119            return (true);     
120         };
121#undef   STRHASHMAP_TEST
122         
123   }; // class StrHashMap
124           
125}; // namespace XMLIOSERVER
126
127#endif // __XMLIO_CONTAINER__
Note: See TracBrowser for help on using the repository browser.