struct osp_ring_page : os_virtual_behavior {
struct osp_ring_page *prev, *next;
osp_keypack1 keys;
OSPVptr *first;
I16 fill, old_fill;
osp_ring_page();
virtual ~osp_ring_page();
virtual int get_max()=0;
virtual int avail()=0;
virtual OSPVptr *array()=0;
virtual OSPVptr &at(int xx)=0;
void cache_keys(osp_pathexam &exam, OSSVPV *pv);
void uncache_keys();
void verify_keys(osp_pathexam &exam);
int qck_cmp(osp_pathexam &exam, int update_ok);
void reset_first();
void _move(OSPVptr *start, OSPVptr *end, OSPVptr *to);
void prepare_insert(int items);
void fwd_xfer(int at);
OSSVPV *shift();
OSSVPV *pop();
void extend(int to);
void push(OSSVPV *pv);
void push(SV **base, int items);
void unshift(OSSVPV *pv);
void unshift(SV **base, int items);
void insert_after(int at, OSSVPV *pv);
void splice(int offset, int length, SV **base, int count);
};
#define OSP_RING_PAGE1_MAX 64
struct osp_ring_page1 : osp_ring_page {
static os_typespec *get_os_typespec();
OSPVptr ar[OSP_RING_PAGE1_MAX];
virtual int get_max();
virtual int avail();
virtual OSPVptr *array();
virtual OSPVptr &at(int xx);
};
#define RGf_STALE 0x100
#define RG_STALE(pv) (OSPvFLAGS(pv) & RGf_STALE)
#define RG_STALE_on(pv) (OSPvFLAGS(pv) |= RGf_STALE)
#define RG_STALE_off(pv) (OSPvFLAGS(pv) &= ~RGf_STALE)
struct OSPV_ring_index1 : OSPV_Generic {
static os_typespec *get_os_typespec();
OSPVptr conf;
U32 version; // inc if new/delete
U32 max;
U32 fill; // can be stale -- use read_fill() or fix_stale() first
osp_ring_page *first, *last;
OSPV_ring_index1();
void fix_stats();
void stale_stats();
U32 read_fill(); // read-only!
osp_ring_page *new_page(osp_ring_page *ref, int after);
osp_ring_page *get_page(U32 loc, I16 *offset);
void split(osp_ring_page *pp, int at);
void free_page(osp_ring_page *pp);
virtual ~OSPV_ring_index1();
virtual int get_perl_type();
virtual char *os_class(STRLEN *len);
virtual char *rep_class(STRLEN *len);
virtual OSSVPV *new_cursor(os_segment *seg);
virtual double _percent_filled();
virtual void _debug1(void *);
virtual int add(OSSVPV *);
virtual int remove(OSSVPV *);
virtual int FETCHSIZE();
virtual void CLEAR();
virtual void Extend(U32 to);
virtual void FETCH(SV *key);
virtual void STORE(SV *key, SV *value);
virtual void POP();
virtual void SHIFT();
virtual void PUSH(SV **base, int items);
virtual void UNSHIFT(SV **base, int items);
virtual void SPLICE(int offset, int length, SV **top, int count);
};
#define RGf_POSITION 0x0100
#define RGf_ATEND 0x0200
#define RG_POSITION(pv) (OSPvFLAGS(pv) & RGf_POSITION)
#define RG_POSITION_on(pv) (OSPvFLAGS(pv) |= RGf_POSITION)
#define RG_POSITION_off(pv) (OSPvFLAGS(pv) &= ~RGf_POSITION)
#define RG_ATEND(pv) (OSPvFLAGS(pv) & RGf_ATEND)
#define RG_ATEND_on(pv) (OSPvFLAGS(pv) |= RGf_ATEND)
#define RG_ATEND_off(pv) (OSPvFLAGS(pv) &= ~RGf_ATEND)
struct OSPV_ring_index1_cs : OSPV_Cursor2 {
static os_typespec *get_os_typespec();
OSPVptr myfocus;
U32 version;
I32 abpos;
osp_ring_page *page;
I16 reloff;
OSPV_ring_index1_cs(OSPV_ring_index1 *_fo);
void CHK_VER();
virtual OSSVPV *focus();
virtual void moveto(I32);
virtual void step(I32 delta);
virtual I32 pos(); //probably not kept up-to-date
virtual void at();
virtual void keys();
virtual void store(SV *);
virtual int seek(osp_pathexam &);
};