blob: 3028c7d31d4a013dbc4b9e808781782db3995d80 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
/***************************************************************************
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
KBufferCoord 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 );
}
|