source: icXML/icXML-devel/src/icxmlc/XMLReferenceTable.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: 7.2 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: XMLReferenceTable.hpp 207 2012-12-02 20:38:22Z robc $
10 *
11 */
12
13#if !defined(XMLREFERENCETABLE_HPP)
14#define XMLREFERENCETABLE_HPP
15
16#include <icxmlc/Array.hpp>
17#include <icxmlc/HashTable.hpp>
18#include <icxmlc/stringpool.h>
19#include <icxmlc/XMLParserDefs.hpp>
20#include <icxmlc/XMLConfig.hpp>
21
22// TODO: split the hash table and data portion of the symbol and reference tables so that the symbols themselves are localized
23// in the XMLParser and the content vs. att val content is stored in seperate hash tables.
24
25XERCES_CPP_NAMESPACE_BEGIN
26
27class XMLSymbolTable;
28class XMLReferenceTable;
29class XMLScanner;
30class XMLTranscoder;
31
32struct XMLTableRef
33{
34        friend class XMLReferenceTable;
35
36        IDISA_ALWAYS_INLINE
37        XMLTableRef()
38        : fId(0)
39        , fKey(0)
40        , fLength(0)
41        {
42
43        }
44
45        IDISA_ALWAYS_INLINE
46        ~XMLTableRef()
47        {
48
49        }
50
51        IDISA_ALWAYS_INLINE
52        XMLTableRef & operator=(const XMLTableRef & ref)
53        {
54                fKey = ref.fKey;
55                fLength = ref.fLength;
56                fId = ref.fId;
57                return *this;
58        }
59
60
61        IDISA_ALWAYS_INLINE
62        const XMLByte * getKey() const { return fKey; }
63
64        IDISA_ALWAYS_INLINE
65        unsigned int getLength() const { return fLength; }
66
67        IDISA_ALWAYS_INLINE
68        bool equals(const XMLByte * otherKey, const unsigned int length) const
69        {
70                return (fLength == length) && (XMLStringU::equals(getKey(), otherKey, length));
71        }
72
73private:
74
75        gid_t                                                   fId;
76        const XMLByte *                                 fKey;
77        unsigned int                                    fLength;
78};
79
80struct XMLReference
81{
82        friend class XMLReferenceTable;
83
84        enum ReplacementType
85        {
86                Single = 0      // single char
87                , Simple = 1    // multi char no markup
88                , Complex = 2   // content + markup
89                , Empty = 8
90        };
91
92public:
93
94        IDISA_ALWAYS_INLINE
95        XMLReference()
96        : fType(Single)
97        , fContentLength(0)
98        , fContent(0)
99        , fMarkupCount(0)
100        , fSymbolCount(0)
101        , fSymbols(0)
102        , fStringEndCount(0)
103        , fStringEndArray(0)
104        {
105
106        }
107
108        IDISA_ALWAYS_INLINE
109        ~XMLReference()
110        {
111                #ifdef PRINT_DEBUG_MESSAGE
112                delete fRefNameString;
113                #endif
114        }
115
116        IDISA_ALWAYS_INLINE
117        XMLReference & operator=(const XMLReference & ref)
118        {
119                fType = ref.fType;
120                fContentLength = ref.fContentLength;
121                fContent = ref.fContent;
122                fMarkupCount = ref.fMarkupCount;
123                fSymbolCount = ref.fSymbolCount;
124                fSymbols = ref.fSymbols;
125                fStringEndCount = ref.fStringEndCount;
126                fStringEndArray = ref.fStringEndArray;
127                #ifdef PRINT_DEBUG_MESSAGE
128                fRefNameString = XMLString::replicate(ref.fRefNameString);
129                #endif
130                return *this;
131        }
132
133        IDISA_ALWAYS_INLINE
134        unsigned int getContentLength() const { return fContentLength; }
135
136        IDISA_ALWAYS_INLINE
137        const XMLCh * getContent() const { return fContent; }
138
139        IDISA_ALWAYS_INLINE
140        unsigned int getMarkupCount() const { return fMarkupCount; }
141
142        IDISA_ALWAYS_INLINE
143        const XMLSize_t * getStringEndArray() const { return fStringEndArray; }
144
145        IDISA_ALWAYS_INLINE
146        unsigned int getStringEndCount() const { return fStringEndCount; }
147
148        IDISA_ALWAYS_INLINE
149        const gid_t * getSymbolArray() const { return fSymbols; }
150
151        IDISA_ALWAYS_INLINE
152        unsigned int getSymbolCount() const { return fSymbolCount; }
153
154        IDISA_ALWAYS_INLINE
155        ReplacementType getType() const { return fType; }
156
157
158public:
159
160        ReplacementType                                 fType;
161
162        unsigned int                                    fContentLength;
163        const XMLCh *                                   fContent;
164
165        unsigned int                                    fMarkupCount;
166        unsigned int                                    fSymbolCount;
167        const gid_t *                                   fSymbols;
168        unsigned int                                    fStringEndCount;
169        const XMLSize_t *                               fStringEndArray;
170        #ifdef PRINT_DEBUG_MESSAGE
171        char *                                                  fRefNameString;
172        #endif
173
174};
175
176#ifdef PRINT_DEBUG_MESSAGE
177static std::ostream & operator << (std::ostream & out, const XMLReference & ref)
178{
179        out << ref.fRefNameString;
180        return out;
181}
182
183static std::ostream & operator << (std::ostream & out, const XMLReference * ref)
184{
185        if (ref) out << (*ref);
186        return out;
187}
188#endif
189
190class XMLReferenceTable
191{
192        public:
193
194                XMLReferenceTable
195                (
196                        XMLTranscoder *                 transcoder
197                        , MemoryManager *               manager
198                )
199                : fEntityCount(0)
200                , fEntityPool(manager)
201                , fContentPool(manager)
202                , fSymbolPool(manager)
203                , fStringEndPool(manager)
204                , fStartPosition(0)
205                , fResumeRef(0)
206//              , fComplexRefs(0)
207                , fTranscoder(transcoder)
208                , fMemoryManager(manager)
209                {
210
211                }
212
213                ~XMLReferenceTable()
214                {
215
216                }
217
218                XMLReference * operator[](const gid_t gid)
219                {
220                        return &fEntityTable[gid];
221                }
222
223                const XMLReference * operator[](const gid_t gid) const
224                {
225                        return &fEntityTable[gid];
226                }
227
228                size_t count() const
229                {
230                        return fEntityCount;
231                }
232
233                template<unsigned int CodeUnitSize>
234                void findAndExpandRefs
235                (
236                        const ubitblock                                 refMarkers
237                        , const XMLByte *                               source
238                        , const size_t                                  sourceOffset
239                        , const ubitblock                               refStart
240                        , const size_t                                  refStartOffset
241                        , const ubitblock                               delCount
242                        , const ubitblock                               attValSpan
243
244                        ,               XMLScanner *                    scanner
245                        ,               XMLSymbolTable *                symbolTable
246
247                        ,               ContentStream &                 contentStream
248                        ,       XMLCh * &                               contentStreamPtr
249                        ,               StringPtrArray &                stringEndArray
250                        , const XMLCh     ** &                  stringEndPtr
251                        ,       unsigned int &                  markupCount
252                        ,               unsigned int &                  symbolCount
253                        ,               XMLComplexRefArray &    complexRefArray
254                        ,               XMLSize_t &                             complexRefCount
255                );
256
257        private:
258
259                template<unsigned int CodeUnitSize>
260                IDISA_ALWAYS_INLINE
261                gid_t addOrFind
262                (
263                        const XMLByte * entityName
264                        , const size_t length
265                        , const bool inAttVal
266                        , XMLScanner * scanner
267                        , XMLSymbolTable *      symbolTable
268                );
269
270                template<unsigned int CodeUnitSize>
271                gid_t expandRef
272                (
273                        const XMLByte *                         entityName
274                        , const size_t                          length
275                        , const bool                            inAttVal
276                        , XMLScanner *                          scanner
277                        , XMLSymbolTable *                      symbolTable
278                );
279
280                IDISA_ALWAYS_INLINE
281                void parseRef
282                (
283                        XMLCh *                                         entity
284                        , XMLSize_t                                     length
285                        , const bool                            inAttVal
286                        , XMLReference &                        toFill
287                        , XMLScanner *                          scanner
288                        , XMLSymbolTable *                      symbolTable
289                );
290
291                IDISA_ALWAYS_INLINE
292                void updateContentStream
293                (
294                        const gid_t *                           refArray
295                        , const size_t *                        refPosArray
296                        , XMLSize_t                                     count
297                        , XMLSize_t                                     sumOfRefLengths
298                        , XMLSize_t                                     sumOfStringEndCount
299                        ,               ContentStream &         contentStream
300                        ,       XMLCh * &                       contentStreamPtr
301                        ,               StringPtrArray &        stringEndArray
302                        , const XMLCh     ** &          stringEndPtr
303                );
304
305                IDISA_ALWAYS_INLINE
306                static XMLSize_t normalizeValue
307                (
308                        XMLCh *                                         entity
309                        , XMLSize_t                                     length
310                        , bool                                          isAttributeValue
311                        , const XMLScanner * const      scanner
312                );
313
314        public:
315
316                size_t                                                                                                          fRefStartPosition;
317                size_t                                                                                                          fStartPosition;
318                bool                                                                                                            fResumeRef;
319
320        private:
321
322                HashTable<XMLTableRef, XMLByte, 23>                                                     fEntityRefTable[2];
323
324                DynamicArray<XMLReference, 32>                                                          fEntityTable;
325
326                XMLSize_t                                                                                                       fEntityCount;
327
328                // Investigate whether it would be better to simply have one entity pool that contains
329                // all of the entity data. Kept as seperate pools for now for design simplicity.
330                StringPool<XMLByte, 128, 1>                                                                     fEntityPool;
331                StringPool<XMLCh, 1024, 1>                                                                      fContentPool;
332                StringPool<gid_t, 16, 0>                                                                        fSymbolPool;
333                StringPool<XMLSize_t, 16, 0>                                                            fStringEndPool;
334
335//              DynamicArray<XMLComplexRef, 4>                                                          fComplexRef;
336//              XMLSize_t                                                                                                       fComplexRefs;
337
338                XMLTranscoder * const                                                                           fTranscoder;
339
340                MemoryManager * const                                                                           fMemoryManager;
341};
342
343XERCES_CPP_NAMESPACE_END
344
345#endif // XMLREFERENCETABLE_HPP
Note: See TracBrowser for help on using the repository browser.