Logo
~Sockets~
~Examples~
~Contact~


TcpSocket::CircularBuffer Class Reference
[Internal utility]

Buffer class containing one read/write circular buffer. More...

#include <TcpSocket.h>

List of all members.


Public Member Functions

 CircularBuffer (size_t size)
 ~CircularBuffer ()
bool Write (const char *p, size_t l)
 append l bytes from p to buffer
bool Read (char *dest, size_t l)
 copy l bytes from buffer to dest
bool Remove (size_t l)
 skip l bytes from buffer
std::string ReadString (size_t l)
 read l bytes from buffer, returns as string.
size_t GetLength ()
 total buffer length
const char * GetStart ()
 pointer to circular buffer beginning
size_t GetL ()
 return number of bytes from circular buffer beginning to buffer physical end
size_t Space ()
 return free space in buffer, number of bytes until buffer overrun
unsigned long ByteCounter (bool clear=false)
 return total number of bytes written to this buffer, ever

Private Member Functions

 CircularBuffer (const CircularBuffer &s)
CircularBufferoperator= (const CircularBuffer &)

Private Attributes

char * buf
size_t m_max
size_t m_q
size_t m_b
size_t m_t
unsigned long m_count

Detailed Description

Buffer class containing one read/write circular buffer.

Definition at line 68 of file TcpSocket.h.


Constructor & Destructor Documentation

TcpSocket::CircularBuffer::CircularBuffer ( size_t  size  ) 

Definition at line 1569 of file TcpSocket.cpp.

01570 :buf(new char[2 * size])
01571 ,m_max(size)
01572 ,m_q(0)
01573 ,m_b(0)
01574 ,m_t(0)
01575 ,m_count(0)
01576 {
01577 }

TcpSocket::CircularBuffer::~CircularBuffer (  ) 

Definition at line 1580 of file TcpSocket.cpp.

References buf.

01581 {
01582         delete[] buf;
01583 }

TcpSocket::CircularBuffer::CircularBuffer ( const CircularBuffer s  )  [inline, private]

Definition at line 96 of file TcpSocket.h.

00096 {}


Member Function Documentation

bool TcpSocket::CircularBuffer::Write ( const char *  p,
size_t  l 
)

append l bytes from p to buffer

Definition at line 1586 of file TcpSocket.cpp.

References buf, m_count, m_max, m_q, and m_t.

Referenced by TcpSocket::OnRead().

01587 {
01588         if (m_q + l > m_max)
01589         {
01590                 return false; // overflow
01591         }
01592         m_count += (unsigned long)l;
01593         if (m_t + l > m_max) // block crosses circular border
01594         {
01595                 size_t l1 = m_max - m_t; // size left until circular border crossing
01596                 // always copy full block to buffer(buf) + top pointer(m_t)
01597                 // because we have doubled the buffer size for performance reasons
01598                 memcpy(buf + m_t, s, l);
01599                 memcpy(buf, s + l1, l - l1);
01600                 m_t = l - l1;
01601                 m_q += l;
01602         }
01603         else
01604         {
01605                 memcpy(buf + m_t, s, l);
01606                 memcpy(buf + m_max + m_t, s, l);
01607                 m_t += l;
01608                 if (m_t >= m_max)
01609                         m_t -= m_max;
01610                 m_q += l;
01611         }
01612         return true;
01613 }

bool TcpSocket::CircularBuffer::Read ( char *  dest,
size_t  l 
)

copy l bytes from buffer to dest

Definition at line 1616 of file TcpSocket.cpp.

References buf, m_b, m_max, m_q, and m_t.

Referenced by TcpSocket::OnSocks4Read(), TcpSocket::ReadInput(), ReadString(), and Remove().

