source: trunk/src/emx/include/Attic/cpp/gen/FPlex.ccP@ 18

Last change on this file since 18 was 18, checked in by bird, 23 years ago

Initial revision

  • Property cvs2svn:cvs-rev set to 1.1
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 3.9 KB
Line 
1// This may look like C code, but it is really -*- C++ -*-
2/*
3Copyright (C) 1988 Free Software Foundation
4 written by Doug Lea ([email protected])
5 based on code by Marc Shapiro ([email protected])
6
7This file is part of the GNU C++ Library. This library is free
8software; you can redistribute it and/or modify it under the terms of
9the GNU Library General Public License as published by the Free
10Software Foundation; either version 2 of the License, or (at your
11option) any later version. This library is distributed in the hope
12that it will be useful, but WITHOUT ANY WARRANTY; without even the
13implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14PURPOSE. See the GNU Library General Public License for more details.
15You should have received a copy of the GNU Library General Public
16License along with this library; if not, write to the Free Software
17Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18*/
19
20#ifdef __GNUG__
21#pragma implementation
22#endif
23#include "<T>.FPlex.h"
24
25
26<T>FPlex:: <T>FPlex()
27{
28 lo = fnc = 0;
29 csize = DEFAULT_INITIAL_CAPACITY;
30 <T>* data = new <T>[csize];
31 hd = new <T>IChunk(data, lo, lo, fnc, csize);
32}
33
34<T>FPlex:: <T>FPlex(int maxsize)
35{
36 if (maxsize == 0) error("invalid constructor specification");
37 lo = fnc = 0;
38 if (maxsize > 0)
39 {
40 csize = maxsize;
41 <T>* data = new <T>[csize];
42 hd = new <T>IChunk(data, lo, lo, fnc, csize);
43 }
44 else
45 {
46 csize = -maxsize;
47 <T>* data = new <T>[csize];
48 hd = new <T>IChunk(data, maxsize, lo, fnc, fnc);
49 }
50}
51
52
53<T>FPlex:: <T>FPlex(int l, int maxsize)
54{
55 if (maxsize == 0) error("invalid constructor specification");
56 lo = fnc = l;
57 if (maxsize > 0)
58 {
59 csize = maxsize;
60 <T>* data = new <T>[csize];
61 hd = new <T>IChunk(data, lo, lo, fnc, csize+lo);
62 }
63 else
64 {
65 csize = -maxsize;
66 <T>* data = new <T>[csize];
67 hd = new <T>IChunk(data, maxsize+lo, lo, fnc, fnc);
68 }
69}
70
71<T>FPlex:: <T>FPlex(int l, int hi, const <T&> initval, int maxsize)
72{
73 lo = l;
74 fnc = hi + 1;
75 if (maxsize >= 0)
76 {
77 csize = maxsize;
78 if (csize < fnc - lo)
79 csize = fnc - lo;
80 <T>* data = new <T>[csize];
81 hd = new <T>IChunk(data, lo, lo, fnc, csize);
82 }
83 else
84 {
85 csize = -maxsize;
86 if (csize < fnc - lo)
87 csize = fnc - lo;
88 <T>* data = new <T>[csize];
89 hd = new <T>IChunk(data, -csize, lo, fnc, fnc);
90 }
91 fill(initval);
92}
93
94<T>FPlex::<T>FPlex(const <T>FPlex& a)
95{
96 lo = a.lo;
97 fnc = a.fnc;
98 csize = fnc - lo;
99 if (csize < a.csize) csize = a.csize;
100 <T>* data = new <T> [csize];
101 hd = new <T>IChunk(data, lo, lo, fnc, lo+csize);
102 for (int i = a.low(); i < a.fence(); a.next(i)) (*this)[i] = a[i];
103}
104
105void <T>FPlex::operator= (const <T>FPlex& a)
106{
107 if (&a != this)
108 {
109 del_chunk(hd);
110 lo = a.lo;
111 fnc = a.fnc;
112 csize = fnc - lo;
113 if (csize < a.csize) csize = a.csize;
114 <T>* data = new <T> [csize];
115 hd = new <T>IChunk(data, lo, lo, fnc, lo+csize);
116 for (int i = a.low(); i < a.fence(); a.next(i)) (*this)[i] = a[i];
117 }
118}
119
120
121void <T>FPlex::reverse()
122{
123 <T> tmp;
124 int l = lo;
125 int h = fnc - 1;
126 while (l < h)
127 {
128 tmp = (*this)[l];
129 (*this)[l] = (*this)[h];
130 (*this)[h] = tmp;
131 next(l);
132 prev(h);
133 }
134}
135
136void <T>FPlex::fill(const <T&> x)
137{
138 for (int i = lo; i < fnc; ++i) (*this)[i] = x;
139}
140
141void <T>FPlex::fill(const <T&> x, int lo, int hi)
142{
143 for (int i = lo; i <= hi; ++i) (*this)[i] = x;
144}
145
146void <T>FPlex::clear()
147{
148 if (fnc != lo)
149 {
150 hd->clear(lo);
151 fnc = lo;
152 }
153}
154
155int <T>FPlex::OK () const
156{
157 int v = hd != 0; // hd exists
158 v &= hd-><T>IChunk::OK(); // and is OK
159 v &= fnc - lo <= hd->size(); // and has enough space
160 v &= lo <= fnc; // plex indices consistent
161 v &= lo == hd->low_index(); // and match those
162 v &= fnc == hd->fence_index(); // of chunk
163 v &= one_chunk(); // and only one chunk
164 if (!v) error("invariant failure");
165 return v;
166}
167
Note: See TracBrowser for help on using the repository browser.