home *** CD-ROM | disk | FTP | other *** search
/ Boldly Go Collection / version40.iso / TS / 17A / DRWIN101.ZIP / BITSTR.HPP < prev    next >
C/C++ Source or Header  |  1991-11-06  |  4KB  |  98 lines

  1. #ifndef __BITSTR_HPP
  2. #define __BITSTR_HPP
  3.  
  4.  
  5. #ifndef SBIT8
  6.   #define SBIT8 char
  7. #endif
  8.  
  9. #ifndef UBIT8
  10.   #define UBIT8 unsigned char
  11. #endif
  12.  
  13. #ifndef SBIT16
  14.   #define SBIT16 int
  15. #endif
  16.  
  17. #ifndef UBIT16
  18.   #define UBIT16 unsigned int
  19. #endif
  20.  
  21. #ifndef SBIT32
  22.   #define SBIT32 long int
  23. #endif
  24.  
  25. #ifndef UBIT32
  26.   #define UBIT32 unsigned long int
  27. #endif
  28.  
  29. #ifndef HIBYTE
  30.   #define HIBYTE(x)  *(((UBIT8*)&x)+1)
  31. #endif
  32.  
  33. #ifndef LOBYTE
  34.   #define LOBYTE(x)  *(UBIT8*)&x
  35. #endif
  36.  
  37.  
  38. //===========================================================================
  39. //  class BIT_STREAM
  40. //===========================================================================
  41. //-----------------------------Description-----------------------------------
  42. //  This class is used to manipulate a stream of bits.  It is set up like a
  43. //  normal byte buffer, with elementary put/get functions.  The use of Put()
  44. //  and Get() will implement a FIFO, whereas the use of Put() and UnPut()
  45. //  (or UnGet() and Get()) will implement a LIFO/stack.  The bits may be
  46. //  addressed as an array using [] and Set(), and simple rotations may then
  47. //  be performed via BitPut(BitGet()) or BitUnGet(BitUnPut()).
  48. //-----------------------------Members---------------------------------------
  49. //-----------------------------Global constants------------------------------
  50. //-------------------Mod-------Global variables------------------------------
  51. //-----------------------------Functions called------------------------------
  52. //-----------------------------Examples--------------------------------------
  53. //-----------------------------Constraints/Gotchas---------------------------
  54. //--Date--------Programmer----------Comments---------------------------------
  55. //  1991.06.28  D. Rogers           initial code                            -
  56. //===========================================================================
  57.  
  58. class BIT_STREAM {                     //bit stream manipulation
  59. private:
  60.   UBIT8  *base;                        //pointer to base of bit storage
  61.   UBIT16 max;                          //number of bits maximum
  62.   UBIT16 cnt;                          //number of bits available
  63.   UBIT16 hed;                          //beginning (source) of stream
  64.   UBIT16 tal;                          //pointer to end (sink) of stream
  65. public:
  66.   BIT_STREAM(int maxbits=0x800);       //constructor
  67. //=======================  ~BIT_STREAM(); { delete base; }    //destructor
  68.   int    Empty(void) { return cnt==0; }   //tells when buffer has run out
  69.   int    Full(void) { return cnt>=max; }  //tells when buffer is full
  70.   void   Flush(void) { cnt=hed=tal=0; }   //reset stream
  71.   UBIT8  operator [] (UBIT16 k);       //reads from current offset ([0])
  72.   void   Set(UBIT16 index,UBIT8 bit);  //sets from offset (can't use [])
  73.   UBIT16 Length(void) { return cnt; }  //number of bits in stream
  74.   UBIT16 Peek(UBIT16 off,UBIT16 bits); //peeks from offset, no bits removed
  75.  
  76.   void   BitPut(UBIT8 bit);            //inserts a single bit
  77.   void   Put(UBIT16 word,UBIT16 bits); //add from a word
  78.   void   Put(UBIT32 word,UBIT16 bits); //add from a long word
  79.   void   Put(UBIT8* data,UBIT16 bits); //add from byte stream
  80.  
  81.   UBIT8  BitGet(void);                 //extracts a single bit
  82.   UBIT16 Get(UBIT16 bits);             //get bits
  83.   void   Get(UBIT8* data,UBIT16 bits); //get bits into byte buffer
  84.  
  85.   UBIT8  BitUnPut(void);               //un-inserts a single bit
  86.   UBIT16 UnPut(UBIT16 bits);             //get bits from head end, not tail
  87.   void   UnPut(UBIT8* data,UBIT16 bits); //get from head into byte buffer
  88.  
  89.   void   BitUnGet(UBIT8 bit);          //un-extracts a single bit
  90.   void   UnGet(UBIT16 bits=1);         //ungets with current contents
  91.   void   UnGet(UBIT16 word,UBIT16 bits);  //add to tail end from a word
  92.   void   UnGet(UBIT32 word,UBIT16 bits);  //add to tail end from a long word
  93.   void   UnGet(UBIT8* data,UBIT16 bits);  //add to tail from byte stream
  94. };   //class BIT_STREAM
  95.  
  96.  
  97. #endif
  98.