summaryrefslogtreecommitdiff
path: root/gnu/lib/libg++/g++-include/Plex.ccP
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/lib/libg++/g++-include/Plex.ccP')
-rw-r--r--gnu/lib/libg++/g++-include/Plex.ccP222
1 files changed, 222 insertions, 0 deletions
diff --git a/gnu/lib/libg++/g++-include/Plex.ccP b/gnu/lib/libg++/g++-include/Plex.ccP
new file mode 100644
index 000000000000..5eb13c85f488
--- /dev/null
+++ b/gnu/lib/libg++/g++-include/Plex.ccP
@@ -0,0 +1,222 @@
+// This may look like C code, but it is really -*- C++ -*-
+/*
+Copyright (C) 1988 Free Software Foundation
+ written by Doug Lea (dl@rocky.oswego.edu)
+ based on code by Marc Shapiro (shapiro@sor.inria.fr)
+
+This file is part of the GNU C++ Library. This library is free
+software; you can redistribute it and/or modify it under the terms of
+the GNU Library General Public License as published by the Free
+Software Foundation; either version 2 of the License, or (at your
+option) any later version. This library is distributed in the hope
+that it will be useful, but WITHOUT ANY WARRANTY; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. See the GNU Library General Public License for more details.
+You should have received a copy of the GNU Library General Public
+License along with this library; if not, write to the Free Software
+Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+#include <stream.h>
+#include <builtin.h>
+#include "<T>.Plex.h"
+
+// IChunk support
+
+void <T>IChunk::error(const char* msg) const
+{
+ (*lib_error_handler)("<T>IChunk", msg);
+}
+
+void <T>IChunk::index_error() const
+{
+ error("attempt to use invalid index");
+}
+
+void <T>IChunk::empty_error() const
+{
+ error("invalid use of empty chunk");
+}
+
+void <T>IChunk::full_error() const
+{
+ error("attempt to extend chunk beyond bounds");
+}
+
+<T>IChunk:: ~<T>IChunk() {}
+
+<T>IChunk::<T>IChunk(<T>* d,
+ int baseidx,
+ int lowidx,
+ int fenceidx,
+ int topidx)
+{
+ if (d == 0 || baseidx > lowidx || lowidx > fenceidx || fenceidx > topidx)
+ error("inconsistent specification");
+ data = d;
+ base = baseidx;
+ low = lowidx;
+ fence = fenceidx;
+ top = topidx;
+ nxt = prv = this;
+}
+
+void <T>IChunk:: re_index(int lo)
+{
+ int delta = lo - low;
+ base += delta;
+ low += delta;
+ fence += delta;
+ top += delta;
+}
+
+
+void <T>IChunk::clear(int lo)
+{
+ int s = top - base;
+ low = base = fence = lo;
+ top = base + s;
+}
+
+void <T>IChunk::cleardown(int hi)
+{
+ int s = top - base;
+ low = top = fence = hi;
+ base = top - s;
+}
+
+int <T>IChunk:: OK() const
+{
+ int v = data != 0; // have some data
+ v &= base <= low; // ok, index-wise
+ v &= low <= fence;
+ v &= fence <= top;
+
+ v &= nxt->prv == this; // and links are OK
+ v &= prv->nxt == this;
+ if (!v) error("invariant failure");
+ return(v);
+}
+
+
+// error handling
+
+
+void <T>Plex::error(const char* msg) const
+{
+ (*lib_error_handler)("Plex", msg);
+}
+
+void <T>Plex::index_error() const
+{
+ error("attempt to access invalid index");
+}
+
+void <T>Plex::empty_error() const
+{
+ error("attempted operation on empty plex");
+}
+
+void <T>Plex::full_error() const
+{
+ error("attempt to increase size of plex past limit");
+}
+
+// generic plex ops
+
+<T>Plex:: ~<T>Plex()
+{
+ invalidate();
+}
+
+
+void <T>Plex::append (const <T>Plex& a)
+{
+ for (int i = a.low(); i < a.fence(); a.next(i)) add_high(a[i]);
+}
+
+void <T>Plex::prepend (const <T>Plex& a)
+{
+ for (int i = a.high(); i > a.ecnef(); a.prev(i)) add_low(a[i]);
+}
+
+void <T>Plex::reverse()
+{
+ <T> tmp;
+ int l = low();
+ int h = high();
+ while (l < h)
+ {
+ tmp = (*this)[l];
+ (*this)[l] = (*this)[h];
+ (*this)[h] = tmp;
+ next(l);
+ prev(h);
+ }
+}
+
+
+void <T>Plex::fill(const <T&> x)
+{
+ for (int i = lo; i < fnc; ++i) (*this)[i] = x;
+}
+
+void <T>Plex::fill(const <T&> x, int lo, int hi)
+{
+ for (int i = lo; i <= hi; ++i) (*this)[i] = x;
+}
+
+
+void <T>Plex::del_chunk(<T>IChunk* x)
+{
+ if (x != 0)
+ {
+ x->unlink();
+ <T>* data = (<T>*)(x->invalidate());
+ delete [] data;
+ delete x;
+ }
+}
+
+
+void <T>Plex::invalidate()
+{
+ <T>IChunk* t = hd;
+ if (t != 0)
+ {
+ <T>IChunk* tail = tl();
+ while (t != tail)
+ {
+ <T>IChunk* nxt = t->next();
+ del_chunk(t);
+ t = nxt;
+ }
+ del_chunk(t);
+ hd = 0;
+ }
+}
+
+int <T>Plex::reset_low(int l)
+{
+ int old = lo;
+ int diff = l - lo;
+ if (diff != 0)
+ {
+ lo += diff;
+ fnc += diff;
+ <T>IChunk* t = hd;
+ do
+ {
+ t->re_index(t->low_index() + diff);
+ t = t->next();
+ } while (t != hd);
+ }
+ return old;
+}
+
+
+
+