| 375 | } |
| 376 | |
| 377 | BOOL LASinterval::merge(const BOOL erase) |
| 378 | { |
| 379 | // maybe delete temporary merge cells from the previous merge |
| 380 | if (merged_cells) |
| 381 | { |
| 382 | if (merged_cells_temporary) |
| 383 | { |
| 384 | LASintervalCell* next_next; |
| 385 | LASintervalCell* next = merged_cells->next; |
| 386 | while (next) |
| 387 | { |
| 388 | next_next = next->next; |
| 389 | delete next; |
| 390 | next = next_next; |
| 391 | } |
| 392 | delete merged_cells; |
| 393 | } |
| 394 | merged_cells = 0; |
| 395 | } |
| 396 | // are there cells to merge |
| 397 | if (cells_to_merge == 0) return FALSE; |
| 398 | if (((my_cell_set*)cells_to_merge)->size() == 0) return FALSE; |
| 399 | // is there just one cell |
| 400 | if (((my_cell_set*)cells_to_merge)->size() == 1) |
| 401 | { |
| 402 | merged_cells_temporary = FALSE; |
| 403 | // simply use this cell as the merge cell |
| 404 | my_cell_set::iterator set_element = ((my_cell_set*)cells_to_merge)->begin(); |
| 405 | merged_cells = (*set_element); |
| 406 | } |
| 407 | else |
| 408 | { |
| 409 | merged_cells_temporary = TRUE; |
| 410 | merged_cells = new LASintervalStartCell(); |
| 411 | // iterate over all cells and add their intervals to map |
| 412 | LASintervalCell* cell; |
| 413 | my_cell_map map; |
| 414 | my_cell_set::iterator set_element = ((my_cell_set*)cells_to_merge)->begin(); |
| 415 | #pragma warning(push) |
| 416 | #pragma warning(disable : 6011) |
| 417 | while (true) |
| 418 | { |
| 419 | if (set_element == ((my_cell_set*)cells_to_merge)->end()) break; |
| 420 | cell = (*set_element); |
| 421 | merged_cells->full += ((LASintervalStartCell*)cell)->full; |
| 422 | while (cell) |
| 423 | { |
| 424 | map.insert(my_cell_map::value_type(cell->start, cell)); |
| 425 | cell = cell->next; |
| 426 | } |
| 427 | set_element++; |
| 428 | } |
| 429 | #pragma warning(pop) |
| 430 | // initialize merged_cells with first interval |
| 431 | my_cell_map::iterator map_element = map.begin(); |
| 432 | cell = (*map_element).second; |
| 433 | map.erase(map_element); |
| 434 | merged_cells->start = cell->start; |