const int D_SIZE = 16; class Cirbuf { friend class CirbufIterator; public: int produce(char c); int consume(); int is_empty() { return(length == 0); } int is_full() { return(length == size); } int next(char& c); // iteration Cirbuf& operator = (const Cirbuf& b); // assignment Cirbuf(const Cirbuf& b) // copy constructor { *this = b; } Cirbuf(int size = D_SIZE); // constructor ~Cirbuf(); // destructor private: int head; // first char in buffer int tail; // first empty slot in buffer int length; // number of characters in buffer int size; // capacity of buffer char *cb; // pointer to buffer int mod(int x) { return(x >= size ? x - size : x); } }; class CirbufIterator { public: CirbufIterator(Cirbuf& buf); int operator() (char&); private: Cirbuf& b; int ind; };