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

📄 kwqptrdictimpl.cpp

📁 khtml在gtk上的移植版本
💻 CPP
字号:
/* * Copyright (C) 2001, 2002 Apple Computer, Inc.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */#include <string.h>#include "KWQPtrDictImpl.h"#include "KWQAssertions.h"#include "KWQMap.h"typedef void (* DeleteFunction) (void *);class KWQPtrDictPrivate{public:    KWQPtrDictPrivate(int size, DeleteFunction);    KWQPtrDictPrivate(const KWQPtrDictPrivate &dp);    ~KWQPtrDictPrivate();        QMap<void*,void*> map;    DeleteFunction del;    KWQPtrDictIteratorPrivate *iterators;    };class KWQPtrDictIteratorPrivate{public:    KWQPtrDictIteratorPrivate(KWQPtrDictPrivate *);    ~KWQPtrDictIteratorPrivate();        void remove(void *key);    void dictDestroyed();        uint count;    uint pos;    void **keys;    void **values;    KWQPtrDictPrivate *dict;    KWQPtrDictIteratorPrivate *next;    KWQPtrDictIteratorPrivate *prev;};KWQPtrDictPrivate::KWQPtrDictPrivate(int size, DeleteFunction deleteFunc)    :       del(deleteFunc),      iterators(0){}KWQPtrDictPrivate::KWQPtrDictPrivate(const KWQPtrDictPrivate &dp)    : map(dp.map),    del(dp.del),    iterators(0){}KWQPtrDictPrivate::~KWQPtrDictPrivate(){    for (KWQPtrDictIteratorPrivate *it = iterators; it; it = it->next) {        it->dictDestroyed();    }}KWQPtrDictImpl::KWQPtrDictImpl(int size, void (*deleteFunc)(void *))    :d(new KWQPtrDictPrivate(size, deleteFunc)){}KWQPtrDictImpl::KWQPtrDictImpl(const KWQPtrDictImpl &di) :        d(new KWQPtrDictPrivate(*di.d)){}KWQPtrDictImpl::~KWQPtrDictImpl(){    delete d;}void KWQPtrDictImpl::clear(bool deleteItems){    if (deleteItems) {	ASSERT(d->del);        DeleteFunction deleteFunc = d->del;		QMap<void*,void*>::Iterator iter = d->map.begin();		while ( iter != d->map.end()){	    deleteFunc(*iter);	    ++iter;	}    }        d->map.clear();}uint KWQPtrDictImpl::count() const{    return d->map.count();}void KWQPtrDictImpl::insert(void *key, const void *value){    d->map.insert(key,const_cast<void*const>(value));}bool KWQPtrDictImpl::remove(void *key, bool deleteItem){    QMap<void*,void*>::Iterator iter = d->map.find(key);        if (iter == d->map.end())	return false;    void *value = *iter;        d->map.remove(iter);        if (deleteItem)    {			d->del( value );    }        for (KWQPtrDictIteratorPrivate *it = d->iterators; it; it = it->next) {        it->remove(key);    }    return true;}void *KWQPtrDictImpl::find(void *key) const{    return *(d->map.find(key));}void KWQPtrDictImpl::swap(KWQPtrDictImpl &di){    KWQPtrDictPrivate *tmp;    tmp = di.d;    di.d = d;    d = tmp;}KWQPtrDictImpl &KWQPtrDictImpl::assign(const KWQPtrDictImpl &di, bool deleteItems){    KWQPtrDictImpl tmp(di);        if (deleteItems) {	clear(true);    }    swap(tmp);    return *this;}void *KWQPtrDictImpl::take(void *key){    QMap<void*,void*>::Iterator iter = d->map.find(key);    if (iter == d->map.end())	return 0;        void *value = *iter;    d->map.remove(iter);        for (KWQPtrDictIteratorPrivate *it = d->iterators; it; it = it->next) {        it->remove(key);    }        return value;}KWQPtrDictIteratorPrivate::KWQPtrDictIteratorPrivate(KWQPtrDictPrivate *d) :    count(d->map.count()),    pos(0),    keys(new void * [count]),    values(new void * [count]),    dict(d),    next(d->iterators),    prev(0){    d->iterators = this;    if (next) {        next->prev = this;    }        unsigned int i = 0;    QMap<void*,void*>::Iterator it = d->map.begin();    QMap<void*,void*>::Iterator end = d->map.end();        while (it != end) {	keys[i] = it.key();	values[i] = it.data();	++i;	++it;    }    ASSERT(i==count);	}KWQPtrDictIteratorPrivate::~KWQPtrDictIteratorPrivate(){    if (prev) {        prev->next = next;    } else if (dict) {        dict->iterators = next;    }    if (next) {        next->prev = prev;    }        delete [] keys;    delete [] values;}KWQPtrDictIteratorImpl::KWQPtrDictIteratorImpl(const KWQPtrDictImpl &di)    :d(new KWQPtrDictIteratorPrivate(di.d)){}KWQPtrDictIteratorImpl::~KWQPtrDictIteratorImpl(){    delete d;}uint KWQPtrDictIteratorImpl::count() const{    return d->count;}void *KWQPtrDictIteratorImpl::current() const{    if (d->pos >= d->count) {	return NULL;    }    return d->values[d->pos];}void *KWQPtrDictIteratorImpl::currentKey() const{    if (d->pos >= d->count) {	return NULL;    }    return d->keys[d->pos];}void *KWQPtrDictIteratorImpl::toFirst(){    d->pos = 0;    return current();}void *KWQPtrDictIteratorImpl::operator++(){    ++d->pos;    return current();}void KWQPtrDictIteratorPrivate::remove(void *key){    for (uint i = 0; i < count; ) {        if (keys[i] != key) {            ++i;        } else {            --count;            if (pos > i) {                --pos;            }            memmove(&keys[i], &keys[i+1], sizeof(keys[i]) * (count - i));            memmove(&values[i], &values[i+1], sizeof(values[i]) * (count - i));        }    }}void KWQPtrDictIteratorPrivate::dictDestroyed(){    count = 0;    dict = 0;}

⌨️ 快捷键说明

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