home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / MISC / MAILBOX.ZIP / MPRNG.H < prev    next >
Encoding:
C/C++ Source or Header  |  1988-06-27  |  5.3 KB  |  124 lines

  1. /****************************************************************************/
  2. /* mprng.h  -- DOUBLY LINKED RING CLUSTER    (INTERFACE & IMPLEMENTATION)*/
  3. /* Created:  12/12/87        Release:  0.7        Version:  06/27/88  */
  4. /****************************************************************************
  5. (c) Copyright 1987, 1988 by Michael Benjamin Parker     (USA SS# 557-49-4130)
  6.  
  7. All Rights Reserved unless specified in the following include files: */
  8. #include "mptsk.cpy" /*
  9.  
  10. DO NOT REMOVE OR ALTER THIS NOTICE AND ITS PROVISIONS.
  11. ****************************************************************************/
  12. /* OVERVIEW:
  13.  
  14. This code allows abitrary data structures to be grouped into rings by simply
  15. including a RNG datatype in the structure.  It allows for the management of
  16. this rings without special memory management at a cost of flexibility (the
  17. number of rings to which a data structure can belong must be declared at
  18. its definition, and cannot be changed.)
  19.  
  20.  
  21. This code implements doubly-linked rings, allowing fast, simple ring
  22. operations in both directions at a cost of storage space.
  23. */
  24. /****************************************************************************/
  25. /****************************************************************************/
  26. #ifndef    MPRNG_H
  27. #define    MPRNG_H
  28. /****************************************************************************/
  29. #include "mpmisc.h"
  30. #include "mpbug.h"
  31. /****************************************************************************/
  32. /****************************************************************************/
  33. /* DATA STRUCTURE: */
  34. typedef    void    PTR MPRNGID;
  35. typedef    struct    _MPRNG    MPRNG;
  36. /****************************************************************************/
  37. /****************************************************************************/
  38. /* INTERFACE:                                    */
  39.  
  40. MPRNGID        mprng_init    ARGS((void PTR buff));    /*
  41. void PTR    mprng_dinit    ARGS((MPRNGID mprng));
  42.  
  43. MPRNGID        mprng_next    ARGS((MPRNGID mprng));
  44. MPRNGID        mprng_prev    ARGS((MPRNGID mprng));
  45.  
  46. BOOL        mprng_issingle    ARGS((MPRNGID mprng));
  47. */
  48. MPRNGID        mprng_offset    ARGS((MPRNGID mprng, SINT amt));
  49. UINT        mprng_length    ARGS((MPRNGID mprng));
  50. /*
  51. void        mprng_twistnn    ARGS((MPRNGID mprngA, MPRNGID mprngB);
  52. void        mprng_twistnp    ARGS((MPRNGID mprngA, MPRNGID mprngB);
  53. void        mprng_twistpn    ARGS((MPRNGID mprngA, MPRNGID mprngB);
  54. void        mprng_twistpp    ARGS((MPRNGID mprngA, MPRNGID mprngB);
  55.  
  56. void        mprng_addp    ARGS((MPRNGID mprng, MPRNGID toadd));
  57. void        mprng_addn    ARGS((MPRNGID mprng, MPRNGID toadd));    */
  58. MPRNGID        mprng_sub    ARGS((MPRNGID mprng));            /*
  59. MPRNGID        mprng_subp    ARGS((MPRNGID mprng));
  60. MPRNGID        mprng_subn    ARGS((MPRNGID mprng));
  61. */
  62. void        mprng_print    ARGS((MPRNGID mprng));
  63. void        mprng_printall    ARGS((MPRNGID mprng));
  64. void        mprng_test    ARGS(());
  65. /****************************************************************************/
  66. /****************************************************************************/
  67. /****************************************************************************/
  68. /* INTERNAL DATA STRUCTURE */
  69. typedef    struct    _MPRNG    PTR    _MPRNGID;
  70. struct    _MPRNG {
  71.     _MPRNGID    links[2];
  72. };
  73. /****************************************************************************/
  74. /****************************************************************************/
  75. /* INTERNAL MACROS / FUNCTIONS */
  76.  
  77. #define    mprng_nexter(mprng)    (((_MPRNGID)(mprng))->links[0])
  78. #define    mprng_prever(mprng)    (((_MPRNGID)(mprng))->links[1])
  79.  
  80. void        mprng_twist    ARGS((MPRNGID mprngA, MPRNGID mprngAn,
  81.                       MPRNGID mprngB, MPRNGID mprngBn));
  82. /****************************************************************************/
  83. /****************************************************************************/
  84. /* EXTERNAL MACROS */
  85.  
  86. #define    mprng_dinit(mprng)    mprng_sub(mprng)
  87.  
  88. /****************************************************************************/
  89.  
  90. #define    mprng_next(mprng)    ((MPRNGID)mprng_nexter((_MPRNGID)(mprng)))
  91. #define    mprng_prev(mprng)    ((MPRNGID)mprng_prever((_MPRNGID)(mprng)))
  92.  
  93. /****************************************************************************/
  94. #define    mprng_issingle(mprng)    \
  95.     (((MPRNGID)(mprng))==(mprng_next(mprng)))
  96. /****************************************************************************/
  97. #define    mprng_twistpp(mprngA, mprngB)                    \
  98.     mprng_twist(    mprng_prev(mprngA),     (mprngA),            \
  99.             mprng_prev(mprngB),     (mprngB))
  100. #define    mprng_twistnn(mprngA, mprngB)                    \
  101.     mprng_twist(    (mprngA),         mprng_next(mprngA),    \
  102.             (mprngB),         mprng_next(mprngB))
  103. #define    mprng_twistpn(mprngA, mprngB)                    \
  104.     mprng_twist(    mprng_prev(mprngA),    (mprngA),            \
  105.             (mprngB),         mprng_next(mprngB))
  106. #define    mprng_twistnp(mprngA, mprngB)                    \
  107.     mprng_twist(    (mprngA),         mprng_next(mprngA),    \
  108.             mprng_prev(mprngB),    (mprngB))
  109. /****************************************************************************/
  110.  
  111. #define    mprng_addp(mprng, toadd)            \
  112.     mprng_twistpp((mprng),(toadd))
  113. #define    mprng_addn(mprng, toadd)            \
  114.     mprng_twistnn((mprng),(toadd));
  115. #define    mprng_subp(mprng)                \
  116.     mprng_sub(mprng_prev(mprng))
  117. #define    mprng_subn(mprng)                \
  118.     mprng_sub(mprng_next(mprng))
  119.  
  120. /****************************************************************************/
  121. /****************************************************************************/
  122. /****************************************************************************/
  123. #endif    /* MPRNG_H */
  124.