![]() |
TcpSocket::CircularBuffer Class ReferenceBuffer class containing one read/write circular buffer.
More...
|
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) | |
CircularBuffer & | operator= (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 |
Definition at line 59 of file TcpSocket.h.
TcpSocket::CircularBuffer::CircularBuffer | ( | size_t | size | ) |
TcpSocket::CircularBuffer::~CircularBuffer | ( | ) |
TcpSocket::CircularBuffer::CircularBuffer | ( | const CircularBuffer & | s | ) | [inline, private] |
bool TcpSocket::CircularBuffer::Write | ( | const char * | p, | |
size_t | l | |||
) |
append l bytes from p to buffer
Definition at line 1464 of file TcpSocket.cpp.
References m_count, m_max, m_q, and m_t.
Referenced by TcpSocket::OnRead().
01465 { 01466 if (m_q + l > m_max) 01467 { 01468 return false; // overflow 01469 } 01470 m_count += (unsigned long)l; 01471 if (m_t + l > m_max) // block crosses circular border 01472 { 01473 size_t l1 = m_max - m_t; // size left until circular border crossing 01474 // always copy full block to buffer(buf) + top pointer(m_t) 01475 // because we have doubled the buffer size for performance reasons 01476 memcpy(buf + m_t, s, l); 01477 memcpy(buf, s + l1, l - l1); 01478 m_t = l - l1; 01479 m_q += l; 01480 } 01481 else 01482 { 01483 memcpy(buf + m_t, s, l); 01484 memcpy(buf + m_max + m_t, s, l); 01485 m_t += l; 01486 if (m_t >= m_max) 01487 m_t -= m_max; 01488 m_q += l; 01489 } 01490 return true; 01491 }
bool TcpSocket::CircularBuffer::Read | ( | char * | dest, | |
size_t | l | |||
) |
copy l bytes from buffer to dest
Definition at line 1494 of file TcpSocket.cpp.
References m_b, m_max, m_q, and m_t.
Referenced by TcpSocket::OnSocks4Read(), ReadString(), and Remove().
01495 { 01496 if (l > m_q) 01497 { 01498 return false; // not enough chars 01499 } 01500 if (m_b + l > m_max) // block crosses circular border 01501 { 01502 size_t l1 = m_max - m_b; 01503 if (s) 01504 { 01505 memcpy(s, buf + m_b, l1); 01506 memcpy(s + l1, buf, l - l1); 01507 } 01508 m_b = l - l1; 01509 m_q -= l; 01510 } 01511 else 01512 { 01513 if (s) 01514 { 01515 memcpy(s, buf + m_b, l); 01516 } 01517 m_b += l; 01518 if (m_b >= m_max) 01519 m_b -= m_max; 01520 m_q -= l; 01521 } 01522 if (!m_q) 01523 { 01524 m_b = m_t = 0; 01525 } 01526 return true; 01527 }
bool TcpSocket::CircularBuffer::Remove | ( | size_t | l | ) |
skip l bytes from buffer
Definition at line 1530 of file TcpSocket.cpp.
References Read().
01531 { 01532 return Read(NULL, l); 01533 }
std::string TcpSocket::CircularBuffer::ReadString | ( | size_t | l | ) |
read l bytes from buffer, returns as string.
Definition at line 1572 of file TcpSocket.cpp.
References Read().
01573 { 01574 char *sz = new char[l + 1]; 01575 if (!Read(sz, l)) // failed, debug printout in Read() method 01576 { 01577 delete[] sz; 01578 return ""; 01579 } 01580 sz[l] = 0; 01581 std::string tmp = sz; 01582 delete[] sz; 01583 return tmp; 01584 }
size_t TcpSocket::CircularBuffer::GetLength | ( | ) |
total buffer length
Definition at line 1536 of file TcpSocket.cpp.
References m_q.
Referenced by TcpSocket::GetInputLength().
01537 { 01538 return m_q; 01539 }
const char * TcpSocket::CircularBuffer::GetStart | ( | ) |
size_t TcpSocket::CircularBuffer::GetL | ( | ) |
size_t TcpSocket::CircularBuffer::Space | ( | ) |
unsigned long TcpSocket::CircularBuffer::ByteCounter | ( | bool | clear = false |
) |
CircularBuffer& TcpSocket::CircularBuffer::operator= | ( | const CircularBuffer & | ) | [inline, private] |
char* TcpSocket::CircularBuffer::buf [private] |
Definition at line 89 of file TcpSocket.h.
size_t TcpSocket::CircularBuffer::m_max [private] |
size_t TcpSocket::CircularBuffer::m_q [private] |
Definition at line 91 of file TcpSocket.h.
Referenced by GetL(), GetLength(), Read(), Space(), and Write().
size_t TcpSocket::CircularBuffer::m_b [private] |
size_t TcpSocket::CircularBuffer::m_t [private] |
unsigned long TcpSocket::CircularBuffer::m_count [private] |