//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // TreeCache::Add(): // Add a position to the cache if applicable.. // bool TreeCache::Add (Position * pos, treeT * pTree, Filter * filter) { // Is this tree in the cache already? int index = LookupIndex (pos); if (index >= 0) { // It is! Set the MostRecentIndex: MostRecentIndex = index; return true; } // Quick test for the common condition of the cache being full and // this tree having a count too low to be added: if (Policy == TREECACHE_Smallest && NumInUse == CacheSize && pTree->totalCount < LowestTotal) { return false; } // Now, we add this tree to the end of the cache it is not full, or // if it is full, check if its count is high enough to be added. if (NumInUse == CacheSize) { // Cache is full! // If replacing the smallest, we know its total is high enough // to be added, from the test above. if (Policy == TREECACHE_Oldest) { // Replace the oldest node: MostRecentIndex = (MostRecentIndex+1) % CacheSize; AddTree (MostRecentIndex, pos, pTree, filter); } else { // Replace the smallest node: AddTree (LowestTotalIndex, pos, pTree, filter); // Find the NEW lowest total, the next tree to be evicted: LowestTotal = pTree->totalCount; for (uint i=0; i < CacheSize; i++) { if (Cache[i].tree.totalCount < LowestTotal) { LowestTotal = Cache[i].tree.totalCount; LowestTotalIndex = i; } } } } else { // Cache is not yet full. Add the position to the cache: AddTree (NumInUse, pos, pTree, filter); // Update LowestTotal if necessary: if (NumInUse == 0 || pTree->totalCount < LowestTotal) { LowestTotal = pTree->totalCount; LowestTotalIndex = NumInUse; } NumInUse++; } return true; }
/* lookup a index using a string */ uint8 MarshalStringTable::LookupIndex( const std::string& str ) { return LookupIndex( str.c_str() ); }