//vbuffer_char.hpp
//vov
#ifndef V_BUFFER_CHAR_HPP
#define V_BUFFER_CHAR_HPP #include <iostream>
#include <vector>
#include <cstring> #define BUFFER_CAPACITY (16000) class vBufferChar
{
std::vector<char> buffer_;
int data_size_;
public:
vBufferChar();
vBufferChar(int size);
~vBufferChar();
int read(char* data,int size);
void write(const char* data,int size);
//get size of storge data
int size();
//get size of buffer
int capacity();
private:
//copy constructor
vBufferChar(const vBufferChar& t) {}
//assignment constructor
vBufferChar& operator=(const vBufferChar& t) {} int GetFromBeg(char* data,int size);
void DelFromBeg(int size);
void AddFromEnd(const char* data,int size);
}; //public
vBufferChar::vBufferChar() {
buffer_=std::vector<char>(BUFFER_CAPACITY,0);
data_size_=0;
} vBufferChar::vBufferChar(int size) {
buffer_=std::vector<char>((size>0)?size:BUFFER_CAPACITY,0);
data_size_=0;
} vBufferChar::~vBufferChar() { } int vBufferChar::size() {
return data_size_;
} int vBufferChar::capacity() {
return buffer_.size();
} int vBufferChar::read(char* data,int size) {
if(!data || size<=0) {
return 0;
} int read_size=GetFromBeg(data,size);
if(read_size>0) {
DelFromBeg(read_size);
} return read_size;
} void vBufferChar::write(const char* data,int size) {
if(!data || size<=0) {
return;
} if(size <=(buffer_.size()-data_size_)) {
AddFromEnd(data,size);
return;
} if(size>=buffer_.size()) {
std::cout<<"[vBufferChar]write:loss data-1:"<<data_size_+(size-buffer_.size())<<std::endl;
DelFromBeg(data_size_);
AddFromEnd(data+(size-buffer_.size()),buffer_.size());
return;
} if((size>(buffer_.size()-data_size_)) && (size <buffer_.size())) {
std::cout<<"[vBufferChar]write:loss data-2:"<<size-(buffer_.size()-data_size_)<<std::endl;
DelFromBeg(size-(buffer_.size()-data_size_));
AddFromEnd(data,size);
return;
}
} //private
int vBufferChar::GetFromBeg(char* data,int size) {
if(size<=0) {
return 0;
} int size_can_read=(size<data_size_)?size:data_size_;
memcpy(data,buffer_.data(),size_can_read);
return size_can_read;
} void vBufferChar::DelFromBeg(int size) {
if(size<=0) {
return;
} int size_delete=(size<data_size_)?size:data_size_;
data_size_-=size_delete;
memcpy(buffer_.data(),buffer_.data()+size_delete,data_size_);
return;
} void vBufferChar::AddFromEnd(const char* data,int size) {
if(size<=0||size>(buffer_.size()-data_size_)) {
return;
} memcpy(buffer_.data()+data_size_,data,size);
data_size_+=size;
} #endif

最新文章

  1. MSBuild 编译 C# Solution
  2. August 9th 2016, Week 33rd Tuesday
  3. [转] - Ubuntu 安装Eclipse
  4. 【转载】C编译过程概述
  5. Redhat Linux 性能 - 内置的 sar
  6. PHP多线程
  7. maven问题
  8. 数据类型演示DataTypeDemo
  9. Algorithm for Maximum Subsequence Sum z
  10. ebook-nodej
  11. [置顶] 老孟 DB2 V9.7 ESE(一)产品部署 基于centOS 6.4
  12. 基于visual Studio2013解决C语言竞赛题之1069链表查找删除
  13. Linux内核链表-通用链表的实现
  14. 排序算法Java实现(直接插入排序)
  15. C#默认参数原理探究
  16. C# autocomplete
  17. 微信小程序之缓存——不同页面传递数据
  18. Java内置锁synchronized的实现原理
  19. C#实现缩放字体
  20. CSS 3 学习笔记

热门文章

  1. 靓仔,整合SpringBoot还在百度搜配置吗?老司机教你一招!!!
  2. 一明单词本持续更新ing...
  3. 测试工程师需要了解的shell变量知识
  4. Django魔法
  5. Servlet(一)----快速入门
  6. js利用cookie登录网站
  7. upload-labs通关集
  8. 使用webhooks进行代码的自动化部署
  9. ThunderNet :像闪电一样,旷视再出超轻量级检测器,高达267fps | ICCV 2019
  10. Python第十二章-多进程和多线程02-多线程