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

📄 qmap.h

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 H
📖 第 1 页 / 共 2 页
字号:
    header = new Node;    header->color = QMapNodeBase::Red; // Mark the header    if ( _map->header->parent == 0 ) {	header->parent = 0;	header->left = header->right = header;    } else {	header->parent = copy( (NodePtr)(_map->header->parent) );	header->parent->parent = header;	header->left = header->parent->minimum();	header->right = header->parent->maximum();    }}template <class Key, class T>Q_INLINE_TEMPLATES Q_TYPENAME QMapPrivate<Key,T>::NodePtr QMapPrivate<Key,T>::copy( Q_TYPENAME QMapPrivate<Key,T>::NodePtr p ){    if ( !p )	return 0;    NodePtr n = new Node( *p );    n->color = p->color;    if ( p->left ) {	n->left = copy( (NodePtr)(p->left) );	n->left->parent = n;    } else {	n->left = 0;    }    if ( p->right ) {	n->right = copy( (NodePtr)(p->right) );	n->right->parent = n;    } else {	n->right = 0;    }    return n;}template <class Key, class T>Q_INLINE_TEMPLATES void QMapPrivate<Key,T>::clear(){    clear( (NodePtr)(header->parent) );    header->color = QMapNodeBase::Red;    header->parent = 0;    header->left = header->right = header;    node_count = 0;}template <class Key, class T>Q_INLINE_TEMPLATES void QMapPrivate<Key,T>::clear( Q_TYPENAME QMapPrivate<Key,T>::NodePtr p ){    while ( p != 0 ) {	clear( (NodePtr)p->right );	NodePtr y = (NodePtr)p->left;	delete p;	p = y;    }}template <class Key, class T>Q_INLINE_TEMPLATES Q_TYPENAME QMapPrivate<Key,T>::ConstIterator QMapPrivate<Key,T>::find(const Key& k) const{    QMapNodeBase* y = header;        // Last node    QMapNodeBase* x = header->parent; // Root node.    while ( x != 0 ) {	// If as k <= key(x) go left	if ( !( key(x) < k ) ) {	    y = x;	    x = x->left;	} else {	    x = x->right;	}    }    // Was k bigger/smaller then the biggest/smallest    // element of the tree ? Return end()    if ( y == header || k < key(y) )	return ConstIterator( header );    return ConstIterator( (NodePtr)y );}template <class Key, class T>Q_INLINE_TEMPLATES Q_TYPENAME QMapPrivate<Key,T>::Iterator QMapPrivate<Key,T>::insertSingle( const Key& k ){    // Search correct position in the tree    QMapNodeBase* y = header;    QMapNodeBase* x = header->parent;    bool result = TRUE;    while ( x != 0 ) {	result = ( k < key(x) );	y = x;	x = result ? x->left : x->right;    }    // Get iterator on the last not empty one    Iterator j( (NodePtr)y );    if ( result ) {	// Smaller then the leftmost one ?	if ( j == begin() ) {	    return insert(x, y, k );	} else {	    // Perhaps daddy is the right one ?	    --j;	}    }    // Really bigger ?    if ( (j.node->key) < k )	return insert(x, y, k );    // We are going to replace a node    return j;}template <class Key, class T>Q_INLINE_TEMPLATES Q_TYPENAME QMapPrivate<Key,T>::Iterator QMapPrivate<Key,T>::insert( QMapNodeBase* x, QMapNodeBase* y, const Key& k ){    NodePtr z = new Node( k );    if (y == header || x != 0 || k < key(y) ) {	y->left = z;                // also makes leftmost = z when y == header	if ( y == header ) {	    header->parent = z;	    header->right = z;	} else if ( y == header->left )	    header->left = z;           // maintain leftmost pointing to min node    } else {	y->right = z;	if ( y == header->right )	    header->right = z;          // maintain rightmost pointing to max node    }    z->parent = y;    z->left = 0;    z->right = 0;    rebalance( z, header->parent );    ++node_count;    return Iterator(z);}#ifdef QT_CHECK_RANGE# if !defined( QT_NO_DEBUG ) && defined( QT_CHECK_MAP_RANGE )#  define QT_CHECK_INVALID_MAP_ELEMENT if ( empty() ) qWarning( "QMap: Warning invalid element" )#  define QT_CHECK_INVALID_MAP_ELEMENT_FATAL Q_ASSERT( !empty() );# else#  define QT_CHECK_INVALID_MAP_ELEMENT#  define QT_CHECK_INVALID_MAP_ELEMENT_FATAL# endif#else# define QT_CHECK_INVALID_MAP_ELEMENT# define QT_CHECK_INVALID_MAP_ELEMENT_FATAL#endiftemplate <class T> class QDeepCopy;template<class Key, class T>class QMap{public:    /**     * Typedefs     */    typedef Key key_type;    typedef T mapped_type;    typedef QPair<const key_type, mapped_type> value_type;    typedef value_type* pointer;    typedef const value_type* const_pointer;    typedef value_type& reference;    typedef const value_type& const_reference;#ifndef QT_NO_STL    typedef ptrdiff_t  difference_type;#else    typedef int difference_type;#endif    typedef size_t      size_type;    typedef QMapIterator<Key,T> iterator;    typedef QMapConstIterator<Key,T> const_iterator;    typedef QPair<iterator,bool> insert_pair;    typedef QMapIterator< Key, T > Iterator;    typedef QMapConstIterator< Key, T > ConstIterator;    typedef T ValueType;    typedef QMapPrivate< Key, T > Priv;    /**     * API     */    QMap()    {	sh = new QMapPrivate< Key, T >;    }    QMap( const QMap<Key,T>& m )    {	sh = m.sh; sh->ref();    }#ifndef QT_NO_STL    QMap( const std::map<Key,T>& m )    {	sh = new QMapPrivate<Key,T>;	Q_TYPENAME std::map<Key,T>::const_iterator it = m.begin();	for ( ; it != m.end(); ++it ) {	    value_type p( (*it).first, (*it).second );	    insert( p );	}    }#endif    ~QMap()    {	if ( sh->deref() )	    delete sh;    }    QMap<Key,T>& operator= ( const QMap<Key,T>& m );#ifndef QT_NO_STL    QMap<Key,T>& operator= ( const std::map<Key,T>& m )    {	clear();	Q_TYPENAME std::map<Key,T>::const_iterator it = m.begin();	for ( ; it != m.end(); ++it ) {	    value_type p( (*it).first, (*it).second );	    insert( p );	}	return *this;    }#endif    iterator begin() { detach(); return sh->begin(); }    iterator end() { detach(); return sh->end(); }    const_iterator begin() const { return ((const Priv*)sh)->begin(); }    const_iterator end() const { return ((const Priv*)sh)->end(); }    const_iterator constBegin() const { return begin(); }    const_iterator constEnd() const { return end(); }    iterator replace( const Key& k, const T& v )    {	remove( k );	return insert( k, v );    }    size_type size() const    {	return sh->node_count;    }    bool empty() const    {	return sh->node_count == 0;    }    QPair<iterator,bool> insert( const value_type& x );    void erase( iterator it )    {	detach();	sh->remove( it );    }    void erase( const key_type& k );    size_type count( const key_type& k ) const;    T& operator[] ( const Key& k );    void clear();    iterator find ( const Key& k )    {	detach();	return iterator( sh->find( k ).node );    }    const_iterator find ( const Key& k ) const {	return sh->find( k ); }    const T& operator[] ( const Key& k ) const	{ QT_CHECK_INVALID_MAP_ELEMENT; return sh->find( k ).data(); }    bool contains ( const Key& k ) const	{ return find( k ) != end(); }	//{ return sh->find( k ) != ((const Priv*)sh)->end(); }    size_type count() const { return sh->node_count; }    QValueList<Key> keys() const {	QValueList<Key> r;	for (const_iterator i=begin(); i!=end(); ++i)	    r.append(i.key());	return r;    }    QValueList<T> values() const {	QValueList<T> r;	for (const_iterator i=begin(); i!=end(); ++i)	    r.append(*i);	return r;    }    bool isEmpty() const { return sh->node_count == 0; }    iterator insert( const Key& key, const T& value, bool overwrite = TRUE );    void remove( iterator it ) { detach(); sh->remove( it ); }    void remove( const Key& k );#if defined(Q_FULL_TEMPLATE_INSTANTIATION)    bool operator==( const QMap<Key,T>& ) const { return FALSE; }#ifndef QT_NO_STL    bool operator==( const std::map<Key,T>& ) const { return FALSE; }#endif#endifprotected:    /**     * Helpers     */    void detach() {  if ( sh->count > 1 ) detachInternal(); }    Priv* sh;private:    void detachInternal();    friend class QDeepCopy< QMap<Key,T> >;};template<class Key, class T>Q_INLINE_TEMPLATES QMap<Key,T>& QMap<Key,T>::operator= ( const QMap<Key,T>& m ){    m.sh->ref();    if ( sh->deref() )	delete sh;    sh = m.sh;    return *this;}template<class Key, class T>Q_INLINE_TEMPLATES Q_TYPENAME QMap<Key,T>::insert_pair QMap<Key,T>::insert( const Q_TYPENAME QMap<Key,T>::value_type& x ){    detach();    size_type n = size();    iterator it = sh->insertSingle( x.first );    bool inserted = FALSE;    if ( n < size() ) {	inserted = TRUE;	it.data() = x.second;    }    return QPair<iterator,bool>( it, inserted );}template<class Key, class T>Q_INLINE_TEMPLATES void QMap<Key,T>::erase( const Key& k ){    detach();    iterator it( sh->find( k ).node );    if ( it != end() )	sh->remove( it );}template<class Key, class T>Q_INLINE_TEMPLATES Q_TYPENAME QMap<Key,T>::size_type QMap<Key,T>::count( const Key& k ) const{    const_iterator it( sh->find( k ).node );    if ( it != end() ) {	size_type c = 0;	while ( it != end() ) {	    ++it;	    ++c;	}	return c;    }    return 0;}template<class Key, class T>Q_INLINE_TEMPLATES T& QMap<Key,T>::operator[] ( const Key& k ){    detach();    QMapNode<Key,T>* p = sh->find( k ).node;    if ( p != sh->end().node )	return p->data;    return insert( k, T() ).data();}template<class Key, class T>Q_INLINE_TEMPLATES void QMap<Key,T>::clear(){    if ( sh->count == 1 )	sh->clear();    else {	sh->deref();	sh = new QMapPrivate<Key,T>;    }}template<class Key, class T>Q_INLINE_TEMPLATES Q_TYPENAME QMap<Key,T>::iterator QMap<Key,T>::insert( const Key& key, const T& value, bool overwrite ){    detach();    size_type n = size();    iterator it = sh->insertSingle( key );    if ( overwrite || n < size() )	it.data() = value;    return it;}template<class Key, class T>Q_INLINE_TEMPLATES void QMap<Key,T>::remove( const Key& k ){    detach();    iterator it( sh->find( k ).node );    if ( it != end() )	sh->remove( it );}template<class Key, class T>Q_INLINE_TEMPLATES void QMap<Key,T>::detachInternal(){    sh->deref(); sh = new QMapPrivate<Key,T>( sh );}#ifndef QT_NO_DATASTREAMtemplate<class Key, class T>Q_INLINE_TEMPLATES QDataStream& operator>>( QDataStream& s, QMap<Key,T>& m ) {    m.clear();    Q_UINT32 c;    s >> c;    for( Q_UINT32 i = 0; i < c; ++i ) {	Key k; T t;	s >> k >> t;	m.insert( k, t );	if ( s.atEnd() )	    break;    }    return s;}template<class Key, class T>Q_INLINE_TEMPLATES QDataStream& operator<<( QDataStream& s, const QMap<Key,T>& m ) {    s << (Q_UINT32)m.size();    QMapConstIterator<Key,T> it = m.begin();    for( ; it != m.end(); ++it )	s << it.key() << it.data();    return s;}#endif#define Q_DEFINED_QMAP#include "qwinexport.h"#endif // QMAP_H

⌨️ 快捷键说明

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