📄 fplex.ccp
字号:
// 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 freesoftware; you can redistribute it and/or modify it under the terms ofthe GNU Library General Public License as published by the FreeSoftware Foundation; either version 2 of the License, or (at youroption) any later version. This library is distributed in the hopethat it will be useful, but WITHOUT ANY WARRANTY; without even theimplied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULARPURPOSE. See the GNU Library General Public License for more details.You should have received a copy of the GNU Library General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, 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;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -