home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************/
- /* mprng.h -- DOUBLY LINKED RING CLUSTER (INTERFACE & IMPLEMENTATION)*/
- /* Created: 12/12/87 Release: 0.7 Version: 06/27/88 */
- /****************************************************************************
- (c) Copyright 1987, 1988 by Michael Benjamin Parker (USA SS# 557-49-4130)
-
- All Rights Reserved unless specified in the following include files: */
- #include "mptsk.cpy" /*
-
- DO NOT REMOVE OR ALTER THIS NOTICE AND ITS PROVISIONS.
- ****************************************************************************/
- /* OVERVIEW:
-
- This code allows abitrary data structures to be grouped into rings by simply
- including a RNG datatype in the structure. It allows for the management of
- this rings without special memory management at a cost of flexibility (the
- number of rings to which a data structure can belong must be declared at
- its definition, and cannot be changed.)
-
-
- This code implements doubly-linked rings, allowing fast, simple ring
- operations in both directions at a cost of storage space.
- */
- /****************************************************************************/
- /****************************************************************************/
- #ifndef MPRNG_H
- #define MPRNG_H
- /****************************************************************************/
- #include "mpmisc.h"
- #include "mpbug.h"
- /****************************************************************************/
- /****************************************************************************/
- /* DATA STRUCTURE: */
- typedef void PTR MPRNGID;
- typedef struct _MPRNG MPRNG;
- /****************************************************************************/
- /****************************************************************************/
- /* INTERFACE: */
-
- MPRNGID mprng_init ARGS((void PTR buff)); /*
- void PTR mprng_dinit ARGS((MPRNGID mprng));
-
- MPRNGID mprng_next ARGS((MPRNGID mprng));
- MPRNGID mprng_prev ARGS((MPRNGID mprng));
-
- BOOL mprng_issingle ARGS((MPRNGID mprng));
- */
- MPRNGID mprng_offset ARGS((MPRNGID mprng, SINT amt));
- UINT mprng_length ARGS((MPRNGID mprng));
- /*
- void mprng_twistnn ARGS((MPRNGID mprngA, MPRNGID mprngB);
- void mprng_twistnp ARGS((MPRNGID mprngA, MPRNGID mprngB);
- void mprng_twistpn ARGS((MPRNGID mprngA, MPRNGID mprngB);
- void mprng_twistpp ARGS((MPRNGID mprngA, MPRNGID mprngB);
-
- void mprng_addp ARGS((MPRNGID mprng, MPRNGID toadd));
- void mprng_addn ARGS((MPRNGID mprng, MPRNGID toadd)); */
- MPRNGID mprng_sub ARGS((MPRNGID mprng)); /*
- MPRNGID mprng_subp ARGS((MPRNGID mprng));
- MPRNGID mprng_subn ARGS((MPRNGID mprng));
- */
- void mprng_print ARGS((MPRNGID mprng));
- void mprng_printall ARGS((MPRNGID mprng));
- void mprng_test ARGS(());
- /****************************************************************************/
- /****************************************************************************/
- /****************************************************************************/
- /* INTERNAL DATA STRUCTURE */
- typedef struct _MPRNG PTR _MPRNGID;
- struct _MPRNG {
- _MPRNGID links[2];
- };
- /****************************************************************************/
- /****************************************************************************/
- /* INTERNAL MACROS / FUNCTIONS */
-
- #define mprng_nexter(mprng) (((_MPRNGID)(mprng))->links[0])
- #define mprng_prever(mprng) (((_MPRNGID)(mprng))->links[1])
-
- void mprng_twist ARGS((MPRNGID mprngA, MPRNGID mprngAn,
- MPRNGID mprngB, MPRNGID mprngBn));
- /****************************************************************************/
- /****************************************************************************/
- /* EXTERNAL MACROS */
-
- #define mprng_dinit(mprng) mprng_sub(mprng)
-
- /****************************************************************************/
-
- #define mprng_next(mprng) ((MPRNGID)mprng_nexter((_MPRNGID)(mprng)))
- #define mprng_prev(mprng) ((MPRNGID)mprng_prever((_MPRNGID)(mprng)))
-
- /****************************************************************************/
- #define mprng_issingle(mprng) \
- (((MPRNGID)(mprng))==(mprng_next(mprng)))
- /****************************************************************************/
- #define mprng_twistpp(mprngA, mprngB) \
- mprng_twist( mprng_prev(mprngA), (mprngA), \
- mprng_prev(mprngB), (mprngB))
- #define mprng_twistnn(mprngA, mprngB) \
- mprng_twist( (mprngA), mprng_next(mprngA), \
- (mprngB), mprng_next(mprngB))
- #define mprng_twistpn(mprngA, mprngB) \
- mprng_twist( mprng_prev(mprngA), (mprngA), \
- (mprngB), mprng_next(mprngB))
- #define mprng_twistnp(mprngA, mprngB) \
- mprng_twist( (mprngA), mprng_next(mprngA), \
- mprng_prev(mprngB), (mprngB))
- /****************************************************************************/
-
- #define mprng_addp(mprng, toadd) \
- mprng_twistpp((mprng),(toadd))
- #define mprng_addn(mprng, toadd) \
- mprng_twistnn((mprng),(toadd));
- #define mprng_subp(mprng) \
- mprng_sub(mprng_prev(mprng))
- #define mprng_subn(mprng) \
- mprng_sub(mprng_next(mprng))
-
- /****************************************************************************/
- /****************************************************************************/
- /****************************************************************************/
- #endif /* MPRNG_H */