File: ksectionlist.cpp

package info (click to toggle)
kdeutils 4%3A3.3.2-1
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 14,628 kB
  • ctags: 13,095
  • sloc: cpp: 95,511; sh: 9,030; perl: 2,786; ansic: 2,425; makefile: 931; lex: 302; xml: 287; yacc: 167
file content (79 lines) | stat: -rw-r--r-- 2,352 bytes parent folder | download | duplicates (4)
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
79
/***************************************************************************
                          ksectionlist.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 "ksectionlist.h"

using namespace KHE;

KSectionList::KSectionList()
{
}


KSectionList::~KSectionList()
{
}


void KSectionList::addSection( KSection NewSection )
{
  if( !NewSection.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 new section before the next section?
    if( NewSection.endsBefore(*S) )
    {
      // put the new before it
      insert( S, NewSection );
      return;
    }

    // does the next section overlap?
    if( (*S).overlaps(NewSection) )
    {
      // Start of the combined sections is the smaller one
      NewSection.extendStartTo( (*S).start() );
      // next we search all the overlapping sections and keep the highest end index
      int End = (*S).end();
      iterator LS = S;
      for( ++LS; LS!=end(); ++LS )
      {
        if( !(*LS).overlaps(NewSection) )
          break;
        End = (*LS).end();
      }
      // the higher end is the end of the combined section
      NewSection.extendEndTo( End );
      // remove all overlapping sections
      S = erase( S, LS );
      // and instead insert the combined one
      insert( S, NewSection );
      return;
    }
  }

  // all others are before the new?
  if( S == end() )
    // add it at the end
    append( NewSection );
}