- gen(to_generate.front());
- loaded.splice(loaded.end(), to_generate, to_generate.begin());
+ Chunk::Pos pos(to_generate.front());
+
+ for (auto iter(to_free.begin()), end(to_free.end()); iter != end; ++iter) {
+ if (iter->Position() == pos) {
+ loaded.splice(loaded.end(), to_free, iter);
+ reused = true;
+ break;
+ }
+ }
+
+ if (!reused) {
+ if (to_free.empty()) {
+ loaded.emplace_back(reg);
+ } else {
+ loaded.splice(loaded.end(), to_free, to_free.begin());
+ reused = true;
+ }
+ loaded.back().Position(pos);
+ gen(loaded.back());
+ }
+ to_generate.pop_front();