17 : m_lock(QReadWriteLock::NonRecursive)
30 : m_lock(QReadWriteLock::NonRecursive)
34 m_mementoManager = mm;
35 m_defaultTileData = 0;
39 Q_CHECK_PTR(m_hashTable);
45 for (qint32 i = 0; i < TABLE_SIZE; i++) {
51 nativeTile->
setNext(nativeTileHead);
52 nativeTileHead = nativeTile;
54 foreignTile = foreignTile->
next();
57 m_hashTable[i] = nativeTileHead;
67 setDefaultTileDataImp(0);
73 return ((row << 5) + (col & 0x1F)) & 0x3FF;
96 for (; tile; tile = tile->
next()) {
97 if (tile->
col() == col &&
100 if (m_hashTable[idx] != headTile) {
117 for (; tile; tile = tile->next()) {
118 if (tile->col() == col &&
119 tile->row() == row) {
133#ifdef SHARED_TILES_SANITY_CHECK
134 Q_ASSERT_X(!tile->next(),
"KisTileHashTableTraits<T>::linkTile",
135 "A tile can't be shared by several hash tables, sorry.");
138 tile->setNext(firstTile);
139 m_hashTable[idx] = tile;
149 for (; tile; tile = tile->next()) {
150 if (tile->col() == col &&
151 tile->row() == row) {
154 prevTile->setNext(tile->next());
157 m_hashTable[idx] = tile->next();
165 tile->notifyDetachedFromDataManager();
180 if (m_defaultTileData) {
181 m_defaultTileData->release();
182 m_defaultTileData = 0;
185 if (defaultTileData) {
187 m_defaultTileData = defaultTileData;
194 return m_defaultTileData;
201 return this->getExistingTile(col, row);
208 const qint32 idx = calculateHash(col, row);
213 QReadLocker locker(&m_lock);
214 return getTile(col, row, idx);
222 const qint32 idx = calculateHash(col, row);
231 QReadLocker locker(&m_lock);
232 tile = getTile(col, row, idx);
236 QWriteLocker locker(&m_lock);
237 tile =
new TileType(col, row, m_defaultTileData, m_mementoManager);
249 const qint32 idx = calculateHash(col, row);
254 QReadLocker locker(&m_lock);
260 tile =
new TileType(col, row, m_defaultTileData, 0);
269 const qint32 idx = calculateHash(tile->col(), tile->row());
271 QWriteLocker locker(&m_lock);
278 const qint32 idx = calculateHash(col, row);
280 QWriteLocker locker(&m_lock);
281 return unlinkTile(col, row, idx);
287 return deleteTile(tile->col(), tile->row());
293 QWriteLocker locker(&m_lock);
297 for (i = 0; i < TABLE_SIZE; i++) {
298 tile = m_hashTable[i];
309 tmp->notifyDetachedFromDataManager();
318 Q_ASSERT(!m_numTiles);
324 QWriteLocker locker(&m_lock);
325 setDefaultTileDataImp(defaultTileData);
331 QWriteLocker locker(&m_lock);
332 return defaultTileDataImp();
338 QWriteLocker locker(&m_lock);
350 if (!m_numTiles)
return;
352 qInfo() <<
"==========================\n"
354 <<
"\n def. data:\t\t" << m_defaultTileData
355 <<
"\n numTiles:\t\t" << m_numTiles;
356 debugListLengthDistribution();
357 qInfo() <<
"==========================\n";
364 for (
TileTypeSP it = m_hashTable[idx]; it; it = it->next(), len++) ;
373 qint32 minLen = m_numTiles;
376 for (qint32 i = 0; i < TABLE_SIZE; i++) {
377 tmp = debugChainLen(i);
395 debugMaxListLength(min, max);
396 arraySize = max - min + 1;
398 qint32 *array =
new qint32[arraySize];
399 memset(array, 0,
sizeof(qint32)*arraySize);
401 for (qint32 i = 0; i < TABLE_SIZE; i++) {
402 tmp = debugChainLen(i);
406 qInfo() << QString(
" minChain: %1\n").arg(min);
407 qInfo() << QString(
" maxChain: %1\n").arg(max);
409 qInfo() <<
" Chain size distribution:";
410 for (qint32 i = 0; i < arraySize; i++)
411 qInfo() << QString(
" %1: %2").arg(i + min).arg(array[i]);
423 Q_ASSERT(!m_lock.tryLockForWrite());
426 qint32 exactNumTiles = 0;
428 for (qint32 i = 0; i < TABLE_SIZE; i++) {
429 tile = m_hashTable[i];
436 if (exactNumTiles != m_numTiles) {
440 dbgKrita <<
"Wrong tiles checksum!";
KisMementoItemSP next() const
void setNext(KisMementoItemSP next)
TileTypeSP getTileMinefieldWalk(qint32 col, qint32 row, qint32 idx)
KisTileData * refAndFetchDefaultTileData() const
static const qint32 TABLE_SIZE
TileTypeSP getReadOnlyTileLazy(qint32 col, qint32 row, bool &existingTile)
TileTypeSP getExistingTile(qint32 col, qint32 row)
void addTile(TileTypeSP tile)
KisTileData * defaultTileData() const
KisTileData * m_defaultTileData
bool deleteTile(TileTypeSP tile)
void debugMaxListLength(qint32 &min, qint32 &max)
void setDefaultTileData(KisTileData *defaultTileData)
static quint32 calculateHash(qint32 col, qint32 row)
void sanityChecksumCheck()
~KisTileHashTableTraits()
bool tileExists(qint32 col, qint32 row)
KisTileHashTableTraits(KisMementoManager *mm)
qint32 debugChainLen(qint32 idx)
void setDefaultTileDataImp(KisTileData *defaultTileData)
KisTileData * defaultTileDataImp() const
TileTypeSP getTile(qint32 col, qint32 row, qint32 idx)
TileTypeSP getTileLazy(qint32 col, qint32 row, bool &newTile)
void linkTile(TileTypeSP tile, qint32 idx)
void debugListLengthDistribution()
KisMementoManager * m_mementoManager
bool unlinkTile(qint32 col, qint32 row, qint32 idx)
struct Tile * newTile(struct rect r)