| 267 | } |
| 268 | |
| 269 | static void doVector(color_ostream &out, df::job_item_vector_id vector_id, |
| 270 | map<string, Bucket> &buckets, |
| 271 | unordered_map<int32_t, PlannedBuilding> &planned_buildings, |
| 272 | bool unsuspend_on_finalize) { |
| 273 | auto other_id = ENUM_ATTR(job_item_vector_id, other, vector_id); |
| 274 | const auto item_vector = df::global::world->items.other[other_id]; |
| 275 | |
| 276 | DEBUG(cycle,out).print("matching {} item(s) in vector {} against {} filter bucket(s)\n", |
| 277 | item_vector.size(), |
| 278 | ENUM_KEY_STR(job_item_vector_id, vector_id), |
| 279 | buckets.size()); |
| 280 | |
| 281 | // items we might want to attach (and their positions) |
| 282 | std::vector<df::item*> available; |
| 283 | for (auto item : item_vector) { |
| 284 | if (itemPassesScreen(out, item)) |
| 285 | available.emplace_back(item); |
| 286 | } |
| 287 | std::vector<std::pair<df::coord, df::item*>> matching; |
| 288 | size_t num_matching = 0; |
| 289 | |
| 290 | DEBUG(cycle,out).print("{} items available for assignment\n", available.size()); |
| 291 | |
| 292 | for (auto bucket_it = buckets.begin(); bucket_it != buckets.end(); ) { |
| 293 | |
| 294 | TRACE(cycle,out).print("scanning bucket: {}/{}\n", |
| 295 | ENUM_KEY_STR(job_item_vector_id, vector_id), bucket_it->first); |
| 296 | |
| 297 | auto & task_queue = bucket_it->second; |
| 298 | bool first_task = true; |
| 299 | |
| 300 | while (auto bld = popInvalidTasks(out, task_queue, planned_buildings)){ |
| 301 | auto & task = task_queue.front(); |
| 302 | |
| 303 | auto id = task.first; |
| 304 | auto job = bld->jobs[0]; |
| 305 | auto &jitems = job->job_items.elements; |
| 306 | const size_t num_filters = jitems.size(); |
| 307 | const int filter_idx = task.second; |
| 308 | const int rev_filter_idx = num_filters - (filter_idx+1); |
| 309 | auto &pb = planned_buildings.at(id); |
| 310 | |
| 311 | // first task of the bucket: filter/count available items |
| 312 | if (first_task) { |
| 313 | matching.clear(); |
| 314 | for(auto item : available) |
| 315 | if (!item->flags.bits.in_job && |
| 316 | matchesFilters(item, |
| 317 | jitems[filter_idx], |
| 318 | pb.heat_safety, |
| 319 | pb.item_filters[rev_filter_idx], |
| 320 | pb.specials)) |
| 321 | matching.emplace_back(Items::getPosition(item),item); |
| 322 | |
| 323 | num_matching = matching.size(); |
| 324 | first_task = false; |
| 325 | TRACE(cycle,out).print("first task in bucket: found {} matching items\n", |
| 326 | num_matching); |
no test coverage detected