| 319 | } |
| 320 | |
| 321 | auto DescriptionConverter::scanAndCreateClusterDescription( |
| 322 | DataTO const& dataTO, |
| 323 | int startCellIndex, |
| 324 | std::unordered_set<int>& freeCellIndices) const |
| 325 | -> CreateClusterReturnData |
| 326 | { |
| 327 | CreateClusterReturnData result; |
| 328 | |
| 329 | std::unordered_set<int> currentCellIndices; |
| 330 | currentCellIndices.insert(startCellIndex); |
| 331 | std::unordered_set<int> scannedCellIndices = currentCellIndices; |
| 332 | |
| 333 | std::vector<CellDescription> cells; |
| 334 | std::unordered_set<int> nextCellIndices; |
| 335 | int cellDescIndex = 0; |
| 336 | do { |
| 337 | for (auto const& currentCellIndex : currentCellIndices) { |
| 338 | cells.emplace_back(createCellDescription(dataTO, currentCellIndex)); |
| 339 | result.cellTOIndexToCellDescIndex.emplace(currentCellIndex, cellDescIndex); |
| 340 | auto const& cellTO = dataTO.cells[currentCellIndex]; |
| 341 | for (int i = 0; i < cellTO.numConnections; ++i) { |
| 342 | auto connectionTO = cellTO.connections[i]; |
| 343 | if (connectionTO.cellIndex != -1) { |
| 344 | if (scannedCellIndices.find(connectionTO.cellIndex) == scannedCellIndices.end()) { |
| 345 | nextCellIndices.insert(connectionTO.cellIndex); |
| 346 | scannedCellIndices.insert(connectionTO.cellIndex); |
| 347 | } |
| 348 | } |
| 349 | } |
| 350 | ++cellDescIndex; |
| 351 | } |
| 352 | currentCellIndices = nextCellIndices; |
| 353 | nextCellIndices.clear(); |
| 354 | } while (!currentCellIndices.empty()); |
| 355 | |
| 356 | setInplaceDifference(freeCellIndices, scannedCellIndices); |
| 357 | |
| 358 | result.cluster.addCells(cells); |
| 359 | |
| 360 | return result; |
| 361 | } |
| 362 | |
| 363 | CellDescription DescriptionConverter::createCellDescription(DataTO const& dataTO, int cellIndex) const |
| 364 | { |
nothing calls this directly
no test coverage detected