c++缓冲区 vBufferChar.hpp

//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

转载于:https://www.cnblogs.com/smallredness/p/10945299.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值