📄 wzrange.hxx
字号:
#ifndef wzrange_hxx
#define wzrange_hxx
#include "wzarray.hxx"
// this file defines the following classes:
class wzSimpleRange;
class wzRange;
class wzSimpleRange: public wzMultipleArrayController{
public:
wzIndex none() const {return 0;}
wzIndex first() const {return 1;}
wzIndex begin() const {return 1;}
wzIndex end() const {return Last+1;}
wzIndex last() const {return Last;}
wzIndex length() const {return Last;}
wzIndex create() {require(++Last); return Last; }
wzIndex append() {require(++Last); return Last; }
wzIndex create(wzIndex num) {wzIndex i=Last+1; require(Last+=num); return i; }
wzIndex append(wzIndex num) {wzIndex i=Last+1; require(Last+=num); return i; }
void destroy() {Last=0; free();}
void reset() {Last=0;}
wzBoolean used( wzIndex i) const {return 1;}
// wzBoolean operator()(wzIndex i) {return create(i);}
// wzIndex operator()(void) {return create();}
operator wzIndex() const {return Last;}
wzIndex operator++() {return append();}
void operator++(int) {append();}
wzIndex operator=(wzIndex l) {if(available(l)) Last=l; return Last;}
wzSimpleRange(wzIndex size=sizeof(wzIndex));
wzArray<wzByte> base;
protected:
wzIndex Last;
};
class wzRange: public wzMultipleArrayController{
const wzIndex Mark;
wzIndex Unmark;
public:
wzIndex none() const {return 0;}
wzIndex first() const {return 1;}
wzIndex begin() const {return 1;}
wzIndex end() const {return Last+1;}
wzIndex last() const {return Last;}
wzIndex length() const {return Last;}
wzBoolean valid(wzIndex i) const;
wzBoolean invalid(wzIndex i) const;
wzBoolean free( wzIndex i) const {return (Mark==M[i]);}
wzBoolean used( wzIndex i) const {return (Mark!=M[i]);}
wzIndex create()
{
if(Free){wzIndex f=Free; Free=F[f]; unmark(f); return f;}
require(++Last); return Last;
}
wzIndex append() { require(++Last); return Last; }
wzIndex create(wzIndex num) {wzIndex i=Last+1; require(Last+=num); return i; }
wzIndex append(wzIndex num) {wzIndex i=Last+1; require(Last+=num); return i; }
operator wzIndex() const {return Last;}
wzIndex operator++() {return append();}
void operator++(int) {append();}
void reset() {Last=Free=0;}
void destroy() {Last=Free=0; require(Last);}
void destroy(wzIndex i);
// wzBoolean operator()(wzIndex i) {return create(i);}
// wzIndex operator()(void) {return create();}
wzRange(wzIndex size=2*sizeof(wzIndex),wzIndex mark=0xdeffffff);
wzArray<wzByte> base;
protected:
wzIndex Last;
wzIndex Free;
// wzIndex Moff;
// wzIndex Foff;
wzArray<wzIndex> M;
wzArray<wzIndex> F;
void mark (wzIndex i) {M[i]=Mark;}
void unmark(wzIndex i) {M[i]=Unmark;}
};
#define wzRangeLoop(r,i) for(i=1;i<=(r).last();i++)if((r).used(i))
class wzStack{
protected:
friend class wzStackDerived;
wzArray<wzIndex> stack;
wzIndex first;
wzIndex last;
wzIndex end;
public:
wzBoolean outside(wzIndex i) const {return (i<end)?stack[i]:1;}
void push(wzIndex i)
{
if(i>=end){for(int j=end;j<=i;j++)stack[j]=0;end=i+1;}
else if(stack[i]) return;
if(first) {stack[i]=last; last=i;}
else {first=last=i; stack[i]=last;}
}
void append(wzIndex i)
{
if(i>=end){for(int j=end;j<=i;j++)stack[j]=0;end=i+1;}
else if(stack[i]) return;
if(first) {stack[first]=i; first=i;}
else {first=last=i;}
stack[i] = last;
}
wzIndex pop()
{wzIndex i=last; if(i==first) first=last=0; else last = stack[i]; stack[i] = 0; return i;}
wzIndex top() const {return last;}
wzBoolean empty() const {return !last;}
wzBoolean nonempty() const {return last;}
wzStack(wzRange& r):stack(r),last(0),first(0),end(0){stack(0)=0;}
wzStack(wzSimpleRange& r):stack(r),last(0),first(0),end(0){stack(0)=0;}
wzStack(const wzRange& r):stack(r),last(0),first(0),end(0){stack(0)=0;}
wzStack(const wzSimpleRange& r):stack(r),last(0),first(0),end(0){stack(0)=0;}
wzStack(wzArray<wzIndex>& r, wzIndex off):stack(r,off),last(0),first(0),end(0){stack(0)=0;}
};
class wzStackDerived{
wzArray<wzIndex>& stack;
wzIndex first;
wzIndex last;
wzIndex& end;
public:
wzBoolean outside(wzIndex i) const {return (i<end)?stack[i]:1;}
void push(wzIndex i)
{
if(i>=end){for(int j=end;j<=i;j++)stack[j]=0;end=i+1;}
else if(stack[i]) return;
if(first) {stack[i]=last; last=i;}
else {first=last=i; stack[i]=last;}
}
void append(wzIndex i)
{
if(i>=end){for(int j=end;j<=i;j++)stack[j]=0;end=i+1;}
else if(stack[i]) return;
if(first) {stack[first]=i; first=i;}
else {first=last=i;}
stack[i] = last;
}
wzIndex pop()
{wzIndex i=last; if(i==first) first=last=0; else last = stack[i]; stack[i] = 0; return i;}
wzIndex top() const {return last;}
wzBoolean empty() const {return !last;}
wzBoolean nonempty() const {return last;}
wzStackDerived(wzStack& r):stack(r.stack),last(0),first(0),end(r.end){}
};
inline wzBoolean wzRange::valid(wzIndex i) const
{return (i<=last()) && (i>=first()) && (!Free || used(i));}
inline wzBoolean wzRange::invalid(wzIndex i) const
{return (i>last()) || (i<first()) || (Free && free(i));}
inline void wzRange::destroy(wzIndex i)
{if(i==Last){Last--;
while(Free==Last){if(Last)Last--;else return;Free=F[Free];} return;
}
// if(Moff) return;
mark(i);
// if(Foff) return;
F[i]=Free; Free=i;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -