/*************************************************************************** kcoordrangelist.cpp - description ------------------- begin : Mon Jun 30 2003 copyright : (C) 2003 by Friedrich W. H. Kossebau email : Friedrich.W.H@Kossebau.de ***************************************************************************/ /*************************************************************************** * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * * License version 2 as published by the Free Software Foundation. * * * ***************************************************************************/ // lib specific #include "kcoordrangelist.h" using namespace KHE; KCoordRangeList::KCoordRangeList() { } KCoordRangeList::~KCoordRangeList() { } void KCoordRangeList::addCoordRange( KCoordRange NewCoordRange ) { if( !NewCoordRange.isValid() ) return; // we try to insert it by ascending indizes // if sections are overlapping we combine them iterator S = begin(); for( ; S!=end(); ++S ) { // is next CoordRange behind the new CoordRange? if( NewCoordRange.endsBefore(*S) ) { // put the new before it insert( S, NewCoordRange ); return; } // does the next CoordRange overlap? if( (*S).overlaps(NewCoordRange) ) { // Start of the combined sections is the smaller one NewCoordRange.extendStartTo( (*S).start() ); // next we search all the overlapping sections and keep the highest end index TDEBufferCoord End((*S).end()); iterator LS = S; for( ++LS; LS!=end(); ++LS ) { if( !(*LS).overlaps(NewCoordRange) ) break; End = (*LS).end(); } // the higher end is the end of the combined CoordRange NewCoordRange.extendEndTo( End ); // remove all overlapping sections S = erase( S, LS ); // and instead insert the combined one insert( S, NewCoordRange ); return; } } // all others are before the new? if( S == end() ) // add it at the end append( NewCoordRange ); }