## modules/up/src/rpsl/gnu/PrefixRange.Plex.cc

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

## FUNCTIONS

This source file includes following functions.

1. error
2. index_error
3. empty_error
4. full_error
5. PrefixRangeIChunk
6. PrefixRangeIChunk
7. re_index
8. clear
9. cleardown
10. OK
11. error
12. index_error
13. empty_error
14. full_error
15. PrefixRangePlex
16. append
17. prepend
18. reverse
19. fill
20. fill
21. del_chunk
22. invalidate
23. reset_low

       1 // This may look like C code, but it is really -*- C++ -*-
       2 /*
       3 Copyright (C) 1988 Free Software Foundation
       4     written by Doug Lea (dl@rocky.oswego.edu)
       5     based on code by Marc Shapiro (shapiro@sor.inria.fr)
       6
       7 This file is part of the GNU C++ Library.  This library is free
       8 software; you can redistribute it and/or modify it under the terms of
       9 the GNU Library General Public License as published by the Free
      10 Software Foundation; either version 2 of the License, or (at your
      11 option) any later version.  This library is distributed in the hope
      12 that it will be useful, but WITHOUT ANY WARRANTY; without even the
      13 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
      14 PURPOSE.  See the GNU Library General Public License for more details.
      15 You should have received a copy of the GNU Library General Public
      16 License along with this library; if not, write to the Free Software
      17 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
      18 */
      19
      20 #ifdef __GNUG__
      21 #pragma implementation
      22 #endif
      23 #include "PrefixRange.Plex.h"
      24 #include <builtin.h>
      25
      26 // IChunk support
      27
      28 void PrefixRangeIChunk::error(const char* msg) const
         /* [<][>][^][v][top][bottom][index][help] */
      29 {
      30   (*lib_error_handler)("PrefixRangeIChunk", msg);
      31 }
      32
      33 void PrefixRangeIChunk::index_error() const
         /* [<][>][^][v][top][bottom][index][help] */
      34 {
      35   error("attempt to use invalid index");
      36 }
      37
      38 void PrefixRangeIChunk::empty_error() const
         /* [<][>][^][v][top][bottom][index][help] */
      39 {
      40   error("invalid use of empty chunk");
      41 }
      42
      43 void PrefixRangeIChunk::full_error() const
         /* [<][>][^][v][top][bottom][index][help] */
      44 {
      45   error("attempt to extend chunk beyond bounds");
      46 }
      47
      48 PrefixRangeIChunk:: ~PrefixRangeIChunk() {}
         /* [<][>][^][v][top][bottom][index][help] */
      49
      50 PrefixRangeIChunk::PrefixRangeIChunk(PrefixRange*     d,
         /* [<][>][^][v][top][bottom][index][help] */
      51                      int      baseidx,
      52                      int      lowidx,
      53                      int      fenceidx,
      54                      int      topidx)
      55 {
      56   if (d == 0 || baseidx > lowidx || lowidx > fenceidx || fenceidx > topidx)
      57     error("inconsistent specification");
      58   data = d;
      59   base = baseidx;
      60   low = lowidx;
      61   fence = fenceidx;
      62   top = topidx;
      63   nxt = prv = this;
      64 }
      65
      66 void PrefixRangeIChunk:: re_index(int lo)
         /* [<][>][^][v][top][bottom][index][help] */
      67 {
      68   int delta = lo - low;
      69   base += delta;
      70   low += delta;
      71   fence += delta;
      72   top += delta;
      73 }
      74
      75
      76 void PrefixRangeIChunk::clear(int lo)
         /* [<][>][^][v][top][bottom][index][help] */
      77 {
      78   int s = top - base;
      79   low = base = fence = lo;
      80   top = base + s;
      81 }
      82
      83 void PrefixRangeIChunk::cleardown(int hi)
         /* [<][>][^][v][top][bottom][index][help] */
      84 {
      85   int s = top - base;
      86   low = top = fence = hi;
      87   base = top - s;
      88 }
      89
      90 int PrefixRangeIChunk:: OK() const
         /* [<][>][^][v][top][bottom][index][help] */
      91 {
      92   int v = data != 0;             // have some data
      93   v &= base <= low;              // ok, index-wise
      94   v &= low <= fence;
      95   v &= fence <= top;
      96
      97   v &=  nxt->prv == this;      // and links are OK
      98   v &=  prv->nxt == this;
      99   if (!v) error("invariant failure");
     100   return(v);
     101 }
     102
     103
     104 // error handling
     105
     106
     107 void PrefixRangePlex::error(const char* msg) const
         /* [<][>][^][v][top][bottom][index][help] */
     108 {
     109   (*lib_error_handler)("Plex", msg);
     110 }
     111
     112 void PrefixRangePlex::index_error() const
         /* [<][>][^][v][top][bottom][index][help] */
     113 {
     114   error("attempt to access invalid index");
     115 }
     116
     117 void PrefixRangePlex::empty_error() const
         /* [<][>][^][v][top][bottom][index][help] */
     118 {
     119   error("attempted operation on empty plex");
     120 }
     121
     122 void PrefixRangePlex::full_error() const
         /* [<][>][^][v][top][bottom][index][help] */
     123 {
     124   error("attempt to increase size of plex past limit");
     125 }
     126
     127 // generic plex ops
     128
     129 PrefixRangePlex:: ~PrefixRangePlex()
         /* [<][>][^][v][top][bottom][index][help] */
     130 {
     131   invalidate();
     132 }
     133
     134
     135 void PrefixRangePlex::append (const PrefixRangePlex& a)
         /* [<][>][^][v][top][bottom][index][help] */
     136 {
     137   for (int i = a.low(); i < a.fence(); a.next(i)) add_high(a[i]);
     138 }
     139
     140 void PrefixRangePlex::prepend (const PrefixRangePlex& a)
         /* [<][>][^][v][top][bottom][index][help] */
     141 {
     142   for (int i = a.high(); i > a.ecnef(); a.prev(i)) add_low(a[i]);
     143 }
     144
     145 void PrefixRangePlex::reverse()
         /* [<][>][^][v][top][bottom][index][help] */
     146 {
     147   PrefixRange tmp;
     148   int l = low();
     149   int h = high();
     150   while (l < h)
     151   {
     152     tmp = (*this)[l];
     153     (*this)[l] = (*this)[h];
     154     (*this)[h] = tmp;
     155     next(l);
     156     prev(h);
     157   }
     158 }
     159
     160
     161 void PrefixRangePlex::fill(const PrefixRange& x)
         /* [<][>][^][v][top][bottom][index][help] */
     162 {
     163   for (int i = lo; i < fnc; ++i) (*this)[i] = x;
     164 }
     165
     166 void PrefixRangePlex::fill(const PrefixRange& x, int lo, int hi)
         /* [<][>][^][v][top][bottom][index][help] */
     167 {
     168   for (int i = lo; i <= hi; ++i) (*this)[i] = x;
     169 }
     170
     171
     172 void PrefixRangePlex::del_chunk(PrefixRangeIChunk* x)
         /* [<][>][^][v][top][bottom][index][help] */
     173 {
     174   if (x != 0)
     175   {
     176     x->unlink();
     177     PrefixRange* data = (PrefixRange*)(x->invalidate());
     178     delete [] data;
     179     delete x;
     180   }
     181 }
     182
     183
     184 void PrefixRangePlex::invalidate()
         /* [<][>][^][v][top][bottom][index][help] */
     185 {
     186   PrefixRangeIChunk* t = hd;
     187   if (t != 0)
     188   {
     189     PrefixRangeIChunk* tail = tl();
     190     while (t != tail)
     191     {
     192       PrefixRangeIChunk* nxt = t->next();
     193       del_chunk(t);
     194       t = nxt;
     195     }
     196     del_chunk(t);
     197     hd = 0;
     198   }
     199 }
     200
     201 int PrefixRangePlex::reset_low(int l)
         /* [<][>][^][v][top][bottom][index][help] */
     202 {
     203   int old = lo;
     204   int diff = l - lo;
     205   if (diff != 0)
     206   {
     207     lo += diff;
     208     fnc += diff;
     209     PrefixRangeIChunk* t = hd;
     210     do
     211     {
     212       t->re_index(t->low_index() + diff);
     213       t = t->next();
     214     } while (t != hd);
     215   }
     216   return old;
     217 }
     218
     219
     220
     221

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