From 988562ea48e493ea9cb6ab176bc5e64a04360db0 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Mon, 20 May 2019 20:39:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0memblock.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/hgl/type/MemBlock.h | 203 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 inc/hgl/type/MemBlock.h diff --git a/inc/hgl/type/MemBlock.h b/inc/hgl/type/MemBlock.h new file mode 100644 index 00000000..3acd1732 --- /dev/null +++ b/inc/hgl/type/MemBlock.h @@ -0,0 +1,203 @@ +#ifndef HGL_MEM_BLOCK_INCLUDE +#define HGL_MEM_BLOCK_INCLUDE + +#include +#include +#include +#include +namespace hgl +{ + /** + * 内存块模版 + */ + template class MemBlock + { + protected: + + T *buf; + size_t cur_size; + size_t buf_size; + + public: + + size_t GetLength ()const{return cur_size;} ///<取得内存块长度(注:非字节数) + const size_t GetMaxLength ()const{return buf_size;} ///<取得内存块最大长度(注:非字节数) + const size_t GetBytes ()const{return cur_size*sizeof(T);} ///<取得内存块字节数 + const size_t GetMaxBytes ()const{return buf_size*sizeof(T);} ///<取得内存块最大字节数 + + /** + * 分配指定空间出来,供未来使用 + */ + void Malloc(size_t size) + { + if(size<=buf_size) + return; + + buf_size=power_to_2(size); + + if(!buf) + buf=(T *)hgl_malloc(buf_size*sizeof(T)); + else + buf=(T *)hgl_realloc(buf,buf_size*sizeof(T)); + } + + /** + * 设置当前数据长度 + */ + void SetLength(size_t size) ///<设置内存块长度(注:非字节数) + { + Malloc(size); + + cur_size=size; + } + + void AddLength(size_t size) + { + SetLength(cur_size+size); + } + + public: + + MemBlock() + { + buf=0; + cur_size=0; + buf_size=0; + } + + MemBlock(size_t size) + { + if(size<=0) + buf=0; + else + buf=(T *)hgl_malloc(size*sizeof(T)); + + if(buf) + { + cur_size=size; + buf_size=size; + } + else + { + cur_size=0; + buf_size=0; + } + } + + virtual ~MemBlock() + { + Clear(); + } + + void Clear() + { + if(buf) + hgl_free(buf); + + cur_size=0; + buf_size=0; + } + + void ClearData() + { + cur_size=0; + } + + void Zero() + { + if(buf) + memset(buf,0,buf_size); + } + + /** + * 设置数据,请保证数据使用hgl_malloc分配,否则会因为释放函数不配对出现错误 + */ + void SetData(T *d,int s) + { + Clear(); + + buf=d; + buf_size=s; + cur_size=s; + } + + /** + * 解除数据关联 + */ + void Unlink() + { + buf=nullptr; + cur_size=0; + buf_size=0; + } + + /** + * 复制内存块中的数据 + * @param d 复制出来的缓冲区指针 + * @param s 要复制出来的数据个数 + */ + void CopyData(T *d,int s) + { + SetLength(s); + memcpy(buf,d,s*sizeof(T)); + } + + T *data()const{return buf;} + T *GetData()const{return buf;} + + size_t length()const{return cur_size;} + size_t GetCount()const{return cur_size;} + + size_t bytes()const + { + return cur_size*sizeof(T); + } + + operator T *()const + { + return buf; + } + + T *operator ->()const + { + return buf; + } + + T &operator[](int n) + { + return buf+n; + } + };//template class MemBlock + + /** + * 加载一个文件到内存块类中 + */ + template MemBlock *LoadFileToMemBlock(const OSString &filename) + { + io::FileInputStream fis; + + if(!fis.Open(filename))return(nullptr); + + const size_t file_size =fis.GetSize(); + const size_t size =(file_size+sizeof(T)-1)/sizeof(T); + + MemBlock *mb=new MemBlock(size); + + fis.Read(mb->data(),file_size); + + return(mb); + } + + /** + * 保存一个内存块到文件 + */ + template bool SaveMemBlockToFile(const OSString &filename,const MemBlock &mb) + { + const size_t size=mb.bytes(); + + if(size<=0)return(true); + + return(hgl::filesystem::SaveMemoryToFile(filename,mb.data(),mb.bytes())==size); + } +}//namespace hgl +#endif//HGL_MEM_BLOCK_INCLUDE