modules/up/src/rpsl/rpsl/rangelist.cc

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. MAX
  2. complement
  3. contains

   1 //  $Id: rangelist.cc,v 1.1.1.1 2000/03/10 16:32:24 engin Exp $
   2 //
   3 //  Copyright (c) 1994 by the University of Southern California
   4 //  All rights reserved.
   5 //
   6 //  Permission to use, copy, modify, and distribute this software and its
   7 //  documentation in source and binary forms for lawful non-commercial
   8 //  purposes and without fee is hereby granted, provided that the above
   9 //  copyright notice appear in all copies and that both the copyright
  10 //  notice and this permission notice appear in supporting documentation,
  11 //  and that any documentation, advertising materials, and other materials
  12 //  related to such distribution and use acknowledge that the software was
  13 //  developed by the University of Southern California, Information
  14 //  Sciences Institute. The name of the USC may not be used to endorse or
  15 //  promote products derived from this software without specific prior
  16 //  written permission.
  17 //
  18 //  THE UNIVERSITY OF SOUTHERN CALIFORNIA DOES NOT MAKE ANY
  19 //  REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR ANY
  20 //  PURPOSE.  THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
  21 //  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  22 //  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
  23 //  TITLE, AND NON-INFRINGEMENT.
  24 //
  25 //  IN NO EVENT SHALL USC, OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY
  26 //  SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES, WHETHER IN CONTRACT, TORT,
  27 //  OR OTHER FORM OF ACTION, ARISING OUT OF OR IN CONNECTION WITH, THE USE
  28 //  OR PERFORMANCE OF THIS SOFTWARE.
  29 //
  30 //  Questions concerning this software should be directed to 
  31 //  ratoolset@isi.edu.
  32 //
  33 //  Author(s): Cengiz Alaettinoglu <cengiz@ISI.EDU>
  34 
  35 #include "config.h"
  36 #include "rangelist.hh"
  37 
  38 #ifndef MAX
  39 #define MAX(x,y) ((x) > (y) ? (x) : (y))
     /* [<][>][^][v][top][bottom][index][help] */
  40 #endif
  41 
  42 // static member initialization
  43 char *RangeList::prefix_str = "AS";
  44 
  45 ostream& operator<<(ostream& out, const RangeList &no) {
  46    RangeList::Range *pi, *qi;
  47 
  48    if (no.universal())
  49       out << ".";
  50    else if (no.empty())
  51       out << "E";
  52    else
  53       for (pi = no.ranges.head(); pi; pi = no.ranges.next(pi)) {
  54          out << " " << no.prefix_str << pi->low;
  55          if (pi->low != pi->high)
  56             out << "-" << no.prefix_str << pi->high;
  57       }
  58 
  59    return out;
  60 }
  61 
  62 RangeList& RangeList::operator+=(RangeList& no) { // destroys no
  63    Range *pi, *qi, *r;
  64 
  65    pi = ranges.head();
  66    qi = no.ranges.head();
  67    while (pi && qi) {
  68       while (pi && pi->low <= qi->low)
  69          pi = ranges.next(pi);
  70 
  71       if (pi)
  72          while (qi && qi->low < pi->low) {
  73             r = qi;
  74             qi = no.ranges.next(qi);
  75             no.ranges.remove(r);
  76             ranges.insertBefore(pi, r);
  77          }
  78    }
  79 
  80    // add remaining ranges of no
  81    ranges.splice(no.ranges);
  82 
  83    for (pi = ranges.head(); pi; ) {
  84       qi = ranges.next(pi);
  85       if (qi && pi->high >= qi->low - 1) {
  86          pi->high = MAX(qi->high, pi->high);
  87          ranges.remove(qi);
  88          delete qi;
  89       } else
  90          pi = qi;
  91    }
  92 
  93    return *this;
  94 }
  95 
  96 void RangeList::complement() {
     /* [<][>][^][v][top][bottom][index][help] */
  97    Range *pi = ranges.head();
  98    Range *qi;
  99 
 100    if (universal()) {
 101       clear();
 102       return;
 103    }
 104 
 105    if (empty()) {
 106       ranges.append(new Range(0, RANGE_TOP));
 107       return;
 108    }
 109 
 110    if (pi->low != 0)
 111       ranges.prepend(new Range(0, (*pi).low-1));
 112 
 113    for (qi = ranges.next(pi); 
 114         qi; 
 115         pi = qi, qi = ranges.next(qi)) {
 116       pi->low  = pi->high + 1;
 117       pi->high = qi->low  - 1;
 118    }
 119 
 120    if (pi->high != RANGE_TOP) {
 121       pi->low  = pi->high + 1;
 122       pi->high = RANGE_TOP;
 123    } else {
 124       ranges.remove(pi);
 125       delete pi;
 126    }
 127 }
 128 
 129 int RangeList::contains(const Range r) const {
     /* [<][>][^][v][top][bottom][index][help] */
 130    for (Range *i = ranges.head(); i; i = ranges.next(i))
 131       if (i->low <= r.low && i->high >= r.high)
 132          return 1;
 133 
 134    return 0;
 135 }

/* [<][>][^][v][top][bottom][index][help] */