summaryrefslogtreecommitdiff
path: root/gnu/lib/libg++/g++-include/FPlex.ccP
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/lib/libg++/g++-include/FPlex.ccP')
-rw-r--r--gnu/lib/libg++/g++-include/FPlex.ccP167
1 files changed, 167 insertions, 0 deletions
diff --git a/gnu/lib/libg++/g++-include/FPlex.ccP b/gnu/lib/libg++/g++-include/FPlex.ccP
new file mode 100644
index 000000000000..70d6c475571e
--- /dev/null
+++ b/gnu/lib/libg++/g++-include/FPlex.ccP
@@ -0,0 +1,167 @@
+// 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 "<T>.FPlex.h"
+
+
+<T>FPlex:: <T>FPlex()
+{
+ lo = fnc = 0;
+ csize = DEFAULT_INITIAL_CAPACITY;
+ <T>* data = new <T>[csize];
+ hd = new <T>IChunk(data, lo, lo, fnc, csize);
+}
+
+<T>FPlex:: <T>FPlex(int maxsize)
+{
+ if (maxsize == 0) error("invalid constructor specification");
+ lo = fnc = 0;
+ if (maxsize > 0)
+ {
+ csize = maxsize;
+ <T>* data = new <T>[csize];
+ hd = new <T>IChunk(data, lo, lo, fnc, csize);
+ }
+ else
+ {
+ csize = -maxsize;
+ <T>* data = new <T>[csize];
+ hd = new <T>IChunk(data, maxsize, lo, fnc, fnc);
+ }
+}
+
+
+<T>FPlex:: <T>FPlex(int l, int maxsize)
+{
+ if (maxsize == 0) error("invalid constructor specification");
+ lo = fnc = l;
+ if (maxsize > 0)
+ {
+ csize = maxsize;
+ <T>* data = new <T>[csize];
+ hd = new <T>IChunk(data, lo, lo, fnc, csize+lo);
+ }
+ else
+ {
+ csize = -maxsize;
+ <T>* data = new <T>[csize];
+ hd = new <T>IChunk(data, maxsize+lo, lo, fnc, fnc);
+ }
+}
+
+<T>FPlex:: <T>FPlex(int l, int hi, const <T&> initval, int maxsize)
+{
+ lo = l;
+ fnc = hi + 1;
+ if (maxsize >= 0)
+ {
+ csize = maxsize;
+ if (csize < fnc - lo)
+ csize = fnc - lo;
+ <T>* data = new <T>[csize];
+ hd = new <T>IChunk(data, lo, lo, fnc, csize);
+ }
+ else
+ {
+ csize = -maxsize;
+ if (csize < fnc - lo)
+ csize = fnc - lo;
+ <T>* data = new <T>[csize];
+ hd = new <T>IChunk(data, -csize, lo, fnc, fnc);
+ }
+ fill(initval);
+}
+
+<T>FPlex::<T>FPlex(const <T>FPlex& a)
+{
+ lo = a.lo;
+ fnc = a.fnc;
+ csize = fnc - lo;
+ if (csize < a.csize) csize = a.csize;
+ <T>* data = new <T> [csize];
+ hd = new <T>IChunk(data, lo, lo, fnc, lo+csize);
+ for (int i = a.low(); i < a.fence(); a.next(i)) (*this)[i] = a[i];
+}
+
+void <T>FPlex::operator= (const <T>FPlex& a)
+{
+ if (&a != this)
+ {
+ del_chunk(hd);
+ lo = a.lo;
+ fnc = a.fnc;
+ csize = fnc - lo;
+ if (csize < a.csize) csize = a.csize;
+ <T>* data = new <T> [csize];
+ hd = new <T>IChunk(data, lo, lo, fnc, lo+csize);
+ for (int i = a.low(); i < a.fence(); a.next(i)) (*this)[i] = a[i];
+ }
+}
+
+
+void <T>FPlex::reverse()
+{
+ <T> tmp;
+ int l = lo;
+ int h = fnc - 1;
+ while (l < h)
+ {
+ tmp = (*this)[l];
+ (*this)[l] = (*this)[h];
+ (*this)[h] = tmp;
+ next(l);
+ prev(h);
+ }
+}
+
+void <T>FPlex::fill(const <T&> x)
+{
+ for (int i = lo; i < fnc; ++i) (*this)[i] = x;
+}
+
+void <T>FPlex::fill(const <T&> x, int lo, int hi)
+{
+ for (int i = lo; i <= hi; ++i) (*this)[i] = x;
+}
+
+void <T>FPlex::clear()
+{
+ if (fnc != lo)
+ {
+ hd->clear(lo);
+ fnc = lo;
+ }
+}
+
+int <T>FPlex::OK () const
+{
+ int v = hd != 0; // hd exists
+ v &= hd-><T>IChunk::OK(); // and is OK
+ v &= fnc - lo <= hd->size(); // and has enough space
+ v &= lo <= fnc; // plex indices consistent
+ v &= lo == hd->low_index(); // and match those
+ v &= fnc == hd->fence_index(); // of chunk
+ v &= one_chunk(); // and only one chunk
+ if (!v) error("invariant failure");
+ return v;
+}
+