Files
cdev-1.7.2n/include/cdevBlockList.h
2022-12-13 12:44:04 +01:00

170 lines
5.5 KiB
C++

//-----------------------------------------------------------------------------
// Copyright (c) 1994,1995 Southeastern Universities Research Association,
// Continuous Electron Beam Accelerator Facility
//
// This software was developed under a United States Government license
// described in the NOTICE file included as part of this distribution.
//
//-----------------------------------------------------------------------------
//
// Description:
// Linked list of blocks of void pointer
//
// Not safe C++ practice because of void*.
// Reason: It is very difficult to do instantiation inside
// a shared library.
//
// Author: Jie Chen
//
// Revision History:
// cdevBlockList.h,v
// Revision 1.1 1995/12/08 15:33:31 chen
// linked block list
//
// Revision 1.1.1.1 1995/06/16 17:14:07 epics
// initial import of cdev
//
//
#ifndef _CDEV_XOBJ_LIST_H
#define _CDEV_XOBJ_LIST_H
#include <stdio.h>
#include <cdevSpec.h>
#include <assert.h>
typedef void* blockListItem;
//===========================================================================
// class tranObjBlockList
// List of blocks each with size
//===========================================================================
const int DEFAULT_BLOCK_SIZE = 64;
class cdevBlockListIterator;
//===========================================================================
// class cdevBlockLink
// Node for the cdevBlockList class (private)
//=============================================================================
class CDEV_CLASS_SPEC cdevBlockLink
{
private:
//constructors
// create a single block with all unset value in it
cdevBlockLink (cdevBlockLink * nextPtr, cdevBlockLink *prevPtr,
unsigned int size = DEFAULT_BLOCK_SIZE);
// create a single block with default value in it
cdevBlockLink (cdevBlockLink * nextPtr, cdevBlockLink *prevPtr,
const blockListItem& defVal,
unsigned int size = DEFAULT_BLOCK_SIZE);
// create a single block with some value in it
cdevBlockLink (cdevBlockLink * nextPtr, cdevBlockLink *prevPtr,
blockListItem *date,
unsigned int size = DEFAULT_BLOCK_SIZE);
// copy constructor, copy all lists
cdevBlockLink (const cdevBlockLink& link);
// assignment operator
cdevBlockLink& operator = (const cdevBlockLink &link);
// destructor
virtual ~cdevBlockLink (void);
// operations
// duplicate whole list
cdevBlockLink* duplicate (void);
// duplicate list starting here to the right
cdevBlockLink* duplicate (int type); // type 0. goes to right, 1 left
// insert a new block after
cdevBlockLink* addNewBlock (void);
cdevBlockLink* addNewBlock (const blockListItem & defValue);
// free all memory associated with the list
void freeAllMemory (void);
// data area
blockListItem *value_;
unsigned int blockSize_;
// default value stored in the block
// keep track how many slots are occupied
cdevBlockLink *ptrToNextLink_;
cdevBlockLink *ptrToPrevLink_;
// friends
friend class cdevBlockList;
friend class cdevBlockListIterator;
};
class CDEV_CLASS_SPEC cdevBlockList
{
public:
// constructors and destructor
cdevBlockList (unsigned int blockSize = DEFAULT_BLOCK_SIZE);
cdevBlockList (const blockListItem& defVal,
unsigned int blockSize = DEFAULT_BLOCK_SIZE);
cdevBlockList (const cdevBlockList &rsc);
cdevBlockList& operator = (const cdevBlockList &rsc);
virtual ~cdevBlockList (void);
// operations
// access elements via subscript
virtual blockListItem & operator [] (unsigned int ) const;
// free all memory
virtual void deleteAll (void);
// just clean out value
virtual void clearAll (void);
virtual cdevBlockList * duplicate (void) const;
virtual int includes (blockListItem value) const;
virtual int length (void) const;
protected:
// data filed
cdevBlockLink firstBlock_;
unsigned int blockSize_;
unsigned int size_;
blockListItem* defValue_;
private:
// return how many steps a particular pointer away from
// the beginning of the first block
unsigned int entryNumber (blockListItem *ptr);
cdevBlockLink* blockPointer (blockListItem *ptr);
blockListItem* entryPointer (unsigned int steps);
friend class cdevBlockListIterator;
};
//=========================================================================
// class cdevBlockListIterator
// Iterator class used to loop over all list elements
//=========================================================================
class CDEV_CLASS_SPEC cdevBlockListIterator
{
public:
// constructor
cdevBlockListIterator (cdevBlockList &l);
// iterator protocol
virtual int init (void);
virtual blockListItem operator () ();
virtual int operator !();
// prefix
virtual int operator ++();
virtual void operator = (blockListItem newValue);
// new method for blockList
int forcePut (blockListItem value);
blockListItem * currentPosition();
// prefix
int operator --();
// move cursor to the end of the list
virtual int end (void);
protected:
// data fields
cdevBlockList &data;
blockListItem* currEntry_;
blockListItem* blockEnd_;
blockListItem* blockStart_;
blockListItem* listEnd_;
unsigned int curPos_;
};
#endif