#ifndef QMAP_H
#define QMAP_H
#ifndef QATOMIC_H
#define QATOMIC_H
#if defined(QT_MOC) || defined(QT_BUILD_QMAKE) || defined(QT_RCC) || defined(QT_UIC)
#else
#include <QtCore/qatomic_arch.h>
#endif
#include <QtCore/qglobal.h>
#ifndef Q_SPECIALIZED_QATOMIC
struct QBasicAtomic{
public: int volatile atomic;
public: inline void init(int x = 0);
public: inline bool ref();
public: inline bool deref();
public: inline bool operator ==(int x) const
public: inline bool operator !=(int x) const
public: inline bool operator !() const
public: inline operator int () const
public: inline struct QBasicAtomic& operator =(int x);
public: inline bool testAndSet(int expected, int newval);
public: inline bool testAndSetAcquire(int expected, int newval);
public: inline bool testAndSetRelease(int expected, int newval);
public: inline int exchange(int newval);
};
template < typename T > struct QBasicAtomicPointer{
public: T volatile * pointer;
public: inline void init(T* t = 0);
public: inline bool operator ==(T* t) const
public: inline bool operator !=(T* t) const
public: inline bool operator !() const
public: inline operator T* () const
public: inline T* operator ->() const
public: inline struct QBasicAtomicPointer& operator =(T* t);
public: inline bool testAndSet(T* expected, T* newval);
public: inline T* exchange(T* newval);
};
#define Q_ATOMIC_INIT(a) { (a) }
#endif // Q_SPECIALIZED_QATOMIC
inline struct QMapData* qAtomicSetPtr(struct QMapData* volatile * ptr, struct QMapData* newval);
template < typename T > inline T qAtomicSetPtr(T volatile * ptr, T newval);
class QAtomic: public QBasicAtomic{
public: inline QAtomic(int x = 0);
public: inline QAtomic(class QAtomic const & copy);
public: inline class QAtomic& operator =(int x);
public: inline class QAtomic& operator =(class QAtomic const & copy);
};
template < typename T > class QAtomicPointer: public QBasicAtomicPointer < T >{
public: inline QAtomicPointer(T* t = 0);
public: inline QAtomicPointer(class QAtomicPointer const & copy);
public: inline class QAtomicPointer& operator =(T* t);
public: inline class QAtomicPointer& operator =(class QAtomicPointer const & copy);
};
template < typename T > inline void qAtomicAssign(T* & d, T* x);
template < typename T > inline void qAtomicAssign(class QBasicAtomicPointer < T >& d, T* x);
template < typename T > inline void qAtomicAssign(class QBasicAtomicPointer < T >& d, class QBasicAtomicPointer < T > const & x);
template < typename T > inline void qAtomicDetach(T* & d);
template < typename T > inline void qAtomicDetach(class QBasicAtomicPointer < T >& d);
#endif // QATOMIC_H
#include <QtCore/qiterator.h>
#include <QtCore/qlist.h>
#ifndef QT_NO_STL
#include <map>
#endif
#include <new>
#undef QT_MAP_DEBUG
typedef enum QtValidLicenseForCoreModule QtCoreModule;
struct QMapData{
public: struct Node{
public: struct QMapData::Node* backward;
public: struct QMapData::Node* forward[1];
};
public: enum /*anonymous*/{
LastLevel = 11,
Sparseness = 3,
};
public: struct QMapData* backward;
public: struct QMapData* forward[12];
public: struct QBasicAtomic ref;
public: int topLevel;
public: int size;
public: uint randomBits;
public: unsigned int insertInOrder:1;
public: unsigned int sharable:1;
public: static struct QMapData* createData();
public: void continueFreeData(int offset);
public: struct QMapData::Node* node_create(struct QMapData::Node* * update, int offset);
public: void node_delete(struct QMapData::Node* * update, int offset, struct QMapData::Node* node);
public: static struct QMapData shared_null;
};
template < typename Key > inline bool qMapLessThanKey(Key const & key1, Key const & key2);
#ifndef QT_NO_PARTIAL_TEMPLATE_SPECIALIZATION
template < typename Ptr > inline bool qMapLessThanKey(Ptr* key1, Ptr* key2);
template < typename Ptr > inline bool qMapLessThanKey(Ptr const * key1, Ptr const * key2);
#endif // QT_NO_PARTIAL_TEMPLATE_SPECIALIZATION
#if !defined(QT_NO_DATASTREAM)
template < typename Key, typename T > class QMap{
private: struct Node{
public: Key key;
public: T value;
public: struct QMapData::Node* backward;
public: struct QMapData::Node* forward[1];
};
private: union /*anonymous*/{
struct QMapData* d;
struct QMapData::Node* e;
};
private: struct PayloadNode{
public: Key key;
public: T value;
public: struct QMapData::Node* backward;
};
private: static inline int payload();
private: static inline struct QMap::Node* concrete(struct QMapData::Node* node);
public: inline QMap();
public: inline QMap(class QMap const & other);
public: inline ~QMap();
public: inline bool operator !=(class QMap const & other) const
public: inline int size() const
public: inline bool isEmpty() const
public: inline void detach();
public: inline bool isDetached() const
public: inline void setSharable(bool sharable);
public: class iterator{
private: struct QMapData::Node* i;
public: typedef struct std::bidirectional_iterator_tag iterator_category;
public: typedef ptrdiff_t difference_type;
public: typedef T value_type;
public: typedef T* pointer;
public: typedef T& reference;
public: inline operator struct QMapData::Node* () const
public: inline iterator();
public: inline iterator(struct QMapData::Node* node);
public: inline Key const & key() const
public: inline T& value() const
public: inline T& operator *() const
public: inline T* operator ->() const
public: inline bool operator ==(class QMap::iterator const & o) const
public: inline bool operator !=(class QMap::iterator const & o) const
public: inline class QMap::iterator& operator ++();
public: inline class QMap::iterator operator ++(int);
public: inline class QMap::iterator& operator --();
public: inline class QMap::iterator operator --(int);
public: inline class QMap::iterator operator +(int j) const
public: inline class QMap::iterator operator -(int j) const
public: inline class QMap::iterator& operator +=(int j);
public: inline class QMap::iterator& operator -=(int j);
public: inline bool operator ==(class QMap::const_iterator const & o) const
public: inline bool operator !=(class QMap::const_iterator const & o) const
private: inline operator bool () const
};
public: class const_iterator{
private: struct QMapData::Node* i;
public: typedef struct std::bidirectional_iterator_tag iterator_category;
public: typedef ptrdiff_t difference_type;
public: typedef T value_type;
public: typedef T const * pointer;
public: typedef T& reference;
public: inline operator struct QMapData::Node* () const
public: inline const_iterator();
public: inline const_iterator(struct QMapData::Node* node);
#ifdef QT_STRICT_ITERATORS
#else
public: inline const_iterator(class QMap::iterator const & o);
#endif
public: inline Key const & key() const
public: inline T& value() const
public: inline T& operator *() const
public: inline T const * operator ->() const
public: inline bool operator ==(class QMap::const_iterator const & o) const
public: inline bool operator !=(class QMap::const_iterator const & o) const
public: inline class QMap::const_iterator& operator ++();
public: inline class QMap::const_iterator operator ++(int);
public: inline class QMap::const_iterator& operator --();
public: inline class QMap::const_iterator operator --(int);
public: inline class QMap::const_iterator operator +(int j) const
public: inline class QMap::const_iterator operator -(int j) const
public: inline class QMap::const_iterator& operator +=(int j);
public: inline class QMap::const_iterator& operator -=(int j);
private: inline operator bool () const
};
public: inline class QMap::iterator begin();
public: inline class QMap::const_iterator begin() const
public: inline class QMap::const_iterator constBegin() const
public: inline class QMap::iterator end();
public: inline class QMap::const_iterator end() const
public: inline class QMap::const_iterator constEnd() const
public: typedef class QMap::iterator Iterator;
public: typedef class QMap::const_iterator ConstIterator;
public: inline int count() const
public: typedef Key key_type;
public: typedef T mapped_type;
public: typedef ptrdiff_t difference_type;
public: typedef int size_type;
public: inline bool empty() const
public: inline class QMap < aKey, aT >& operator =(class QMap const & other);
public: inline void clear();
private: inline struct QMapData::Node* node_create(struct QMapData* adt, struct QMapData::Node* * aupdate, Key const & akey, T const & avalue);
private: inline struct QMapData::Node* findNode(Key const & akey) const
public: inline T const value(Key const & akey) const
public: inline T const value(Key const & akey, T& adefaultValue) const
public: inline T const operator [](Key const & akey) const
public: inline T& operator [](Key const & akey);
public: inline int count(Key const & akey) const
public: inline bool contains(Key const & akey) const
public: inline typename QMap::iterator insert(Key const & akey, T const & avalue);
public: inline typename QMap::iterator insertMulti(Key const & akey, T const & avalue);
public: inline typename QMap::const_iterator find(Key const & akey) const
public: inline typename QMap::const_iterator constFind(Key const & akey) const
public: inline typename QMap::iterator find(Key const & akey);
public: inline class QMap < aKey, aT >& unite(class QMap const & other);
private: void freeData(struct QMapData* x);
public: int remove(Key const & akey);
public: T take(Key const & akey);
public: typename QMap::iterator erase(class QMap::iterator it);
private: void detach_helper();
private: struct QMapData::Node* mutableFindNode(struct QMapData::Node* * aupdate, Key const & akey) const
public: class QList < T > uniqueKeys() const
public: class QList < T > keys() const
public: class QList < T > keys(T const & avalue) const
public: Key const key(T const & avalue) const
public: class QList < T > values() const
public: class QList < T > values(Key const & akey) const
public: inline typename QMap::const_iterator lowerBound(Key const & akey) const
public: inline typename QMap::iterator lowerBound(Key const & akey);
public: inline typename QMap::const_iterator upperBound(Key const & akey) const
public: inline typename QMap::iterator upperBound(Key const & akey);
public: bool operator ==(class QMap const & other) const
#ifndef QT_NO_STL
public: explicit QMap(class std::map < Key, T, class std::less < _Key >, class std::allocator < class std::pair < _Key const , _Tp > > > const & other);
public: class std::map < Key, T, class std::less < _Key >, class std::allocator < class std::pair < _Key const , _Tp > > > toStdMap() const
#endif
#if !defined(QT_NO_DATASTREAM)
friend class iterator;
friend class const_iterator;
friend public: operator struct QDataStream& (struct QDataStream&, class QMap < aKey, aT >&);
#endif
};
#endif
#if !defined(QT_NO_DATASTREAM)
template < typename aKey, typename aT > struct QDataStream& operator >>(struct QDataStream& in, class QMap < aKey, aT >& map);
#if !defined(Q_CC_BOR)
#if defined Q_CC_MSVC && _MSC_VER < 1300
#else
template < typename aKey, typename aT > struct QDataStream& operator >>(struct QDataStream& in, class QMap < aKey, aT >& map);
#endif
#endif
#endif
template < typename Key, typename T > class QMultiMap: public QMap < aKey, aT >{
public: inline QMultiMap();
public: inline QMultiMap(class QMap < aKey, aT > const & other);
public: inline class QMultiMap& operator +=(class QMultiMap const & other);
public: inline class QMultiMap operator +(class QMultiMap const & other) const
private: T& operator [](Key const & key);
private: T const operator [](Key const & key) const
public: inline typename QMap::iterator replace(Key const & akey, T const & avalue);
public: inline typename QMap::iterator insert(Key const & akey, T const & avalue);
};
template < typename Key, typename T > class QMapIterator{
private: class QMap < aKey, aT > c;
private: inline bool item_exists() const
private: typename QMap < aKey, aT >::const_iterator i;
public: inline QMapIterator(class QMap < aKey, aT > const & container);
private: typename QMap < aKey, aT >::const_iterator n;
public: inline class QMapIterator& operator =(class QMap < aKey, aT > const & container);
public: inline void toFront();
private: typedef typename QMap < aKey, aT >::const_iterator const_iterator;
public: inline void toBack();
private: typedef typename QMap < aKey, aT >::const_iterator Item;
public: inline bool hasNext() const
public: inline typename QMap < aKey, aT >::const_iterator next();
public: inline typename QMap < aKey, aT >::const_iterator peekNext() const
public: inline bool hasPrevious() const
public: inline typename QMap < aKey, aT >::const_iterator previous();
public: inline typename QMap < aKey, aT >::const_iterator peekPrevious() const
public: inline T const & value() const
public: inline Key const & key() const
public: inline bool findNext(T const & t);
public: inline bool findPrevious(T const & t);
};
template < typename Key, typename T > class QMutableMapIterator{
private: QMap < aKey, aT >* c;
private: inline bool item_exists() const
private: typename QMap < aKey, aT >::iterator i;
public: inline QMutableMapIterator(class QMap < aKey, aT >& container);
private: typename QMap < aKey, aT >::iterator n;
public: inline ~QMutableMapIterator();
public: inline class QMutableMapIterator& operator =(class QMap < aKey, aT >& container);
private: typedef typename QMap < aKey, aT >::iterator iterator;
public: inline void toFront();
private: typedef typename QMap < aKey, aT >::const_iterator const_iterator;
public: inline void toBack();
private: typedef typename QMap < aKey, aT >::iterator Item;
public: inline bool hasNext() const
public: inline typename QMap < aKey, aT >::iterator next();
public: inline typename QMap < aKey, aT >::iterator peekNext() const
public: inline bool hasPrevious() const
public: inline typename QMap < aKey, aT >::iterator previous();
public: inline typename QMap < aKey, aT >::iterator peekPrevious() const
public: inline void remove();
public: inline void setValue(T const & t);
public: inline T& value();
public: inline T const & value() const
public: inline Key const & key() const
public: inline bool findNext(T const & t);
public: inline bool findPrevious(T const & t);
};
#endif // QMAP_H