MCPcopy Create free account
hub / github.com/DFHack/dfhack / doVector

Function doVector

plugins/buildingplan/buildingplan_cycle.cpp:269–385  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

267}
268
269static 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);

Callers 1

buildingplan_cycleFunction · 0.85

Calls 15

itemPassesScreenFunction · 0.85
popInvalidTasksFunction · 0.85
matchesFiltersFunction · 0.85
distanceFunction · 0.85
isJobReadyFunction · 0.85
finalizeBuildingFunction · 0.85
getTypeMethod · 0.80
printMethod · 0.45
sizeMethod · 0.45
beginMethod · 0.45
endMethod · 0.45
clearMethod · 0.45

Tested by

no test coverage detected