⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 domdeepnodelistpool.c

📁 基于属性证书的访问控制源代码,由c++编写,包括openssl,xercesc等
💻 C
📖 第 1 页 / 共 2 页
字号:
            //    can be ignored since fAdoptedElements is false.            if (fAdoptedElems)                delete curElem->fData;            // Then delete the current element and move forward            fMemoryManager->deallocate(curElem->fKey2);//delete [] curElem->fKey2;            fMemoryManager->deallocate(curElem->fKey3);//delete [] curElem->fKey3;            delete curElem;            curElem = nextElem;        }        // Clean out this entry        fBucketList[buckInd] = 0;    }    // Reset the id counter    fIdCounter = 0;}template <class TVal> void DOMDeepNodeListPool<TVal>::cleanup(){    removeAll();    // Then delete the bucket list & hasher & id pointers list    fMemoryManager->deallocate(fIdPtrs);//delete [] fIdPtrs;    fMemoryManager->deallocate(fBucketList);//delete [] fBucketList;    delete fHash;}// ---------------------------------------------------------------------------//  DOMDeepNodeListPool: Getters// ---------------------------------------------------------------------------template <class TVal> TVal*DOMDeepNodeListPool<TVal>::getByKey(const void* const key1, const XMLCh* const key2, const XMLCh* const key3){    XMLSize_t hashVal;    DOMDeepNodeListPoolTableBucketElem<TVal>* findIt = findBucketElem(key1, key2, key3, hashVal);    if (!findIt)        return 0;    return findIt->fData;}template <class TVal> const TVal*DOMDeepNodeListPool<TVal>::getByKey(const void* const key1, const XMLCh* const key2, const XMLCh* const key3) const{    XMLSize_t hashVal;    const DOMDeepNodeListPoolTableBucketElem<TVal>* findIt = findBucketElem(key1, key2, key3, hashVal);    if (!findIt)        return 0;    return findIt->fData;}template <class TVal> TVal*DOMDeepNodeListPool<TVal>::getById(const XMLSize_t elemId){    // If its either zero or beyond our current id, its an error    if (!elemId || (elemId > fIdCounter))        ThrowXMLwithMemMgr(IllegalArgumentException, XMLExcepts::Pool_InvalidId, fMemoryManager);    return fIdPtrs[elemId];}template <class TVal> const TVal*DOMDeepNodeListPool<TVal>::getById(const XMLSize_t elemId) const{    // If its either zero or beyond our current id, its an error    if (!elemId || (elemId > fIdCounter))        ThrowXMLwithMemMgr(IllegalArgumentException, XMLExcepts::Pool_InvalidId, fMemoryManager);    return fIdPtrs[elemId];}// ---------------------------------------------------------------------------//  DOMDeepNodeListPool: Putters// ---------------------------------------------------------------------------template <class TVal> XMLSize_tDOMDeepNodeListPool<TVal>::put(void* key1, XMLCh* key2, XMLCh* key3, TVal* const valueToAdopt){    // First see if the key exists already    XMLSize_t hashVal;    DOMDeepNodeListPoolTableBucketElem<TVal>* newBucket = findBucketElem(key1, key2, key3, hashVal);    //    //  If so,then update its value. If not, then we need to add it to    //  the right bucket    //    if (newBucket)    {        if (fAdoptedElems)            delete newBucket->fData;        fMemoryManager->deallocate(newBucket->fKey2);//delete[] newBucket->fKey2;        fMemoryManager->deallocate(newBucket->fKey3);//delete[] newBucket->fKey3;        newBucket->fData = valueToAdopt;        newBucket->fKey1 = key1;        newBucket->fKey2 = XMLString::replicate(key2, fMemoryManager);        newBucket->fKey3 = XMLString::replicate(key3, fMemoryManager);    }    else    {    // Revisit: the gcc compiler 2.95.x is generating an    // internal compiler error message. So we use the default    // memory manager for now.#if defined (XML_GCC_VERSION) && (XML_GCC_VERSION < 29600)        newBucket = new DOMDeepNodeListPoolTableBucketElem<TVal>        (            key1            , key2            , key3            , valueToAdopt            , fBucketList[hashVal]            , fMemoryManager        );#else        newBucket = new (fMemoryManager) DOMDeepNodeListPoolTableBucketElem<TVal>        (            key1            , key2            , key3            , valueToAdopt            , fBucketList[hashVal]            , fMemoryManager        );#endif        fBucketList[hashVal] = newBucket;    }    //    //  Give this new one the next available id and add to the pointer list.    //  Expand the list if that is now required.    //    if (fIdCounter + 1 == fIdPtrsCount)    {        // Create a new count 1.5 times larger and allocate a new array        XMLSize_t newCount = (XMLSize_t)(fIdPtrsCount * 1.5);        TVal** newArray = (TVal**) fMemoryManager->allocate        (            newCount * sizeof(TVal*)        );//new TVal*[newCount];        // Copy over the old contents to the new array        memcpy(newArray, fIdPtrs, fIdPtrsCount * sizeof(TVal*));        // Ok, toss the old array and store the new data        fMemoryManager->deallocate(fIdPtrs); //delete [] fIdPtrs;        fIdPtrs = newArray;        fIdPtrsCount = newCount;    }    const XMLSize_t retId = ++fIdCounter;    fIdPtrs[retId] = valueToAdopt;    // Return the id that we gave to this element    return retId;}// ---------------------------------------------------------------------------//  DOMDeepNodeListPool: Private methods// ---------------------------------------------------------------------------template <class TVal> DOMDeepNodeListPoolTableBucketElem<TVal>* DOMDeepNodeListPool<TVal>::findBucketElem(const void* const key1, const XMLCh* const key2, const XMLCh* const key3, XMLSize_t& hashVal){    // Hash the key    hashVal = fHash->getHashVal(key1, fHashModulus, fMemoryManager);    if (hashVal > fHashModulus)        ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::HshTbl_BadHashFromKey, fMemoryManager);    // Search that bucket for the key    DOMDeepNodeListPoolTableBucketElem<TVal>* curElem = fBucketList[hashVal];    while (curElem)    {        //key2 and key3 are XMLCh*, compareString takes null pointer vs zero len string the same        //but we need them to be treated as different keys in this case        if (fHash->equals(key1, curElem->fKey1) && (XMLString::equals(key2, curElem->fKey2)) && (XMLString::equals(key3, curElem->fKey3))) {            if (!key2 || !curElem->fKey2) {                if (key2 || curElem->fKey2) {                    curElem = curElem->fNext;                    continue;                }            }            if (!key3 || !curElem->fKey3) {                if (key3 || curElem->fKey3) {                    curElem = curElem->fNext;                    continue;                }            }            return curElem;        }        curElem = curElem->fNext;    }    return 0;}template <class TVal> const DOMDeepNodeListPoolTableBucketElem<TVal>* DOMDeepNodeListPool<TVal>::findBucketElem(const void* const key1, const XMLCh* const key2, const XMLCh* const key3, XMLSize_t& hashVal) const{    // Hash the key    hashVal = fHash->getHashVal(key1, fHashModulus, fMemoryManager);    if (hashVal > fHashModulus)        ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::HshTbl_BadHashFromKey, fMemoryManager);    // Search that bucket for the key    const DOMDeepNodeListPoolTableBucketElem<TVal>* curElem = fBucketList[hashVal];    while (curElem)    {        //key2 and key3 are XMLCh*, compareString takes null pointer vs zero len string the same        //but we need them to be treated as different keys in this case        if (fHash->equals(key1, curElem->fKey1) && (XMLString::equals(key2, curElem->fKey2)) && (XMLString::equals(key3, curElem->fKey3))) {            if (!key2 || !curElem->fKey2) {                if (key2 || curElem->fKey2) {                    curElem = curElem->fNext;                    continue;                }            }            if (!key3 || !curElem->fKey3) {                if (key3 || curElem->fKey3) {                    curElem = curElem->fNext;                    continue;                }            }            return curElem;        }        curElem = curElem->fNext;    }    return 0;}XERCES_CPP_NAMESPACE_END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -