//RankedSetDef.h #define membersPerHolder 16 #define aFewMembers 4 #define aLotOfMembers 12 #define memberType long #define RAType double #define largeRA HUGE_VAL #define smallRA -HUGE_VAL #define NULLmID -1L #define NULLCursor NULL class RAandMID { public: static int Ecount; RAType RM_rankingAtt; memberType RM_memberID; RAandMID(){Ecount++;}; ~RAandMID(){Ecount--;}; }; class RankedSet; class subsetHolder; class Cursor; class setMemberHolder { private: friend class RankedSet; friend class subsetHolder; friend class Cursor; RankedSet * partOf; RAType minRA; memberType mIDofMin; RAType maxRA; memberType mIDofMax; int nrAtThisLevel; int firstInUseNr; int lastInUseNr; int firstFreeNr; Cursor * firstBoundCursor; //Attributes of enrollment, implemented as arrays for efficiency of inner loop RAType * rankingAtt; memberType * memberID; int * nextEnrollmentNr; int * priorEnrollmentNr; setMemberHolder(RankedSet * rs=NULL); ~setMemberHolder(); fileReturnCode fileIntoMemberSubset(RAType RA,memberType mID); RAandMID removeFirstFromMemberSubset(); RAandMID removeLastFromMemberSubset(); RAandMID removeThisFromMemberSubset(int place); //First of two versions: removeReturnCode removeThisFromMemberSubset(RAType RA,memberType mID); void copyMemberToSmhSlot(int enrollNr, RAType RA, memberType mID); RAandMID dropMemberFromSmhSlot(int slotNr); inline void fileFreeSlotNr(int slotNr); inline int removeFreeSlotNr(); inline void fileSlotNrFirstIntoInUse(int i); inline void fileSlotNrLastIntoInUse(int i); inline void fileSlotNr1AfterSlotNr2InUse(int newNr, int oldNr); inline int removeFirstSlotNrFromInUse(); inline int removeLastSlotNrFromInUse(); void removeThisSlotNrFromInUse(int slotNr); RAandMID findFirstOrLast(Cursor * cuPtr, insertLocType ilt); RAandMID findAsInstructed(Cursor * cuPtr, findInstruction fI); RAandMID bindCursor(Cursor * cuPtr, int place); fileReturnCode fileCursorInBoundCursors(Cursor * cuPtr); Cursor * removeFirstCursorFromBoundCursors(); removeReturnCode removeThisCursorFromBoundCursors(Cursor * cuPtr); public: static int Ecount; }; class RankedSet { friend class subsetHolder; friend class setMemberHolder; friend class Cursor; int topLevelNr; long nrInSet; int nrInFirstLevel; RAType minRA; memberType mIDofMin; RAType maxRA; memberType mIDofMax; setMemberHolder* smhPtr; subsetHolder* sshPtr; int cursorCount; Cursor * firstLooseCursor; RAandMID findAsInstructed(Cursor * cuPtr, findInstruction fI); //The abouve is private since programmer would need to //access private attributes of Cursor to make use of this routine. public: static int Ecount; DestroyInstructionNE destroyInstructionNE; DestroyInstructionCC destroyInstructionCC; RankedSet(); RankedSet(DestroyInstructionNE diNE , DestroyInstructionCC diCC); ~RankedSet(); long NrInSet(){return nrInSet;} RAType MinRA(){return minRA;} memberType MIDofMin(){return mIDofMin;} RAType MaxRA(){return maxRA;} memberType MIDofMax(){return mIDofMax;} fileReturnCode fileMemberIntoSet(RAType RA,memberType mID); RAandMID removeFirstFromSet(); //returns NULLmID if not ok RAandMID removeLastFromSet(); //returns NULLmID if not ok RAandMID removeFOrLFromSet(insertLocType ilt); //used by prior two removeReturnCode removeThisFromSet(RAType RA,memberType memberID); removeReturnCode removeThisFromSet(RAandMID); RAandMID findFirst(Cursor * cuPtr); RAandMID findLast(Cursor * cuPtr); RAandMID findFirstOrLast(Cursor * cuPtr, insertLocType ilt); RAandMID findEqual(Cursor * cuPtr, RAType ra, memberType mID); RAandMID findEqualOrHigher(Cursor * cuPtr, RAType ra, memberType mID); RAandMID findEqualOrLower(Cursor * cuPtr, RAType ra, memberType mID); removeReturnCode removeThisCursorFromSet(Cursor * cuPtr); private: fileReturnCode fileCursorInLooseCursors(Cursor * cuPtr); Cursor * removeFirstCursorFromLooseCursors(); removeReturnCode removeThisCursorFromLooseCursors(Cursor * cuPtr); }; class Cursor { friend class RankedSet; friend class subsetHolder; friend class setMemberHolder; Cursor * nextCursor; Cursor * priorCursor; Cu_Status cuState; RankedSet * SetBeingExplored; setMemberHolder * smhWhereBound; int slotWhereBound; RAType cu_rankingAtt; memberType cu_memberID; public: static int Ecount; Cursor(); ~Cursor(); RAType Cu_rankingAtt(){return cu_rankingAtt;} memberType Cu_memberID(){return cu_memberID;} Cu_Status CuState(){return cuState;} RAandMID findNext(); RAandMID findPrior(); RAandMID findNextOrPrior(direction d); };