📄 plex.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 <stream.h>#include <builtin.h>#include "<T>.Plex.h"// IChunk supportvoid <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 handlingvoid <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(); int sz = x->size(); <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;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -