source: icXML/icXML-devel/src/icxmlc/XMLStringHash.hpp @ 2720

Last change on this file since 2720 was 2720, checked in by cameron, 6 years ago

Initial check-in of icXML 0.8 source files

File size: 3.2 KB
RevLine 
[2720]1/*
2 *  Copyright © 2012 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icXML is a trademark of International Characters.
5 */
6
7/*
8 * @author Nigel Medforth, nigelm -at- interational-characters.com
9 * @version $Id: XMLStringHash.hpp 207 2012-12-02 20:38:22Z robc $
10 *
11 */
12
13#ifndef XMLSTRINGPOOL_HPP
14#define XMLSTRINGPOOL_HPP
15
16#include <icxmlc/XMLConfig.hpp>
17#include <icxmlc/HashTable.hpp>
18#include <xercesc/util/XMLUni.hpp>
19#include <icxmlc/stringpool.h>
20#include <xercesc/framework/MemoryManager.hpp>
21#include <icxmlc/XMLStringU.hpp>
22
23XERCES_CPP_NAMESPACE_BEGIN
24
25/// ---------------------------------------------------------------------------------------------------------
26
27template <class T, size_t initialStringPoolSize>
28class XMLStringHash
29{
30        public:
31
32                XMLStringHash(MemoryManager * manager)
33                : fStringPool(manager)
34                {
35
36                }
37
38                XMLStringHash(XMLStringHash<T, initialStringPoolSize> * pool)
39                : fHashTable(pool->fHashTable)
40                , fStringPool(pool->fStringPool)
41                {
42
43                }
44
45                IDISA_ALWAYS_INLINE
46                const XMLCh * operator[](const int id) const
47                {
48                        return fHashTable[id]->getKey();
49                }
50
51                IDISA_ALWAYS_INLINE
52                void add(unsigned int id, const XMLCh * string, const size_t length)
53                {
54                        string = fStringPool.insert(string, length);
55                        T entry(id, string, length);
56                        fHashTable.add(entry, id);
57                }
58
59                IDISA_ALWAYS_INLINE
60                unsigned int find(const XMLCh * string, const size_t length) const
61                {
62                        return fHashTable.find(string, length);
63                }
64
65                IDISA_ALWAYS_INLINE
66                unsigned int addOrFind(const XMLCh * string, const size_t length)
67                {
68                        unsigned int id = find(string, length);
69                        if (id == -1)
70                        {
71                                return add(fHashTable.count(), string, length);
72                        }
73                }
74
75                IDISA_ALWAYS_INLINE
76                unsigned int addOrFind(const XMLCh * string)
77                {
78                        return addOrFind(string, XMLStringU::stringLen(string));
79                }
80
81                IDISA_ALWAYS_INLINE
82                const XMLCh * getValueForId(unsigned int id)
83                {
84                        if (id < fHashTable.count())
85                        {
86                                return fHashTable[id]->getKey();
87                        }
88                        return XMLUni::fgZeroLenString;
89                }
90
91                IDISA_ALWAYS_INLINE
92                size_t count() const
93                {
94                        return fHashTable.count();
95                }
96
97        private:
98
99                HashTable<T, XMLCh, sizeof(hash_t) * 16, true>                  fHashTable;
100                StringPool<XMLCh, initialStringPoolSize>                                fStringPool;
101};
102
103/// ---------------------------------------------------------------------------------------------------------
104
105class XMLStringPoolEntry
106{
107        protected:
108
109                unsigned int   id;
110                const XMLCh *  key;
111                unsigned int   length;
112
113        public:
114
115                XMLStringPoolEntry()
116                : id(0)
117                , key(NULL)
118                , length(0)
119                {
120
121                }
122
123                XMLStringPoolEntry(unsigned int i, const XMLCh * k, unsigned int l)
124                : id(i)
125                , key(k)
126                , length(l)
127                {
128
129                }
130
131                const XMLCh * getKey() const { return key; }
132
133                unsigned int getLength() const { return length; }
134
135                unsigned int getId() const { return id; }
136
137                XMLStringPoolEntry & operator=(const XMLStringPoolEntry & other)
138                {
139                        key = other.key;
140                        length = other.length;
141                        id = other.id;
142                        return *this;
143                }
144
145                IDISA_ALWAYS_INLINE
146                bool equals(const XMLCh * otherKey, const unsigned int length) const
147                {
148                        return (getLength() == length) && (XMLStringU::equals(getKey(), otherKey, length));
149                }
150};
151
152typedef XMLStringHash<XMLStringPoolEntry, 1024> XMLStringTable;
153
154XERCES_CPP_NAMESPACE_END
155
156#endif // XMLSTRINGPOOL_HPP
Note: See TracBrowser for help on using the repository browser.