01617 {
01618         if (l > m_q)
01619         {
01620                 return false; // not enough chars
01621         }
01622         if (m_b + l > m_max) // block crosses circular border
01623         {
01624                 size_t l1 = m_max - m_b;
01625                 if (s)
01626                 {
01627                         memcpy(s, buf + m_b, l1);
01628                         memcpy(s + l1, buf, l - l1);
01629                 }
01630                 m_b = l - l1;
01631                 m_q -= l;
01632         }
01633         else
01634         {
01635                 if (s)
01636                 {
01637                         memcpy(s, buf + m_b, l);
01638                 }
01639                 m_b += l;
01640                 if (m_b >= m_max)
01641                         m_b -= m_max;
01642                 m_q -= l;
01643         }
01644         if (!m_q)
01645         {
01646                 m_b = m_t = 0;
01647         }
01648         return true;
01649 }

bool TcpSocket::CircularBuffer::Remove ( size_t  l  ) 

skip l bytes from buffer

Definition at line 1652 of file TcpSocket.cpp.

References Read().

01653 {
01654         return Read(NULL, l);
01655 }

std::string TcpSocket::CircularBuffer::ReadString ( size_t  l  ) 

read l bytes from buffer, returns as string.

Definition at line 1694 of file TcpSocket.cpp.

References Read().

01695 {
01696         char *sz = new char[l + 1];
01697         if (!Read(sz, l)) // failed, debug printout in Read() method
01698         {
01699                 delete[] sz;
01700                 return "";
01701         }
01702         sz[l] = 0;
01703         std::string tmp = sz;
01704         delete[] sz;
01705         return tmp;
01706 }

size_t TcpSocket::CircularBuffer::GetLength (  ) 

total buffer length

Definition at line 1658 of file TcpSocket.cpp.

References m_q.

Referenced by TcpSocket::GetInputLength().

01659 {
01660         return m_q;
01661 }

const char * TcpSocket::CircularBuffer::GetStart (  ) 

pointer to circular buffer beginning

Definition at line 1664 of file TcpSocket.cpp.

References buf, and m_b.

01665 {
01666         return buf + m_b;
01667 }

size_t TcpSocket::CircularBuffer::GetL (  ) 

return number of bytes from circular buffer beginning to buffer physical end

Definition at line 1670 of file TcpSocket.cpp.

References m_b, m_max, and m_q.

01671 {
01672         return (m_b + m_q > m_max) ? m_max - m_b : m_q;
01673 }

size_t TcpSocket::CircularBuffer::Space (  ) 

return free space in buffer, number of bytes until buffer overrun

Definition at line 1676 of file TcpSocket.cpp.

References m_max, and m_q.

01677 {
01678         return m_max - m_q;
01679 }

unsigned long TcpSocket::CircularBuffer::ByteCounter ( bool  clear = false  ) 

return total number of bytes written to this buffer, ever

Definition at line 1682 of file TcpSocket.cpp.

References m_count.

01683 {
01684         if (clear)
01685         {
01686                 unsigned long x = m_count;
01687                 m_count = 0;
01688                 return x;
01689         }
01690         return m_count;
01691 }

CircularBuffer& TcpSocket::CircularBuffer::operator= ( const CircularBuffer  )  [inline, private]

Definition at line 97 of file TcpSocket.h.

00097 { return *this; }


Member Data Documentation

Definition at line 98 of file TcpSocket.h.

Referenced by GetStart(), Read(), Write(), and ~CircularBuffer().

Definition at line 99 of file TcpSocket.h.

Referenced by GetL(), Read(), Space(), and Write().

Definition at line 100 of file TcpSocket.h.

Referenced by GetL(), GetLength(), Read(), Space(), and Write().

Definition at line 101 of file TcpSocket.h.

Referenced by GetL(), GetStart(), and Read().

Definition at line 102 of file TcpSocket.h.

Referenced by Read(), and Write().

unsigned long TcpSocket::CircularBuffer::m_count [private]

Definition at line 103 of file TcpSocket.h.

Referenced by ByteCounter(), and Write().


The documentation for this class was generated from the following files:
Page, code, and content Copyright (C) 2007 by Anders Hedström
Generated for C++ Sockets by  doxygen 1.4.4