26     verbose(v), no_gc(false), gc_request(false),
 
   27     numEntry(0), numCacheHit(0), gcCount(0)
 
   40          signed short distance)
 
   46     if (numEntry >= 
capacity) gc_request = 
true;
 
   48       &(ntesuki_hash_map::operator[](key.getSignatureKey()));
 
   49     for (NtesukiRecord::RecordList::iterator p = record_list->begin();
 
   50          p != record_list->end(); ++p)
 
   52       if (p->key.getPieceStand() == key.getPieceStand())
 
   60     const NtesukiRecord r(distance, key, white_stand, record_list);
 
   61     record_list->push_front(r);
 
   67   if (result == 0 && full++ == 0 && 
capacity)
 
   69     if (default_gc_size > 0)
 
   94   std::vector<osl::ntesuki::NtesukiRecord*> 
records;
 
  101     : state(s), 
table(t),
 
  102       depth(-1), pass_count(0)
 
  108     read_keys.insert(r->
key);
 
  109     records.push_back(r);
 
  114     read_keys.erase(records.back()->key);
 
  116     if (pass_depth) pass_count--;
 
  124       if (pass_count) 
return false;
 
  129     if (read_keys.find(child->
key) != read_keys.end())
 
  135     for (; i <= 
depth; i++) std::cerr << 
"*";
 
  137     for (; i <= 11; i++) std::cerr << 
" ";
 
  139     if (child->
isVisited()) std::cerr << 
"(*)";
 
  166     if (!lchild) 
return false;
 
  168     if (!rchild) 
return true;
 
  192   std::vector<osl::ntesuki::NtesukiRecord*> 
records;
 
  199     : state(s), 
table(t),
 
  200       depth(-1), pass_count(0), pass_depth(0), depth_visited(0)
 
  207     read_keys.insert(r->
key);
 
  208     records.push_back(r);
 
  213     read_keys.erase(records.back()->key);
 
  215     if (pass_depth) pass_count--;
 
  223       if (pass_count) 
return false;
 
  230     if (
depth < depth_visited)
 
  236     for (; i <= 
depth; i++) std::cerr << 
"*";
 
  237     for (; i <= 10; i++) std::cerr << 
" ";
 
  239     if (child->
isVisited()) std::cerr << 
"(*)";
 
  240     if (read_keys.find(child->
key) != read_keys.end())
 
  255     if (
depth < depth_visited)
 
  260     for (; i <= 
depth; i++) std::cerr << 
"*";
 
  261     for (; i <= 10; i++) std::cerr << 
" ";
 
  275     if (!lchild) 
return false;
 
  277     if (!rchild) 
return true;
 
  311     typedef std::vector<HashKey> keys_t;
 
  313     for (osl::ntesuki::NtesukiTable::Table::iterator it = table.begin();
 
  314          it != table.end(); ++it)
 
  316       for (NtesukiRecord::RecordList::iterator p = it->second.begin();
 
  317            p != it->second.end(); ++p)
 
  320         if (reachable_keys.find(record->
key) == reachable_keys.end())
 
  322           garbage_list.push_back(record->
key);
 
  326           reachable_keys.erase(record->
key);
 
  330     for (keys_t::iterator it = garbage_list.begin();
 
  331          it != garbage_list.end(); ++it)
 
  338     reachable_keys.insert(r->
key);
 
  347     return reachable_keys.find(child->
key) == reachable_keys.end();
 
  372   if (largeGCCount >= 0 && 
 
  373       gcCount >= static_cast<unsigned int>(largeGCCount))
 
  377       std::cerr << 
"\ntoo many GCs, failing\n\n";
 
  384   const unsigned int garbage_size = numEntry - gc_size;
 
  388     for (
int i = 0; i < 2; i++)
 
  390       std::cerr << root->getValue<
BLACK>(i) << 
"\t" 
  391                 << root->getValue<
WHITE>(i) << 
"\t";
 
  393     std::cerr << 
