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

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

Initial imports for icXML v0.9

File size: 3.3 KB
Line 
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 253 2013-02-09 01:52:48Z nigelm $
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 gid_t id) const
47                {
48            return fHashTable[id].getKey();
49                }
50
51                IDISA_ALWAYS_INLINE
52        gid_t add(const gid_t id, const XMLCh * string, const size_t length)
53                {
54                        string = fStringPool.insert(string, length);
55                        T entry(id, string, length);
56            return fHashTable.add(entry, id);
57                }
58
59                IDISA_ALWAYS_INLINE
60        gid_t find(const XMLCh * string, const size_t length) const
61                {
62                        return fHashTable.find(string, length);
63                }
64
65                IDISA_ALWAYS_INLINE
66        gid_t addOrFind(const XMLCh * string, const size_t length)
67                {
68            gid_t id = find(string, length);
69                        if (id == -1)
70                        {
71                id = add(fHashTable.count(), string, length);
72                        }
73            return id;
74                }
75
76                IDISA_ALWAYS_INLINE
77        gid_t addOrFind(const XMLCh * string)
78                {
79                        return addOrFind(string, XMLStringU::stringLen(string));
80                }
81
82                IDISA_ALWAYS_INLINE
83        const XMLCh * getValueForId(const gid_t id) const
84                {
85            if (likely(id < fHashTable.count()))
86                        {
87                return fHashTable[id].getKey();
88                        }
89                        return XMLUni::fgZeroLenString;
90                }
91
92                IDISA_ALWAYS_INLINE
93                size_t count() const
94                {
95                        return fHashTable.count();
96                }
97
98        private:
99
100                HashTable<T, XMLCh, sizeof(hash_t) * 16, true>                  fHashTable;
101                StringPool<XMLCh, initialStringPoolSize>                                fStringPool;
102};
103
104/// ---------------------------------------------------------------------------------------------------------
105
106class XMLStringPoolEntry
107{
108        protected:
109
110                unsigned int   id;
111                const XMLCh *  key;
112                unsigned int   length;
113
114        public:
115
116                XMLStringPoolEntry()
117                : id(0)
118                , key(NULL)
119                , length(0)
120                {
121
122                }
123
124                XMLStringPoolEntry(unsigned int i, const XMLCh * k, unsigned int l)
125                : id(i)
126                , key(k)
127                , length(l)
128                {
129
130                }
131
132                const XMLCh * getKey() const { return key; }
133
134                unsigned int getLength() const { return length; }
135
136                unsigned int getId() const { return id; }
137
138                XMLStringPoolEntry & operator=(const XMLStringPoolEntry & other)
139                {
140                        key = other.key;
141                        length = other.length;
142                        id = other.id;
143                        return *this;
144                }
145
146                IDISA_ALWAYS_INLINE
147                bool equals(const XMLCh * otherKey, const unsigned int length) const
148                {
149                        return (getLength() == length) && (XMLStringU::equals(getKey(), otherKey, length));
150                }
151};
152
153typedef XMLStringHash<XMLStringPoolEntry, 1024> XMLStringTable;
154
155XERCES_CPP_NAMESPACE_END
156
157#endif // XMLSTRINGPOOL_HPP
Note: See TracBrowser for help on using the repository browser.