diff --git a/inc/hgl/io/ConstBufferReader.h b/inc/hgl/io/ConstBufferReader.h new file mode 100644 index 0000000..50e48c3 --- /dev/null +++ b/inc/hgl/io/ConstBufferReader.h @@ -0,0 +1,149 @@ +#ifndef HGL_IO_CONST_BUFFER_READER_INCLUDE +#define HGL_IO_CONST_BUFFER_READER_INCLUDE + +#include +#include +namespace hgl +{ + namespace io + { + class ConstBufferReader + { + const void *buffer; + const uint8 *pointer; + int64 size; + + public: + + ConstBufferReader(const void *buf,const int64 s) + { + buffer=buf; + pointer=(uint8 *)buffer; + size=s; + } + + ConstBufferReader(ConstBufferReader &cbr,const int64 s) + { + buffer=cbr.CurPointer(); + pointer=(uint8 *)buffer; + size=s; + } + + template bool Read(T &v) + { + if(size bool CastRead(T2 &v) + { + if(size bool ReadArray(T *v,const int64 count) + { + if(size int _ReadString(T *str) + { + if(!str)return(-1); + + S str_len; + + if(!Read(str_len))return(-2); + + if(!ReadArray(str,(const int64)str_len))return(-3); + + str[str_len]=0; + + return str_len; + } + + template int _ReadString(String &str) + { + S str_len; + + if(!Read(str_len))return(-2); + + str.SetString((T *)pointer,str_len); + + pointer+=str_len*sizeof(T); + + return(str_len); + } + + public: + + template int ReadTinyString (T *str){return _ReadString(str);} + template int ReadShortString(T *str){return _ReadString(str);} + template int ReadString (T *str){return _ReadString(str);} + + template int ReadTinyString (hgl::String &str){return _ReadString(str);} + template int ReadShortString(hgl::String &str){return _ReadString(str);} + template int ReadString (hgl::String &str){return _ReadString(str);} + + int64 GetSize()const{return size;} + int64 GetRemain()const{return size-(pointer-(uint8 *)buffer);} + + int64 Tell()const{return pointer-(uint8 *)buffer;} + int64 Seek(const int64 offset,const SeekOrigin so=SeekOrigin::Begin) + { + int64 new_offset; + + switch(so) + { + case SeekOrigin::Begin: new_offset=offset;break; + case SeekOrigin::Current: new_offset=pointer-(uint8 *)buffer+offset;break; + case SeekOrigin::End: new_offset=size+offset;break; + default:return(-1); + } + + if(new_offset>size) + return(-1); + + pointer=(uint8 *)buffer+new_offset; + + return(new_offset); + } + + int64 Skip(const int64 offset) + { + if(offset>size) + return(-1); + + pointer+=offset; + + return(offset); + } + + int64 Restart() + { + pointer=(uint8 *)buffer; + } + + const void *CurPointer()const{return pointer;} + };//class ConstBufferReader + }//namespace io +}//namespace hgl +#endif//HGL_IO_CONST_BUFFER_READER_INCLUDE diff --git a/inc/hgl/io/SeekAccess.h b/inc/hgl/io/SeekAccess.h index 8977421..d2b7fa1 100644 --- a/inc/hgl/io/SeekAccess.h +++ b/inc/hgl/io/SeekAccess.h @@ -1,18 +1,12 @@ #ifndef HGL_IO_SEEK_ACCESS_INCLUDE #define HGL_IO_SEEK_ACCESS_INCLUDE -#include +#include +#include namespace hgl { namespace io { - enum class SeekOrigin /// 资源偏移方向枚举 - { - Begin=0, ///<从资源最开始处开始,offset必须大于0。移到资源的offset位置 - Current, ///<从资源当前位置开始,移到资源的Position+offset位置 - End ///<从资源的结束位置开始,offset必须小于0,表示结束前的字符数 - };//enum SeekOrigin - /** * 定位访问功能基类 */ diff --git a/inc/hgl/io/SeekOrigin.h b/inc/hgl/io/SeekOrigin.h new file mode 100644 index 0000000..a35b72e --- /dev/null +++ b/inc/hgl/io/SeekOrigin.h @@ -0,0 +1,16 @@ +#ifndef HGL_IO_SEEK_ORIGIN_INCLUDE +#define HGL_IO_SEEK_ORIGIN_INCLUDE + +namespace hgl +{ + namespace io + { + enum class SeekOrigin /// 资源偏移方向枚举 + { + Begin=0, ///<从资源最开始处开始,offset必须大于0。移到资源的offset位置 + Current, ///<从资源当前位置开始,移到资源的Position+offset位置 + End ///<从资源的结束位置开始,offset必须小于0,表示结束前的字符数 + };//enum SeekOrigin + }//namespace io +}//namespace hgl +#endif//HGL_IO_SEEK_ORIGIN_INCLUDE