" " << numEntry << 
" -> ";
 
  397     std::vector<NtesukiRecord *>,
 
  400   for (iterator it = 
begin(); it != 
end(); ++it)
 
  402     for (NtesukiRecord::RecordList::iterator p = it->second.begin();
 
  403          p != it->second.end(); ++p)
 
  405       NtesukiRecord *record = &(*p);
 
  414       garbage_list.push(record);
 
  415       if (garbage_list.size() > garbage_size)
 
  422   std::cerr << 
"\n*before GC\n";
 
  424   forEachRecordFromRoot<RecordPrinter2>();
 
  426   while (!garbage_list.empty())
 
  428     NtesukiRecord *garbage = garbage_list.top();
 
  435     std::cerr << numEntry << 
"\n";
 
  437   std::cerr << 
"*after GC\n";
 
  438   forEachRecordFromRoot<RecordPrinter2>();
 
  445     for (
int i = 0; i < 2; i++)
 
  447       std::cerr << root->getValue<
BLACK>(i) << 
"\t" 
  448                 << root->getValue<
WHITE>(i) << 
"\t";
 
  456   unsigned int orig_size = numEntry;
 
  457   unsigned int small_subtree_size = 1,
 
  459   while (numEntry > gc_size)
 
  461     for (iterator list_it = 
begin();
 
  462          list_it != 
end(); ++list_it)
 
  473       for (NtesukiRecord::RecordList::iterator r = list_it->second.begin();
 
  474            r != list_it->second.end(); ++r)
 
  476         NtesukiRecord *record = &(*r);
 
  487           for (NtesukiRecord::RecordPList::const_iterator pit = record->
parents.begin();
 
  488                pit != record->
parents.end(); ++pit)
 
  490             (*pit)->rev_refcount--;
 
  492           list_it->second.erase(r); 
 
  493           goto retry_collect_list;
 
  497 #ifdef MARK_AND_SWEEP_AFTER_SMALLTREEGC 
  498     unsigned int before_mark_and_sweep = numEntry;
 
  499     forEachRecordFromRoot<MarkAndSweep>();
 
  500     garbage_size += before_mark_and_sweep - numEntry;
 
  503     small_subtree_size += 4;
 
  505   small_subtree_size -= 4;
 
  507   for (iterator it = 
begin(); it != 
end(); ++it)
 
  509     for (NtesukiRecord::RecordList::iterator p = it->second.begin();
 
  510          p != it->second.end(); ++p)
 
  512       NtesukiRecord *record = &(*p);
 
  522     std::cerr << numEntry << 
"\tcollected up to " << small_subtree_size << 
"\n";
 
  523     std::cerr << 
" " << orig_size << 
" -> " << numEntry << 
"\n";
 
  537   ntesuki_hash_map::iterator hit =
 
  539   if (hit == ntesuki_hash_map::end())
 
  543   for (NtesukiRecord::RecordList::iterator p = hit->second.begin();
 
  544        p != hit->second.end(); ++p)
 
  546     if (p->key.getPieceStand() == key.getPieceStand())
 
  559   ntesuki_hash_map::iterator hit =
 
  561   if (hit == ntesuki_hash_map::end())
 
  565   for (NtesukiRecord::RecordList::iterator p = hit->second.begin();
 
  566        p != hit->second.end(); ++p)
 
  568     if (p->key.getPieceStand() == key.getPieceStand())
 
  570       hit->second.erase(p);
 
  579              unsigned int gc_size,
 
  581   : 
table(new 
Table(capacity, gc_size, verbose)),
 
  593     std::cerr << 
"~NtesukiTable size " << size()
 
  594               << 
", cache hit " << table->numCacheHit
 
  595               << 
", table full " << table->gcCount << 
"\n";
 
  597     ntesuki_hash_map::const_iterator hit = this->begin();
 
  598     while (hit != this->end())
 
  601       for (NtesukiRecord::RecordList::const_iterator p = record_list.begin();
 
  602            p != record_list.end(); ++p)
 
  605         const unsigned short d = r.
distance;
 
  608           std::cerr << d << r << 
"\n";
 
  617       if (depths[
depth] != 0)
 
  619         std::cerr << 
"depth: " << 
depth << 
" " << depths[
depth] << 
"\n";