@@ -31,14 +31,13 @@ namespace LIB {
3131namespace detail {
3232
3333// //////////////////////////////////////////////////////////////////////////////
34- // Auxiliary functions
34+ // Auxiliary functions ---------------------------------------------------------
3535// //////////////////////////////////////////////////////////////////////////////
3636
3737/* *
3838 * @brief Checks if the both set pieces overlap.
3939 */
40- bool overlap (const MultiDimInter& mdi1
41- , const MultiDimInter& mdi2)
40+ bool overlap (const MultiDimInter& mdi1, const MultiDimInter& mdi2)
4241{
4342 const auto max1 = mdi1.maxElem ();
4443 const auto min1 = mdi1.minElem ();
@@ -430,29 +429,32 @@ OrderedSet OrderedSet::complementAtom() const
430429 return OrderedSet{std::move (result)};
431430}
432431
433- std:: size_t OrderedSet::intersectionComplement (const OrderedSet& local_complement
434- , const MultiDimInter& mdi)
432+ void OrderedSet::intersectionComplement (const OrderedSet&
433+ local_complement , const MultiDimInter& mdi)
435434{
436435 // Special cases
437436 if (isEmpty ()) {
438- return 0 ;
437+ return ;
439438 }
440439
441440 // General case
442- std:: size_t i = 0 ;
441+
443442 // Values in the partial result "before" the current MDI all belong to the
444443 // complement of the processed MDIs, the current MDI and also to the remaining
445444 // MDIs, so there's no need to keep calculating with them.
445+ OrderedSet result;
446+ auto it = _pieces.begin ();
446447 for (const MultiDimInter& elem : _pieces) {
447448 if (!(elem.maxElem () < mdi.minElem ())) {
448449 break ;
449450 }
450- ++i ;
451+ ++it ;
451452 }
453+ result._pieces .insert (result.end (), std::make_move_iterator (_pieces.begin ())
454+ , std::make_move_iterator (it));
452455
453456 NAT global_position = 0 ;
454- OrderedSet result;
455- for (auto it = _pieces.begin () + i; it != _pieces.end (); ++it) {
457+ for (; it != _pieces.end (); ++it) {
456458 const MultiDimInter& elem = *it;
457459 global_position = result.advanceHint (global_position, elem);
458460 // Discard elements in the complement of processed MDIs that belong to the
@@ -472,8 +474,6 @@ std::size_t OrderedSet::intersectionComplement(const OrderedSet& local_complemen
472474 }
473475 }
474476 _pieces = std::move (result._pieces );
475-
476- return i;
477477}
478478
479479OrderedSet OrderedSet::complement () const
@@ -483,23 +483,16 @@ OrderedSet OrderedSet::complement() const
483483 }
484484
485485 OrderedSet result = OrderedSet{_pieces.front ()}.complementAtom ();
486- std::size_t i = 0 ;
487486 std::size_t j = 0 ;
488487 for (const MultiDimInter& mdi : _pieces) {
489488 if (j > 0 ) {
490489 OrderedSet c = OrderedSet{mdi}.complementAtom ();
491- i = result.intersectionComplement (c, mdi);
490+ result.intersectionComplement (c, mdi);
492491 }
493492 ++j;
494493 }
495494
496- // Calculate remnant
497- OrderedSet remnant;
498- for (j = 0 ; j < i; ++j) {
499- remnant.pushBack (result._pieces [j]);
500- }
501-
502- return std::move (remnant).disjointCup (std::move (result));
495+ return result;
503496}
504497
505498OrderedSet OrderedSet::difference (const OrderedSet& other) const
@@ -583,26 +576,26 @@ OrderedSet OrderedSet::disjointCup(OrderedSet&& other) &&
583576 , std::make_move_iterator (other._pieces .end ()));
584577 result.insert (result.end (), std::make_move_iterator (_pieces.begin ())
585578 , std::make_move_iterator (_pieces.end ()));
586- }
587-
588- // General case
589- auto it1 = _pieces.begin ();
590- auto end1 = _pieces.end ();
591- auto it2 = other._pieces .begin ();
592- auto end2 = other. _pieces . end ();
593- while (it1 != end1 && it2 != end2 ) {
594- if (*it1 < *it2) {
595- result. push_back (* it1) ;
596- ++it1;
597- } else {
598- result. push_back (* it2) ;
599- ++it2;
579+ } else {
580+ // General case
581+ auto it1 = _pieces. begin ();
582+ auto end1 = _pieces.end ();
583+ auto it2 = other. _pieces .begin ();
584+ auto end2 = other._pieces .end ();
585+ while (it1 != end1 && it2 != end2) {
586+ if (*it1 < *it2 ) {
587+ result. push_back (*it1);
588+ ++ it1;
589+ } else {
590+ result. push_back (*it2);
591+ ++ it2;
592+ }
600593 }
594+ result.insert (result.end (), std::make_move_iterator (it1)
595+ , std::make_move_iterator (end1));
596+ result.insert (result.end (), std::make_move_iterator (it2)
597+ , std::make_move_iterator (end2));
601598 }
602- result.insert (result.end (), std::make_move_iterator (it1)
603- , std::make_move_iterator (end1));
604- result.insert (result.end (), std::make_move_iterator (it2)
605- , std::make_move_iterator (end2));
606599
607600 return OrderedSet{std::move (result)};
608601}
0 commit comments