valuestorecache.cpp
来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 218 行
CPP
218 行
/* * Copyright 2001,2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//* * $Log: ValueStoreCache.cpp,v $ * Revision 1.11 2004/09/08 13:56:59 peiyongz * Apache License Version 2.0 * * Revision 1.10 2003/12/17 00:18:41 cargilld * Update to memory management so that the static memory manager (one used to call Initialize) is only for static data. * * Revision 1.9 2003/10/01 16:32:42 neilg * improve handling of out of memory conditions, bug #23415. Thanks to David Cargill. * * Revision 1.8 2003/05/26 22:05:01 knoaman * Pass the memory manager to XMLString::replicate. * * Revision 1.7 2003/05/18 14:02:09 knoaman * Memory manager implementation: pass per instance manager. * * Revision 1.6 2003/05/15 18:59:34 knoaman * Partial implementation of the configurable memory manager. * * Revision 1.5 2002/11/04 14:47:41 tng * C++ Namespace Support. * * Revision 1.4 2002/08/28 13:41:20 knoaman * missing type info. * * Revision 1.3 2002/08/27 05:56:19 knoaman * Identity Constraint: handle case of recursive elements. * * Revision 1.2 2002/08/26 23:48:09 knoaman * Fix for ValueStore's null pointer. * * Revision 1.1.1.1 2002/02/01 22:22:51 peiyongz * sane_include * * Revision 1.1 2001/11/02 14:08:40 knoaman * Add support for identity constraints. * */// ---------------------------------------------------------------------------// Includes// ---------------------------------------------------------------------------#include <xercesc/validators/schema/identity/ValueStoreCache.hpp>#include <xercesc/validators/schema/identity/ValueStore.hpp>#include <xercesc/validators/schema/SchemaElementDecl.hpp>#include <xercesc/util/HashPtr.hpp>#include <xercesc/util/OutOfMemoryException.hpp>XERCES_CPP_NAMESPACE_BEGIN// ---------------------------------------------------------------------------// ValueStoreCache: Constructors and Destructor// ---------------------------------------------------------------------------ValueStoreCache::ValueStoreCache(MemoryManager* const manager) : fValueStores(0) , fGlobalICMap(0) , fIC2ValueStoreMap(0) , fGlobalMapStack(0) , fScanner(0) , fMemoryManager(manager){ try { init(); } catch(const OutOfMemoryException&) { throw; } catch(...) { cleanUp(); throw; }}ValueStoreCache::~ValueStoreCache(){ cleanUp();}// ---------------------------------------------------------------------------// ValueStoreCache: Document handling methods// ---------------------------------------------------------------------------void ValueStoreCache::startDocument() { fIC2ValueStoreMap->removeAll(); fGlobalICMap->removeAll(); fValueStores->removeAllElements(); fGlobalMapStack->removeAllElements();}void ValueStoreCache::startElement() { fGlobalMapStack->push(fGlobalICMap); fGlobalICMap = new (fMemoryManager) RefHashTableOf<ValueStore> ( 13 , false , new (fMemoryManager) HashPtr() , fMemoryManager );}void ValueStoreCache::endElement() { if (fGlobalMapStack->empty()) { return; // must be an invalid doc! } RefHashTableOf<ValueStore>* oldMap = fGlobalMapStack->pop(); RefHashTableOfEnumerator<ValueStore> mapEnum(oldMap, false, fMemoryManager);// Janitor<RefHashTableOf<ValueStore> > janMap(oldMap); while (mapEnum.hasMoreElements()) { ValueStore& oldVal = mapEnum.nextElement(); IdentityConstraint* ic = oldVal.getIdentityConstraint(); ValueStore* currVal = fGlobalICMap->get(ic); if (!currVal) { fGlobalICMap->put(ic, &oldVal); } else { currVal->append(&oldVal); } } delete oldMap;}// ---------------------------------------------------------------------------// ValueStoreCache: Helper methods// ---------------------------------------------------------------------------void ValueStoreCache::cleanUp() { delete fIC2ValueStoreMap; delete fGlobalICMap; delete fGlobalMapStack; delete fValueStores;}void ValueStoreCache::init() { fValueStores = new (fMemoryManager) RefVectorOf<ValueStore>(8, true, fMemoryManager); fGlobalICMap = new (fMemoryManager) RefHashTableOf<ValueStore> ( 13 , false , new (fMemoryManager) HashPtr() , fMemoryManager ); fIC2ValueStoreMap = new (fMemoryManager) RefHash2KeysTableOf<ValueStore> ( 13 , false , new (fMemoryManager) HashPtr() , fMemoryManager ); fGlobalMapStack = new (fMemoryManager) RefStackOf<RefHashTableOf<ValueStore> >(8, true, fMemoryManager);}void ValueStoreCache::initValueStoresFor(SchemaElementDecl* const elemDecl, const int initialDepth) { // initialize value stores for unique fields unsigned int icCount = elemDecl->getIdentityConstraintCount(); for (unsigned int i=0; i<icCount; i++) { IdentityConstraint* ic = elemDecl->getIdentityConstraintAt(i); ValueStore* valueStore = new (fMemoryManager) ValueStore(ic, fScanner, fMemoryManager); fValueStores->addElement(valueStore); fIC2ValueStoreMap->put(ic, initialDepth, valueStore); }}void ValueStoreCache::transplant(IdentityConstraint* const ic, const int initialDepth) { if (ic->getType() == IdentityConstraint::KEYREF) { return; } ValueStore* newVals = fIC2ValueStoreMap->get(ic, initialDepth); ValueStore* currVals = fGlobalICMap->get(ic); if (currVals) { currVals->append(newVals); } else { ValueStore* valueStore = new (fMemoryManager) ValueStore(ic, fScanner, fMemoryManager); fValueStores->addElement(valueStore); valueStore->append(newVals); fGlobalICMap->put(ic, valueStore); }}XERCES_CPP_NAMESPACE_END/** * End of file ValueStoreCache.cpp */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?