C++ 异步读写安全的缓存区

来源:互联网 发布:mysql如何使用 编辑:程序博客网 时间:2024/05/22 10:24
//// Created by mqd on 2016/12/6.//#ifndef _ASYNCBUF_H#define _ASYNCBUF_H#include <string>#include <cstdint>#include "safe_delete.h"#include "base_constructor.h"template <typename T>class AsyncBuf {public:explicit AsyncBuf(int32_t len):_len(len),_begIndex(0),_endIndex(0) {_buf = new T[_len];}bool Push(const T* buf, int32_t len) {if (_len - GetContentLen() <= len){return false;}else{if (_len - _endIndex >= len){memcpy(_buf + _endIndex, buf, len * sizeof(T));_endIndex += len;_endIndex %= _len;}else{int afterLen = _len - _endIndex;memcpy(_buf + _endIndex, buf, afterLen * sizeof(T));int frontLen = len - afterLen;memcpy(_buf, buf + afterLen, frontLen * sizeof(T));_endIndex = frontLen;}return true;}}T* Pop(int32_t len) {if (GetContentLen() < len){return nullptr;}else{T* tempBuf = new T[len];if (_endIndex > _begIndex){memcpy(tempBuf, _buf + _begIndex, len * sizeof(T));_begIndex += len;}else{int afterLen = _len - _begIndex;if (afterLen >= len){memcpy(tempBuf, _buf + _begIndex, len * sizeof(T));_begIndex += len;_begIndex %= _len;}else{memcpy(tempBuf, _buf + _begIndex, afterLen * sizeof(T));int frontLen = len - afterLen;memcpy(tempBuf + afterLen, _buf, frontLen * sizeof(T));_begIndex = frontLen;}}return tempBuf;}}~AsyncBuf() {safe_delete::SafeDeleteArray(_buf);}private:int32_t _begIndex;int32_t _endIndex;int32_t _len;T*      _buf;int GetContentLen() const {if (_begIndex < _endIndex){return (_endIndex - _begIndex);}else if (_begIndex > _endIndex) {return (_len - (_begIndex - _endIndex));}return 0;}DISALLOW_COPY_AND_ASSIGN(AsyncBuf)};#endif //_ASYNCBUF_H

0 0
原创粉丝点击