当前位置: 首页 > news >正文

东莞网站建设必要性广州海珠区好玩的地方

东莞网站建设必要性,广州海珠区好玩的地方,装一个erp系统多少钱,农村室内设计效果图2019独角兽企业重金招聘Python工程师标准 google protocol buffer (下面简称gpb)功能强大#xff0c;应用广泛#xff0c;但在实际应用中#xff0c;gpb需要写.proto脚本文件#xff0c;需要依赖.lib库#xff0c;还需要为每个消息体生成一大堆难以阅读的C代… 2019独角兽企业重金招聘Python工程师标准      google protocol buffer (下面简称gpb)功能强大应用广泛但在实际应用中gpb需要写.proto脚本文件需要依赖.lib库还需要为每个消息体生成一大堆难以阅读的C代码。有时候想看一下消息体有哪些字段需要找原始的.proto文件来查看很不方便。于是我用了不到2000行代码实现了一个轻量级C版gpb命名为:LightPb。LightPb有以下特点:    1、不需要.proto文件和.lib库只需要包含一个头文件LightPb.h。    2、兼容bpb大部份功能序列化后生成的二进制文件与gpb一至。    3、可扩展repeated [packedtrue]功能使得该选项可以应用于消息体和string。    4、定义消息体的语法与gpb相似简单易学。    5、性能比gpb更优。          下面是一个使用LightPb的例子    1、首先在一个testLight.h文件中定义一个结构体SubPbC: struct SubPbC {PB_BEGIN()REQUIRED(int, m_int32, 2);REQUIRED_S(int, m_sint32, 3);REQUIRED(std::string, m_str, 4);PB_END() };       该结构体包含三个字段结构体字段的需要用REQUIRED或OPTIONAL以及REPEATED三个宏中之一来定义。含义与gpb中的required、optional、repeated是一样的。这些宏有三个参数分别是字段类型、字段名、和标签。与之对应的proto消息体是本例子中不需要定义该消息体只是用以说明SubPbC对应的proto结构体 message SubPb {required int32            m_int32  2;required sint32           m_sint32  3;required string           m_str  4; }   对C程序员来说上面的结构体定义和下面的结构体定义是一样的 struct SubPbC { int m_int32;int m_sint32;std::string m_str; std::string SerializeAsString(); //序列化函数bool ParseFromArray(const void* pData, int size); //反序列化函数  };   2 在.cpp文件使用该结构体  #include LightPb.h //LightPb项目的头文件 #include testLight.h //应用层定义的消息体 void main() {SubPbC obj;obj.m_int32  10; //像普通结构体一样赋值obj.m_sint32  -10;obj.m_str  ok LightPb;//序列化std::string str  obj.SerializeAsString();//反序列化SubPbC obj2;if (obj2.ParseFromArray(str.data(), str.length())  false){printf(test fail!\n);}return; } 就这么简单! 一个和googe pb性能比较的例子 http://www.oschina.net/code/snippet_2504104_51823   LightPb.h文件定义如下:   /*************************************************************************************************** 转载请注明出处作者联系方式3181356737qq.com V 1.0   Date:2015-10-28 *****************************************************************************************************/ #ifndef __BCL_LIGHT_PB_H__ #define __BCL_LIGHT_PB_H__ #include memory #include string #include vector #include array typedef int int32; typedef unsigned int uint32; typedef long long int64; typedef unsigned long long uint64; typedef std::string string; typedef std::string bytes; typedef int sint32; typedef long long sint64; typedef unsigned int fixed32; typedef unsigned long long fixed64; typedef  int sfixed32; typedef  long long sfixed64; typedef char int8; typedef unsigned char uint8; //#define USE_REPEATED_PACKED_EXTEND  //如果使用repeated packdtrue扩展请定义该宏 #ifndef _FIELD_DEF_ #define _FIELD_DEF_ template size_t size struct Int2Type {enum { Value  size }; }; #define INT2TYPE(size) Int2Typesize() #define ARRAY(type,size) std::arraytype,size #define FIELD_INDEX_BEGIN() enum {INDEX_BEGIN__COUNTER__,}; #define FIELD_INDEX_END()   enum {INDEX_END__COUNTER__,SizeINDEX_END-INDEX_BEGIN-1,}; #define AUTO_INDEX() (__COUNTER__-INDEX_BEGIN) #define FIELD_BEGIN() FIELD_INDEX_BEGIN() #define FIELD_END() FIELD_INDEX_END() #define FIELD(type,name) FIELD_INDEX(AUTO_INDEX(),type,name) #define FIELD_INDEX(index,type,name)  DEF_VALUE(type,name) GET_VALUE(index,type,name) GET_NAME(index,name) #define DEF_VALUE(type,name) type name;  #define GET_VALUE(index,type,name) type  getValue(Int2Typeindex){return name;} const type  getValue(Int2Typeindex) const {return name;} #define GET_NAME(index,name) const char* getName(Int2Typeindex) const { return #name;} templatetypename T struct THaveLeghtField {templatetypename typestatic char __is_field_struct(...);templatetypename typestatic int __is_field_struct(typename type::traits_type *);templatetypename typestatic int __is_field_struct(Int2Typetype::Size *);enum { Value  (sizeof(__is_field_structT(0))  sizeof(int)) }; }; #endif #define PB_INDEX(index,type,label,pbro,pbtype) std::arraychar,label getLabelObject(Int2Typeindex); Int2Typeindex getIndex(Int2Typelabel){ return Int2Typeindex(); } int getLabel(Int2Typeindex) { return label;}  enPbROP getPbROP(Int2Typeindex){return pbro; }  enPbTypeFlag  getPbTypeFlag(Int2Typeindex){return pbtype;} Int2Typepbtype  getPbTypeObject(Int2Typeindex){return Int2Typepbtype();} #define PB_FIELD_INDEX(index,type,value,label,pbro,pbtype) FIELD_INDEX(index,type,value); PB_INDEX(index,type,label,pbro,pbtype) type  getDefault(Int2Typeindex){  static type dflt; return dflt;}    int GetFieldByteSize(Int2Typeindex){ return 0;} void SetFieldByteSize(Int2Typeindex,int size){} #define PB_FIELD_INDEX_D(index,type,value,label,pbro,dflt,pbtype) FIELD_INDEX(index,type,value); PB_INDEX(index,type,label,pbro,pbtype) type  getDefault(Int2Typeindex){return dflt;}                 int GetFieldByteSize(Int2Typeindex){ return 0;} void SetFieldByteSize(Int2Typeindex,int size){} #define PB_FIELD_INDEX_B(index,type,value,label,pbro,pbtype) FIELD_INDEX(index,type,value); PB_INDEX(index,type,label,pbro,pbtype) type  getDefault(Int2Typeindex){  static type dflt; return dflt;} int value##_byteSize_; int GetFieldByteSize(Int2Typeindex){ return value##_byteSize_;} void SetFieldByteSize(Int2Typeindex,int size){value##_byteSize_  size;} #define REQUIRED(type,value,label)         PB_FIELD_INDEX(AUTO_INDEX(),type,value,label,enPbROP_Required,enPbTypeFlag_Default) #define REQUIRED_D(type,value,label,dflt)  PB_FIELD_INDEX_D(AUTO_INDEX(),type,value,label,enPbROP_Required,dflt,enPbTypeFlag_Default) #define REQUIRED_S(type,value,label)        PB_FIELD_INDEX(AUTO_INDEX(),type,value,label,enPbROP_Required,enPbTypeFlag_Signed) #define REQUIRED_DS(type,value,label,dflt)  PB_FIELD_INDEX_D(AUTO_INDEX(),type,value,label,enPbROP_Required,dflt,enPbTypeFlag_Signed) #define REQUIRED_SD(type,value,label,dflt)  PB_FIELD_INDEX_D(AUTO_INDEX(),type,value,label,enPbROP_Required,dflt,enPbTypeFlag_Signed) #define REQUIRED_F(type,value,label)        PB_FIELD_INDEX(AUTO_INDEX(),type,value,label,enPbROP_Required,enPbTypeFlag_Fixed) #define REQUIRED_DF(type,value,label,dflt)  PB_FIELD_INDEX_D(AUTO_INDEX(),type,value,label,enPbROP_Required,dflt,enPbTypeFlag_Fixed) #define REQUIRED_FD(type,value,label,dflt)  PB_FIELD_INDEX_D(AUTO_INDEX(),type,value,label,enPbROP_Required,dflt,enPbTypeFlag_Fixed) #define OPTIONAL(type,value,label)        PB_FIELD_INDEX(AUTO_INDEX(),type,value,label,enPbROP_Optional,enPbTypeFlag_Default) #define OPTIONAL_D(type,value,label,dflt) PB_FIELD_INDEX_D(AUTO_INDEX(),type,value,label,enPbROP_Optional,dflt,enPbTypeFlag_Default) #define OPTIONAL_DS(type,value,label,dflt) PB_FIELD_INDEX_D(AUTO_INDEX(),type,value,label,enPbROP_Optional,dflt,enPbTypeFlag_Signed) #define OPTIONAL_SD(type,value,label,dflt) PB_FIELD_INDEX_D(AUTO_INDEX(),type,value,label,enPbROP_Optional,dflt,enPbTypeFlag_Signed) #define OPTIONAL_S(type,value,label)        PB_FIELD_INDEX(AUTO_INDEX(),type,value,label,enPbROP_Optional,enPbTypeFlag_Signed) #define OPTIONAL_DF(type,value,label,dflt) PB_FIELD_INDEX_D(AUTO_INDEX(),type,value,label,enPbROP_Optional,dflt,enPbTypeFlag_Fixed) #define OPTIONAL_FD(type,value,label,dflt) PB_FIELD_INDEX_D(AUTO_INDEX(),type,value,label,enPbROP_Optional,dflt,enPbTypeFlag_Fixed) #define OPTIONAL_F(type,value,label)        PB_FIELD_INDEX(AUTO_INDEX(),type,value,label,enPbROP_Optional,enPbTypeFlag_Fixed) #define REPEATED(type,value,label)       OPTIONAL(std::vectortype,value,label)  #define REPEATED_S(type,value,label)     OPTIONAL_S(std::vectortype,value,label)  #define REPEATED_F(type,value,label)     OPTIONAL_F(std::vectortype,value,label) #define REPEATED_P(type,value,label)      PB_FIELD_INDEX(AUTO_INDEX(),std::vectortype,value,label,enPbROP_Packed,enPbTypeFlag_Default)  #define REPEATED_PS(type,value,label)     PB_FIELD_INDEX(AUTO_INDEX(),std::vectortype,value,label,enPbROP_Packed,enPbTypeFlag_Signed) #define REPEATED_SP(type,value,label)     PB_FIELD_INDEX(AUTO_INDEX(),std::vectortype,value,label,enPbROP_Packed,enPbTypeFlag_Signed) #define REPEATED_PF(type,value,label)     PB_FIELD_INDEX(AUTO_INDEX(),std::vectortype,value,label,enPbROP_Packed,enPbTypeFlag_Fixed) #define REPEATED_FP(type,value,label)     PB_FIELD_INDEX(AUTO_INDEX(),std::vectortype,value,label,enPbROP_Packed,enPbTypeFlag_Fixed) #define REPEATED_PB(type,value,label)      PB_FIELD_INDEX_B(AUTO_INDEX(),std::vectortype,value,label,enPbROP_Packed,enPbTypeFlag_Default)  #define REPEATED_PSB(type,value,label)     PB_FIELD_INDEX_B(AUTO_INDEX(),std::vectortype,value,label,enPbROP_Packed,enPbTypeFlag_Signed) #define REPEATED_SPB(type,value,label)     PB_FIELD_INDEX_B(AUTO_INDEX(),std::vectortype,value,label,enPbROP_Packed,enPbTypeFlag_Signed) #define REPEATED_PFB(type,value,label)     PB_FIELD_INDEX_B(AUTO_INDEX(),std::vectortype,value,label,enPbROP_Packed,enPbTypeFlag_Fixed) #define REPEATED_FPB(type,value,label)     PB_FIELD_INDEX_B(AUTO_INDEX(),std::vectortype,value,label,enPbROP_Packed,enPbTypeFlag_Fixed)#define PB_BEGIN_B() FIELD_BEGIN() \public: bool ParseFromArray(const void* pData,int size){ unsigned long long len  0;IPbBuffer ib((const char*)pData,size); return ib.Parse(this);} \std::string SerializeAsString(){ OPB ob(ByteSize()); ob.Write(*this, Int2TypeSize()); return std::move(ob.ToString());} \int SerializePartialToArray(void* pData, int len){ OPB ob((char*)pData, len);ob.Write(*this, Int2TypeSize()); return ob.Error() ? 0 : ob.Size();} \int m_byteSize; void set_byteSize(int size) {m_byteSize  size;} int  get_byteSize(){return m_byteSize;} int ByteSize(){OPBByteSize object; m_byteSize  0; object.ByteSzieObject(*this,Int2TypeSize()); return m_byteSize;} #define PB_BEGIN() FIELD_BEGIN() \public: bool ParseFromArray(const void* pData,int size){ unsigned long long len  0;IPbBuffer ib((const char*)pData,size); return ib.Parse(this);} \std::string SerializeAsString(){ OPB ob(ByteSize()); ob.Write(*this, Int2TypeSize()); return std::move(ob.ToString());} \int SerializePartialToArray(void* pData, int len){ OPB ob((char*)pData, len);ob.Write(*this, Int2TypeSize()); return ob.Error() ? 0 : ob.Size();} \void set_byteSize(int size) {} int  get_byteSize() { return 0; } int ByteSize() { OPBByteSize object; int len  object.ByteSzieObject(*this, Int2TypeSize()); set_byteSize(len); return len; }#define PB_END() FIELD_END()  bool ParseFromBuffer(IPbBuffer* pIpb, unsigned int label, enPBEncodeType EncodeType,const char* pData,unsigned long long  len){ return pIpb-ReadFieldSize(this, label, EncodeType,pData,len,Int2TypeSize()); }/// /// enum enPbROP {enPbROP_Required  0,enPbROP_Optional  1,enPbROP_Packed  2, }; //PB数据类标志 enum enPbTypeFlag {enPbTypeFlag_Default  0,enPbTypeFlag_Signed,enPbTypeFlag_Fixed, }; /* Type         Meaning Used For 0 Varint         int32, int64, uint32, uint64, sint32, sint64, bool, enum 1 64-bit         fixed64, sfixed64, double 2 Length-delimi string, bytes, embedded messages, packed repeated fields 3 Start group Groups (deprecated) 4 End group Groups (deprecated) 5 32-bit         fixed32, sfixed32, float */ //PB 编码类型 enum enPBEncodeType {enPBEncodeType_Varint  0,enPBEncodeType_64bit  1,enPBEncodeType_Length  2,enPBEncodeType_StartGroup  3,enPBEncodeType_EndGroup  4,enPBEncodeType_32bit  5, }; #define ZIGZAG32(n)    (((n)  1) ^ ((n)  31)) #define ZIGZAG64(n)    (((n)  1) ^ ((n)  63)) #define UNZIGZAG32(n)  ((n  1) ^ -static_castint32(n  1)) #define UNZIGZAG64(n) ((n  1) ^ -static_castint64(n  1))#define PB_KEY(wirte_type,label) (unsigned int)((label  3) | wirte_type) #define PB_ENCODETYPE(key) (key0x00000007) #define PB_LABEL(key) ((unsigned int)key3) // 消除警告:将值强制为布尔值“true”或“false”(性能警告) #pragma warning(disable:4800) templateunsigned int label struct TLabelSize {enum { Size  (label0)? 0 : ((label  (1  4)) ? 1 : ((label  (1  11)) ? 2 : ((label  (1  18)) ? 3 : ((label  (1  25)) ? 4 : (5))))) }; }; class OPBByteSize { public:template typename type int ByteSzieObject(type  obj, Int2Type0 ind){return 0;}templateint size, typename type int ByteSzieObject(type  obj,Int2Typesize ind){int bytesize  ByteSzieObject(obj, Int2Typesize-1 ());if (enPbROP_Optional  obj.getPbROP(ind) memcmp(obj.getValue(ind), obj.getDefault(ind), sizeof(obj.getValue(ind)))  0){obj.set_byteSize(bytesize);return bytesize;}int contextLen  0;  bytesize   ByteSize(obj.getValue(ind), Int2Typesizeof(obj.getLabelObject(ind))(), obj.getPbTypeObject(ind), obj.getPbROP(ind), contextLen);if (contextLen  0){obj.SetFieldByteSize(ind, contextLen);}obj.set_byteSize(bytesize);return bytesize;}/templateint PbTypeFlag,unsigned int LabelSizeint ByteSize(int32  obj, Int2TypeLabelSize label , Int2TypePbTypeFlag TypeFlag, enPbROP pbRop,int * pContextLen0){  return (unsigned int)TLabelSizeLabelSize::Size  FieldByteSize(obj, TypeFlag);}templateint PbTypeFlag, unsigned int LabelSizeint ByteSize(uint32  obj, Int2TypeLabelSize label, Int2TypePbTypeFlag TypeFlag, enPbROP pbRop, int * pContextLen  0){return (unsigned int)TLabelSizeLabelSize::Size  FieldByteSize(obj, TypeFlag);}templateint PbTypeFlag, unsigned int LabelSizeint ByteSize(int64  obj, Int2TypeLabelSize label, Int2TypePbTypeFlag TypeFlag, enPbROP pbRop, int * pContextLen  0){return (unsigned int)TLabelSizeLabelSize::Size  FieldByteSize(obj, TypeFlag);}templateint PbTypeFlag, unsigned int LabelSizeint ByteSize(uint64  obj, Int2TypeLabelSize label, Int2TypePbTypeFlag TypeFlag, enPbROP pbRop, int * pContextLen  0){return (unsigned int)TLabelSizeLabelSize::Size  FieldByteSize(obj, TypeFlag);}templateint PbTypeFlag, unsigned int LabelSizeint ByteSize(float  obj, Int2TypeLabelSize label, Int2TypePbTypeFlag TypeFlag, enPbROP pbRop, int * pContextLen  0){return (unsigned int)TLabelSizeLabelSize::Size  FieldByteSize(obj, TypeFlag);}templateint PbTypeFlag, unsigned int LabelSizeint ByteSize(double  obj, Int2TypeLabelSize label, Int2TypePbTypeFlag TypeFlag, enPbROP pbRop, int * pContextLen  0){return (unsigned int)TLabelSizeLabelSize::Size  FieldByteSize(obj, TypeFlag);}templateint PbTypeFlag, unsigned int LabelSizeint ByteSize(bool  obj, Int2TypeLabelSize label, Int2TypePbTypeFlag TypeFlag, enPbROP pbRop, int * pContextLen  0){return (unsigned int)TLabelSizeLabelSize::Size  FieldByteSize(obj, TypeFlag);}templateint PbTypeFlag, unsigned int LabelSizeint ByteSize(string   obj, Int2TypeLabelSize label, Int2TypePbTypeFlag TypeFlag, enPbROP pbRop, int * pContextLen  0){int size  obj.length();if(pContextLen) *pContextLen  size;return (unsigned int)TLabelSizeLabelSize::Size  size  this-VarintSize32(size);}templatetypename type,int PbTypeFlag,unsigned int LabelSizeint ByteSize(std::vectortype   obj, Int2TypeLabelSize label, Int2TypePbTypeFlag TypeFlag, enPbROP pbRop, int * pContextLen  0){int total  0;if (obj.empty()  false){if (pbRop  enPbROP_Packed){if (THaveLeghtFieldtype::Value || PbTypeFlag ! enPbTypeFlag_Fixed){for (int i  0; i  obj.size();i){total  ByteSize(obj[i], Int2Type0(), TypeFlag, pbRop);}}else{total  sizeof(type)*obj.size();}#ifdef USE_REPEATED_PACKED_EXTENDtotal  VarintSize32(obj.size());#endifif(pContextLen)*pContextLen  total;total  (unsigned int)TLabelSizeLabelSize::Size  VarintSize32(total);}else{if (THaveLeghtFieldtype::Value || PbTypeFlag ! enPbTypeFlag_Fixed){for (int i  0; i  obj.size();i){total  ByteSize(obj[i], Int2Type0(), TypeFlag, pbRop);}}else{total  sizeof(type)*obj.size();}total  (unsigned int)TLabelSizeLabelSize::Size*obj.size();}}return total;}templatetypename type, int PbTypeFlag,  unsigned int LabelSizeint ByteSize(type   obj, Int2TypeLabelSize label, Int2TypePbTypeFlag TypeFlag, enPbROP pbRop, int * pContextLen  0){int total  obj.ByteSize();if (pContextLen){*pContextLen  total;}return (unsigned int)TLabelSizeLabelSize::Size  total  VarintSize32(total);}///templateint PbTypeFlagint FieldByteSize(int32  obj, Int2TypePbTypeFlag TypeFlag){return ByteSize32(obj, TypeFlag);}templateint PbTypeFlagint FieldByteSize(uint32  obj,  Int2TypePbTypeFlag TypeFlag){return ByteSize32(obj, TypeFlag);}templateint PbTypeFlagint FieldByteSize(int64  obj, Int2TypePbTypeFlag TypeFlag){return ByteSize64(obj, TypeFlag);}templateint PbTypeFlagint FieldByteSize(uint64  obj, Int2TypePbTypeFlag TypeFlag){return ByteSize64(obj, TypeFlag);}templateint PbTypeFlagint FieldByteSize(float  obj,  Int2TypePbTypeFlag TypeFlag){return sizeof(obj);}templateint PbTypeFlagint FieldByteSize(double  obj,Int2TypePbTypeFlag TypeFlag){return  sizeof(obj);}templateint PbTypeFlagint FieldByteSize(bool  obj, Int2TypePbTypeFlag TypeFlag){return  this-VarintSize32(obj);}/private:int VarintSize32(unsigned  long value) {if (value  (1  7)) {return 1;}else if (value  (1  14)) {return 2;}else if (value  (1  21)) {return 3;}else if (value  (1  28)) {return 4;}else {return 5;}}int VarintSize64(unsigned long long value) {if (value  (1ull  35)) {if (value  (1ull  7)) {return 1;}else if (value  (1ull  14)) {return 2;}else if (value  (1ull  21)) {return 3;}else if (value  (1ull  28)) {return 4;}else {return 5;}}else {if (value  (1ull  42)) {return 6;}else if (value  (1ull  49)) {return 7;}else if (value  (1ull  56)) {return 8;}else if (value  (1ull  63)) {return 9;}else {return 10;}}}int ByteSize32(int32 obj, Int2TypeenPbTypeFlag_Default TypeFlag){if (obj  0){return VarintSize64(obj);}return VarintSize32(obj);}int ByteSize32(uint32 obj, Int2TypeenPbTypeFlag_Default TypeFlag){  return VarintSize32(obj);}int ByteSize32(int32 obj, Int2TypeenPbTypeFlag_Signed TypeFlag){return ByteSize32((int32)ZIGZAG32(obj), Int2TypeenPbTypeFlag_Default());}int ByteSize32(uint32 obj, Int2TypeenPbTypeFlag_Signed TypeFlag){return ByteSize32((uint32)ZIGZAG32(obj), Int2TypeenPbTypeFlag_Default());}int ByteSize32(int32 obj, Int2TypeenPbTypeFlag_Fixed TypeFlag){return sizeof(int32);}int ByteSize32(uint32 obj, Int2TypeenPbTypeFlag_Fixed TypeFlag){return sizeof(uint32);}int ByteSize64(int64 obj, Int2TypeenPbTypeFlag_Default TypeFlag){  return VarintSize64(obj);}int ByteSize64(uint64 obj, Int2TypeenPbTypeFlag_Default TypeFlag){return VarintSize64(obj);}int ByteSize64(int64 obj, Int2TypeenPbTypeFlag_Signed TypeFlag){return VarintSize64(ZIGZAG64(obj));}int ByteSize64(uint64 obj, Int2TypeenPbTypeFlag_Signed TypeFlag){return VarintSize64(ZIGZAG64(obj));}int ByteSize64(int64 obj, Int2TypeenPbTypeFlag_Fixed TypeFlag){return sizeof(int64);}int ByteSize64(uint64 obj, Int2TypeenPbTypeFlag_Fixed TypeFlag){return sizeof(uint64);}  }; //输出buffer templatesize_t static_size class OPbBuffer { public:OPbBuffer(){__Init();}explicit OPbBuffer(char * pData,size_t len){__Init();this-m_ptrBegin  this-m_ptrCur  pData;this-m_Size  len; }//预分配容量explicit OPbBuffer(size_t len){__Init();if (len  0){len  1024;}ResetCapacity(len);}~OPbBuffer(){__Init();}//复位void Reset(){m_bError  false;m_Size  0;m_ptrCur  m_ptrBegin  NULL;  }size_t GetStaticSize(){return static_size;}//返回从pos开始的内存const char * Buffer(size_t pos0) const{if (pos  m_Size){return nullptr;}return m_ptrBegin  pos;}char * CurrentBuffer() {  return m_ptrCur;}char * Skip(size_t len){char* pOld  m_ptrCur;m_ptrCur  len;return pOld;}//获得数据大小size_t Size() const {   return m_ptrCur - m_ptrBegin;}//当前容量size_t Capacity() const{  return m_Size;}//余下空间size_t Remain() const {  return m_Size - (m_ptrCur - m_ptrBegin);}  //注意内存所有权会转移std::vectorchar TakeData(){std::vectorchar vect;vect.insert(vect.begin(), m_ptrBegin, m_ptrCur);return std::move(vect);}std::string ToString(){if (m_ptrBegin  m_strData.data()){m_strData.resize(m_ptrCur - m_ptrBegin);return std::move(m_strData);}else{return std::move(std::string(m_ptrBegin, m_ptrCur));}}//扩展内存bool ResetCapacity(size_t len){  int old_size  this-Size();if (old_size  len){return true;}if (m_strData.data()  m_ptrBegin){m_strData.resize(len);}else{m_strData.resize(len);if (old_size  0){memcpy((char*)m_strData.data(), m_ptrBegin, old_size);}}this-m_Size  len;this-m_ptrBegin  (char*)m_strData.data();this-m_ptrCur  m_ptrBegin  old_size;return true;}//是否产生了错误bool Error() const {return m_bError;}//push二进制内存void Push(const void* pData, int len){memcpy(this-m_ptrCur, pData, len);    this-m_ptrCur  len;  }//写整数void WriteInt8(char value){  char * ptr  Skip(sizeof(value));*(char*)ptr  value;}void WriteInt16(short value){char * ptr  Skip(sizeof(value));*(short*)ptr  value;}void WriteInt(int value){  char * ptr  Skip(sizeof(value));*(int*)ptr  value;}void WriteInt64(long long value){  char * ptr  Skip(sizeof(value));*(long long *)ptr  value;}public:template typename type int Write(type  obj){int byte_size  obj.ByteSize();if (byte_size  static_size){this-m_ptrBegin  this-m_ptrCur  this-m_static_data;this-m_Size  static_size;Write(obj, Int2Typetype::Size());}return byte_size;}template typename type bool Write(type  obj, Int2Type0 ind){return true;}templateint size, typename type bool Write(type  obj, Int2Typesize ind){if (Write(obj, Int2Typesize - 1())  false){return false;}if (enPbROP_Optional  obj.getPbROP(ind)  memcmp(obj.getValue(ind),obj.getDefault(ind),sizeof(obj.getValue(ind)))0){return true;}Write(obj.getValue(ind), Int2Typesizeof(obj.getLabelObject(ind))(), obj.getPbTypeObject(ind), obj.getPbROP(ind), obj.GetFieldByteSize(ind));return this-Error()  false;}/templatetypename ValueType, int PbTypeFlag, unsigned int LabelSizevoid Write(ValueType  obj, Int2TypeLabelSize label , Int2TypePbTypeFlag TypeFlag , enPbROP pbRop  enPbROP_Required, int byteSize  0){WriteKey(Int2TypeenPBEncodeType_Length(), label,Int2TypeTLabelSizeLabelSize::Size());unsigned long size  obj.get_byteSize();if (size  0){size  obj.ByteSize();}WriteVarint32(size);this-m_ptrCur  obj.SerializePartialToArray(this-m_ptrCur, this-Remain());  }templateint PbTypeFlag, unsigned int LabelSizevoid Write(int  obj, Int2TypeLabelSize label , Int2TypePbTypeFlag TypeFlag , enPbROP pbRop  enPbROP_Required, int byteSize  0){Write32bit((long)obj, label, TypeFlag);}templateint PbTypeFlag, unsigned int LabelSizevoid Write(unsigned int  obj, Int2TypeLabelSize label, Int2TypePbTypeFlag TypeFlag , enPbROP pbRop  enPbROP_Required, int byteSize  0){Write32bit((unsigned long)obj, label, TypeFlag);}templateint PbTypeFlag, unsigned int LabelSizevoid Write(long long  obj, Int2TypeLabelSize label , Int2TypePbTypeFlag TypeFlag, enPbROP pbRop  enPbROP_Required, int byteSize  0){Write64bit(obj, label, TypeFlag);}templateint PbTypeFlag, unsigned int LabelSizevoid Write(unsigned long long  obj, Int2TypeLabelSize label , Int2TypePbTypeFlag TypeFlag , enPbROP pbRop  enPbROP_Required, int byteSize  0){Write64bit(obj, label, TypeFlag);}templateint PbTypeFlag, unsigned int LabelSizevoid Write(bool obj, Int2TypeLabelSize label , Int2TypePbTypeFlag TypeFlag, enPbROP pbRop  enPbROP_Required, int byteSize  0){long value  obj;Write32bit(value, label, TypeFlag);}templateint PbTypeFlag, unsigned int LabelSizevoid Write(float  obj, Int2TypeLabelSize label , Int2TypePbTypeFlag TypeFlag , enPbROP pbRop  enPbROP_Required, int byteSize  0){unsigned long value  *(unsigned long*)(void*)obj;Write32bit(value, label, Int2TypeenPbTypeFlag_Fixed());}templateint PbTypeFlag, unsigned int LabelSizevoid Write(double  obj, Int2TypeLabelSize label, Int2TypePbTypeFlag TypeFlag, enPbROP pbRop  enPbROP_Required, int byteSize  0){unsigned long long value  *(unsigned long long*)(void*)obj;Write64bit(value, label, Int2TypeenPbTypeFlag_Fixed());}templateint PbTypeFlag, unsigned int LabelSizevoid Write(std::string  obj, Int2TypeLabelSize label , Int2TypePbTypeFlag TypeFlag, enPbROP pbRop  enPbROP_Required, int byteSize  0){unsigned long  size  obj.length();WriteKey(Int2TypeenPBEncodeType_Length(), label, Int2TypeTLabelSizeLabelSize::Size());WriteVarint32(size);    Push(obj.data(), size);  }templatetypename type, int PbTypeFlag, unsigned int LabelSizevoid Write(std::vectortype  obj, Int2TypeLabelSize label, Int2TypePbTypeFlag TypeFlag , enPbROP pbRop  enPbROP_Required, int byteSize  0){int obj_len  obj.size();if (obj_len0){return ;}if (enPbROP_Packed  pbRop){WriteKey(Int2TypeenPBEncodeType_Length(), label, Int2TypeTLabelSizeLabelSize::Size());if (byteSize  0){OPBByteSize ByteSizeObj;ByteSizeObj.ByteSize(obj, Int2Type0(), TypeFlag, pbRop,byteSize);}WriteVarint32(byteSize);#ifdef USE_REPEATED_PACKED_EXTENDWriteVarint32(obj.size());#endiffor (int i  0; i  obj_len;i){Write(obj[i], Int2Type0(), TypeFlag);}   }else{for (int i  0; i  obj_len;i){ Write(obj[i], label, TypeFlag, pbRop);}}}private:templateunsigned int LabelSizevoid Write32bit(  long  obj, Int2TypeLabelSize label , Int2TypeenPbTypeFlag_Default){WriteKey(Int2TypeenPBEncodeType_Varint(), label, Int2TypeTLabelSizeLabelSize::Size());if (obj  0){WriteVarint32(obj);}else{WriteVarint64(obj);}   }templateunsigned int LabelSizevoid Write32bit( long  obj, Int2TypeLabelSize label, Int2TypeenPbTypeFlag_Signed){obj  ZIGZAG32(obj);WriteKey(Int2TypeenPBEncodeType_Varint(), label, Int2TypeTLabelSizeLabelSize::Size());if (obj  0){WriteVarint32(obj);}else{WriteVarint64(obj);}   }templateunsigned int LabelSizevoid Write32bit(  long  obj, Int2TypeLabelSize label , Int2TypeenPbTypeFlag_Fixed){WriteKey(Int2TypeenPBEncodeType_32bit(), label, Int2TypeTLabelSizeLabelSize::Size());WriteInt(obj);   }templateunsigned int LabelSizevoid Write32bit(unsigned  long  obj, Int2TypeLabelSize label, Int2TypeenPbTypeFlag_Default){WriteKey(Int2TypeenPBEncodeType_Varint(), label, Int2TypeTLabelSizeLabelSize::Size());WriteVarint32(obj);}templateunsigned int LabelSizevoid Write32bit(unsigned  long  obj, Int2TypeLabelSize label, Int2TypeenPbTypeFlag_Signed){obj  ZIGZAG32(obj);WriteKey(Int2TypeenPBEncodeType_Varint(), label, Int2TypeTLabelSizeLabelSize::Size());WriteVarint32(obj);}templateunsigned int LabelSizevoid Write32bit(unsigned  long  obj, Int2TypeLabelSize label , Int2TypeenPbTypeFlag_Fixed){WriteKey(Int2TypeenPBEncodeType_32bit(), label, Int2TypeTLabelSizeLabelSize::Size());WriteInt(obj);   }templateunsigned int LabelSizevoid Write64bit( long long  obj, Int2TypeLabelSize label , Int2TypeenPbTypeFlag_Default ){WriteKey(Int2TypeenPBEncodeType_Varint(), label, Int2TypeTLabelSizeLabelSize::Size());WriteVarint64(obj);}templateunsigned int LabelSizevoid Write64bit( long long  obj, Int2TypeLabelSize label , Int2TypeenPbTypeFlag_Signed ){obj  ZIGZAG64(obj);WriteKey(Int2TypeenPBEncodeType_Varint(), label, Int2TypeTLabelSizeLabelSize::Size());WriteVarint64(obj);}templateunsigned int LabelSizevoid Write64bit( long long  obj, Int2TypeLabelSize label , Int2TypeenPbTypeFlag_Fixed ){WriteKey(Int2TypeenPBEncodeType_64bit(), label, Int2TypeTLabelSizeLabelSize::Size());WriteInt64(obj);   }templateunsigned int LabelSizevoid Write64bit(unsigned long long  obj, Int2TypeLabelSize label, Int2TypeenPbTypeFlag_Default){WriteKey(Int2TypeenPBEncodeType_Varint(), label, Int2TypeTLabelSizeLabelSize::Size());WriteVarint64(obj);}templateunsigned int LabelSizevoid Write64bit(unsigned long long  obj, Int2TypeLabelSize label , Int2TypeenPbTypeFlag_Signed){obj  ZIGZAG64(obj);WriteKey(Int2TypeenPBEncodeType_Varint(), label, Int2TypeTLabelSizeLabelSize::Size());WriteVarint64(obj);}templateunsigned int LabelSizevoid Write64bit(unsigned long long  obj, Int2TypeLabelSize label , Int2TypeenPbTypeFlag_Fixed ){WriteKey(Int2TypeenPBEncodeType_64bit() , label,Int2TypeTLabelSizeLabelSize::Size());WriteInt64(obj);  }private:template int EncodeTYpevoid WriteKey(Int2TypeEncodeTYpe, Int2Type0 labelObject, Int2Type0){}template int EncodeTYpe, unsigned int LabelSize void WriteKey(Int2TypeEncodeTYpe , Int2TypeLabelSize labelObject,Int2Type1 ){     *((unsigned char*)m_ptrCur)  static_castunsigned char(LabelSize3| EncodeTYpe);}template int EncodeTYpe, unsigned int LabelSize void WriteKey(Int2TypeEncodeTYpe, Int2TypeLabelSize labelObject, Int2Type2){m_ptrCur[0]  static_castunsigned char((LabelSize  3) | 0x80 | EncodeTYpe);m_ptrCur[1]  static_castunsigned char(LabelSize  4);m_ptrCur  2;   }template int EncodeTYpe, unsigned int LabelSize ,int sizevoid WriteKey(Int2TypeEncodeTYpe, Int2TypeLabelSize labelObject, Int2Typesize){unsigned  long key  PB_KEY(EncodeTYpe, LabelSize);unsigned char * end  WriteVarint32FallbackToArrayInline(key, (unsigned char*)this-m_ptrCur);m_ptrCur  (end - (unsigned char*)m_ptrCur);}void WriteVarint32(unsigned  long value){if (value  (1  7)){*((unsigned char*)m_ptrCur)  static_castunsigned char(value);    }else if(this-Remain()4){unsigned char * end  WriteVarint32FallbackToArrayInline(value, (unsigned char*)this-m_ptrCur);m_ptrCur  (end - (unsigned char*)m_ptrCur);}else{unsigned char bytes[5];unsigned char * end  WriteVarint32FallbackToArrayInline(value, bytes);memcpy(m_ptrCur,bytes, end - bytes);m_ptrCur  (end - bytes);}}inline unsigned char* WriteVarint32FallbackToArrayInline(unsigned long value, unsigned char* target) {target[0]  static_castunsigned char(value | 0x80);if (value  (1  7)) {target[1]  static_castunsigned char((value  7) | 0x80);if (value  (1  14)) {target[2]  static_castunsigned char((value  14) | 0x80);if (value  (1  21)) {target[3]  static_castunsigned char((value  21) | 0x80);if (value  (1  28)) {target[4]  static_castunsigned char(value  28);return target  5;}else {target[3]  0x7F;return target  4;}}else {target[2]  0x7F;return target  3;}}else {target[1]  0x7F;return target  2;}}else {target[0]  0x7F;return target  1;}}void WriteVarint64(unsigned long long value){ if (value  (1  7)){*((unsigned char*)m_ptrCur)  static_castunsigned char(value);    }else if(this-Remain()9){unsigned char * end  WriteVarint64ToArrayInline(value, (unsigned char*)this-m_ptrCur);m_ptrCur  (end - (unsigned char*)m_ptrCur);} else{unsigned char bytes[10];unsigned char * end  WriteVarint64ToArrayInline(value, bytes);memcpy(m_ptrCur, bytes, end - bytes);m_ptrCur  (end - bytes);}}inline unsigned char * WriteVarint64ToArrayInline(unsigned long long value, unsigned char* target) {unsigned int part0  static_castunsigned int(value);unsigned int part1  static_castunsigned int(value  28);unsigned int part2  static_castunsigned int(value  56);int size;if (part2  0) {if (part1  0) {if (part0  (1  14)) {if (part0  (1  7)) {size  1; goto size1;}else {size  2; goto size2;}}else {if (part0  (1  21)) {size  3; goto size3;}else {size  4; goto size4;}}}else {if (part1  (1  14)) {if (part1  (1  7)) {size  5; goto size5;}else {size  6; goto size6;}}else {if (part1  (1  21)) {size  7; goto size7;}else {size  8; goto size8;}}}}else {if (part2  (1  7)) {size  9; goto size9;}else {size  10; goto size10;}}size10: target[9]  static_castunsigned char((part2  7) | 0x80);size9: target[8]  static_castunsigned char((part2) | 0x80);size8: target[7]  static_castunsigned char((part1  21) | 0x80);size7: target[6]  static_castunsigned char((part1  14) | 0x80);size6: target[5]  static_castunsigned char((part1  7) | 0x80);size5: target[4]  static_castunsigned char((part1) | 0x80);size4: target[3]  static_castunsigned char((part0  21) | 0x80);size3: target[2]  static_castunsigned char((part0  14) | 0x80);size2: target[1]  static_castunsigned char((part0  7) | 0x80);size1: target[0]  static_castunsigned char((part0) | 0x80);target[size - 1]  0x7F;return target  size;}private:OPbBuffer(const OPbBuffer Other)  delete;OPbBuffer  operator (const OPbBuffer)  delete; private://初始化void __Init(){m_Size  0;m_ptrCur  m_ptrBegin  NULL;m_bError  false; }private:char m_static_data[static_size];std::string m_strData;int m_Size;char* m_ptrCur;char* m_ptrBegin;bool           m_bError ;   //是否产生了错误}; //输入Buffer class IPbBuffer { public:templatetypename type  PBParseSinkbool Parse(type * pObj  NULL){if (this-Remain()  0){return false;}while (this-Remain()  0){enPBEncodeType EncodeType;unsigned int Label  0;if (ReadKey(EncodeType, Label)  false){m_bError  true;return false;}unsigned long long len  0;unsigned  long Value32  0;const char * pData  NULL;switch (EncodeType){case enPBEncodeType_Varint:if (ReadVarint(len)  false){m_bError  true;return false;}break;case enPBEncodeType_64bit:if (ReadFixed64(len)  false){return false;}break;case enPBEncodeType_Length:if (ReadVarint(len)  false){m_bError  true;return false;}if (len  this-Remain()){m_bError  true;return false;}pData  (const int8*)this-CurrentBuffer();this-Skip(len);break;case enPBEncodeType_StartGroup:return false;break;case enPBEncodeType_EndGroup:return false;break;case enPBEncodeType_32bit:if (ReadFixed32(Value32)  false){return false;}len  Value32;break;default:break;}if (pObj-ParseFromBuffer(this, Label, EncodeType, pData, len)  false){return false;}}return this-Error()  false;}IPbBuffer(const char* pData, int len){this-m_pCurr  m_ptrBegin  (const uint8*)pData;this-m_pEnd  m_ptrBegin  len;m_bError  false;}IPbBuffer(const std::vectorchar  vectData){this-m_pCurr  m_ptrBegin  (const uint8*)vectData.data();this-m_pEnd  m_ptrBegin  vectData.size();m_bError  false;}templatesize_t sizeIPbBuffer(const  OPbBuffersize  ob){this-m_pCurr  m_ptrBegin  (const uint8*)ob.Buffer();this-m_pEnd  m_ptrBegin  ob.Size();m_bError  false;}~IPbBuffer(){  m_bError  false;}//总长度int Capacity() { return this-m_pEnd - m_ptrBegin; }//余下未读数据int Remain() { return this-m_pEnd - m_pCurr; }//已读数据int Size() const { return this-m_pCurr - m_ptrBegin; }//返回从len字节开始的内存const uint8 * Buffer(int len  0){if (lenCapacity()) return NULL;return m_ptrBegin  len;}//返回未读bufferconst uint8 * CurrentBuffer(){return m_pCurr;}//跳过len字节返回移动前的地址const uint8 * Skip(int len){  const uint8 * ptr  m_pCurr;m_pCurr  len;return ptr;}//是否产生了错误bool Error() { return m_bError; }bool ReadKey(enPBEncodeType  EncodeTYpe, unsigned int  label){  unsigned long long key  0;if (ReadVarint(key)  false){return false;}unsigned int  cc  key;EncodeTYpe  (enPBEncodeType)PB_ENCODETYPE(cc);label  PB_LABEL(cc);return (this-Error()  false);}bool ReadFixed32(unsigned long  value){if (this-Remain()   sizeof(unsigned long)){m_bError  true;return false;}value  *(const unsigned long*)this-CurrentBuffer();this-Skip(sizeof(unsigned long));return this-Error()  false;}bool ReadFixed64(unsigned long long  value){if (this-Remain()  sizeof(unsigned long long)){m_bError  true;return false;}value  *(const unsigned long long*)this-CurrentBuffer();this-Skip(sizeof(unsigned long long));return this-Error()  false;}int SkipVarint(){const uint8 * ptr  m_pCurr;while (m_pCurr  this-m_pEnd  *m_pCurr  0x80){NULL;}return m_pCurr - ptr;}bool ReadVarint(unsigned long long  value){if (!(m_pCurr  this-m_pEnd)){return false;}if ((value  *m_pCurr)  0x80){return true;}else{value  (unsigned char)value  0x7f;}int i  1;unsigned char cc;this-m_bError  true;while (m_pCurr  this-m_pEnd  i10){cc  *m_pCurr;value  ((unsigned long long)(cc  0x7f))  (i * 7);i;if (!(cc  0x80)){m_bError  false;return true;}}return (m_bError  false);}//读取templatetypename typebool Read(type  value, enPBEncodeType EncodeType, const char* pData, unsigned long long  len, unsigned  int label  0, enPbTypeFlag TypeFlag  enPbTypeFlag_Default, enPbROP pbRop  enPbROP_Required){IPB ipb(pData, len);return ipb.Parse(value);}bool Read(int  value, enPBEncodeType EncodeType, const char* pData, unsigned long long  len, unsigned  int label  0, enPbTypeFlag TypeFlag  enPbTypeFlag_Default, enPbROP pbRop  enPbROP_Required){return ReadNumber(value, len, TypeFlag);}bool Read(unsigned int  value, enPBEncodeType EncodeType, const char* pData, unsigned long long  len, unsigned  int label  0, enPbTypeFlag TypeFlag  enPbTypeFlag_Default, enPbROP pbRop  enPbROP_Required){return ReadNumber(value, len, TypeFlag);}bool Read(long long  value, enPBEncodeType EncodeType, const char* pData, unsigned long long  len, unsigned  int label  0, enPbTypeFlag TypeFlag  enPbTypeFlag_Default, enPbROP pbRop  enPbROP_Required){return ReadNumber(value, len, TypeFlag);}bool Read(unsigned long long  value, enPBEncodeType EncodeType, const char* pData, unsigned long long  len, unsigned  int label  0, enPbTypeFlag TypeFlag  enPbTypeFlag_Default, enPbROP pbRop  enPbROP_Required){return ReadNumber(value, len, TypeFlag);}  bool Read(bool  value, enPBEncodeType EncodeType, const char* pData, unsigned long long  len, unsigned  int label  0, enPbTypeFlag TypeFlag  enPbTypeFlag_Default, enPbROP pbRop  enPbROP_Required){return ReadNumber(value, len, TypeFlag);}  bool Read(float  value, enPBEncodeType EncodeType, const char* pData, unsigned long long  len, unsigned int label  0, enPbTypeFlag TypeFlag  enPbTypeFlag_Default, enPbROP pbRop  enPbROP_Required){unsigned  long long obj  0;if (ReadNumber(obj, len, enPbTypeFlag_Fixed)  false){return false;}unsigned long  l  obj;value  *(float*)(void*)l;return true;}bool Read(double  value, enPBEncodeType EncodeType, const char* pData, unsigned long long  len, unsigned int label  0, enPbTypeFlag TypeFlag  enPbTypeFlag_Default, enPbROP pbRop  enPbROP_Required){unsigned  long long obj  0;if (ReadNumber(obj, len, enPbTypeFlag_Fixed)  false){return false;}unsigned long long  l  obj;value  *(double*)(void*)l;return true;}bool Read(std::string  value, enPBEncodeType EncodeType, const char* pData, unsigned long long  len, unsigned int label  0, enPbTypeFlag TypeFlag  enPbTypeFlag_Default, enPbROP pbRop  enPbROP_Required){if (pData ! NULL || len  0){value.assign(pData, pData  len);}return true;}templatetypename typebool Read(std::vectortype  value, enPBEncodeType EncodeType, const char* pData, unsigned long long  len, unsigned int label  0, enPbTypeFlag TypeFlag  enPbTypeFlag_Default, enPbROP pbRop  enPbROP_Required){if (pbRop  enPbROP_Packed){IPB ipb(pData, len); #ifdef USE_REPEATED_PACKED_EXTENDunsigned long long elem_size;ipb.ReadVarint(elem_size);int old_size  value.size();value.resize(elem_size old_size);int total_size  old_size  elem_size;unsigned long long obj_len  0;if (THaveLeghtFieldtype::Value){for (int i  old_size; i  total_size; i){ipb.ReadVarint(obj_len);int remian  ipb.Remain();if (remian  obj_len){return false;}if (ipb.Read(value[i], EncodeType, (const int8*)ipb.CurrentBuffer(), obj_len, 0, TypeFlag, pbRop)false){return false;}ipb.Skip(obj_len);}}else{if (TypeFlag  enPbTypeFlag_Fixed){if (sizeof(type)  sizeof(long long)){unsigned long long temp  0;for (int i  old_size; i  total_size; i){if (ipb.ReadFixed64(temp)false || ipb.Read(value[i], EncodeType, NULL, temp, label, TypeFlag, pbRop)  false){return false;}}}else{      unsigned long temp  0;for (int i  old_size; i  total_size; i){if (ipb.ReadFixed32(temp)){unsigned long long ll  temp;if (ipb.Read(value[i], EncodeType, NULL, ll, label, TypeFlag, pbRop)  false){return false;}        }else{return false;}}}}else{for (int i  old_size; i  total_size; i){            if (ipb.ReadVarint(obj_len)false || ipb.Read(value[i], EncodeType, (const int8*)ipb.CurrentBuffer(), obj_len, 0, TypeFlag, pbRop)false){return false;}}}} #elseif (TypeFlag  enPbTypeFlag_Fixed){if (sizeof(type)  sizeof(long long)){value.reserve(len / sizeof(long long));type obj;unsigned long long temp  0;while (ipb.ReadFixed64(temp)){if (ipb.Read(obj, EncodeType, NULL, temp, label, TypeFlag, pbRop)  false){return false;}}value.push_back(obj);}else{value.reserve(len / sizeof(long));type obj;unsigned long temp  0;while (ipb.ReadFixed32(temp)){unsigned long long ll  temp;if (ipb.Read(obj, EncodeType, NULL, ll, label, TypeFlag, pbRop)  false){return false;}value.push_back(obj);}}}else{//先计算长度int count  0;while (ipb.SkipVarint()){count;}value.reserve(count);//复位ipb.Skip(0 - (len - ipb.Remain()));unsigned long long temp  0;while (ipb.ReadVarint(temp)){type obj;if (ipb.Read(obj, EncodeType, NULL, temp, label, TypeFlag, pbRop)  false){return false;}value.push_back(obj);}} #endif    }   else{  type obj;if (this-Read(obj, EncodeType,pData, len, TypeFlag)){int  key_len  0;bool bEnd;int obj_size  GetCountWithLabel(label, EncodeType, key_len, bEnd);value.reserve(value.size()  bEnd? obj_size : obj_size*2  1);value.push_back(obj);unsigned  long Value32  0;switch (EncodeType){case enPBEncodeType_Varint:while (obj_size--  0){this-Skip(key_len);if (ReadVarint(len)  false){      return false;}type obj;if (this-Read(obj, EncodeType, pData, len, TypeFlag)){value.push_back(obj);       }      }break;case enPBEncodeType_64bit:while (obj_size--  0){this-Skip(key_len);if (ReadFixed64(len)  false){m_bError  true;return false;}type obj;if (this-Read(obj, EncodeType, pData, len, TypeFlag)){value.push_back(obj);       }      }break;case enPBEncodeType_32bit:while (obj_size--  0){this-Skip(key_len);if (ReadFixed32(Value32)  false){m_bError  true;return false;}len  Value32;type obj;if (this-Read(obj, EncodeType, pData, len, TypeFlag)){value.push_back(obj);}      }break;case enPBEncodeType_Length:while (obj_size--  0){this-Skip(key_len);if (ReadVarint(len)  false){m_bError  true;return false;}if (len  this-Remain()){m_bError  true;return false;}pData  (const int8*)this-CurrentBuffer();this-Skip(len);type obj;if (this-Read(obj, EncodeType, pData, len, TypeFlag)){value.push_back(obj);       }      }break;}    }else{return false;}}return true;}/* templatetypename type bool Read(std::vectortype  value, enPBEncodeType EncodeType, const char* pData, unsigned long long  len, unsigned int label  0, enPbTypeFlag TypeFlag  enPbTypeFlag_Default, enPbROP pbRop  enPbROP_Required) {if (pbRop  enPbROP_Packed){IPB ipb(pData, len);type obj;if (TypeFlag  enPbTypeFlag_Fixed){if (sizeof(type)  sizeof(long long)){value.reserve(len / sizeof(long long));unsigned long long temp  0;while (ipb.ReadFixed64(temp)){if (ipb.Read(obj, EncodeType, NULL, temp, label, TypeFlag, pbRop)  false){return false;}}value.push_back(obj);}else{value.reserve(len / sizeof(long));unsigned long temp  0;while (ipb.ReadFixed32(temp)){unsigned long long ll  temp;if (ipb.Read(obj, EncodeType, NULL, ll, label, TypeFlag, pbRop)  false){return false;}value.push_back(obj);}}}else{//先计算长度int count  len/2;value.reserve(count);//复位ipb.Skip(0 - (len - ipb.Remain()));unsigned long long temp  0;while (ipb.ReadVarint(temp)){if (ipb.Read(obj, EncodeType, NULL, temp, label, TypeFlag, pbRop)  false){return false;}value.push_back(obj);}}}else{type obj;if (this-Read(obj, EncodeType, pData, len, TypeFlag)){value.push_back(obj);unsigned int LabelNext  0;unsigned  long Value32  0;const uint8 * pCurr  this-CurrentBuffer();switch (EncodeType){case enPBEncodeType_Varint:while (this-ReadKey(EncodeType, LabelNext)){if (LabelNext ! label){this-Skip(pCurr - this-CurrentBuffer());return true;}if (ReadVarint(len)  false){m_bError  true;return false;}type obj;if (this-Read(obj, EncodeType, pData, len, TypeFlag)){if (value.capacity()  value.size()){value.reserve(value.size() * 2);}value.push_back(obj);pCurr  this-CurrentBuffer();}}break;case enPBEncodeType_64bit:while (this-ReadKey(EncodeType, LabelNext)){if (LabelNext ! label){this-Skip(pCurr - this-CurrentBuffer());return true;}if (ReadFixed64(len)  false){m_bError  true;return false;}type obj;if (this-Read(obj, EncodeType, pData, len, TypeFlag)){if (value.capacity()  value.size()){value.reserve(value.size() * 2);}value.push_back(obj);pCurr  this-CurrentBuffer();}}break;case enPBEncodeType_32bit:while (this-ReadKey(EncodeType, LabelNext)){if (LabelNext ! label){this-Skip(pCurr - this-CurrentBuffer());return true;}if (ReadFixed32(Value32)  false){m_bError  true;return false;}len  Value32;type obj;if (this-Read(obj, EncodeType, pData, len, TypeFlag)){if (value.capacity()  value.size()){value.reserve(value.size() * 2);}value.push_back(obj);pCurr  this-CurrentBuffer();}}break;case enPBEncodeType_Length:while (this-ReadKey(EncodeType, LabelNext)){if (LabelNext ! label){this-Skip(pCurr - this-CurrentBuffer());return true;}if (ReadVarint(len)  false){m_bError  true;return false;}if (len  this-Remain()){m_bError  true;return false;}pData  (const int8*)this-CurrentBuffer();this-Skip(len);type obj;if (this-Read(obj, EncodeType, pData, len, TypeFlag)){if (value.capacity()  value.size()){value.reserve(value.size() * 2);}value.push_back(obj);pCurr  this-CurrentBuffer();}}break;}}else{return false;}}return true; } */int GetCountWithLabel(unsigned int label,enPBEncodeType EncodeType,int  key_len,bool  bEnd ){const uint8 * pBegin  this-CurrentBuffer();int count  0;unsigned long long len  0;unsigned int LabelNext  0;if (this-Remain()0 || ReadKey(EncodeType, LabelNext)  false || LabelNext ! label){this-Skip(pBegin - this-CurrentBuffer());return 0;}bEnd  false;key_len  this-CurrentBuffer() - pBegin;switch (EncodeType){case enPBEncodeType_Varint:do{SkipVarint();count;if (this-Remain()  key_len || memcmp(pBegin, this-CurrentBuffer(), key_len)){bEnd  true;break;}this-Skip(key_len);} while (count100);break;case enPBEncodeType_64bit:do{this-Skip(sizeof(long long));count;    if (this-Remain()  key_len || memcmp(pBegin, this-CurrentBuffer(), key_len)){bEnd  true;break;}this-Skip(key_len);} while (count100);break;case enPBEncodeType_32bit:do{this-Skip(sizeof(long));count;    if (this-Remain()  key_len || memcmp(pBegin, this-CurrentBuffer(), key_len)){bEnd  true;break;}this-Skip(key_len);} while (count100);break;case enPBEncodeType_Length:do{if (ReadVarint(len)  false){    break;}this-Skip(len);count;       if (this-Remain()  key_len || memcmp(pBegin, this-CurrentBuffer(), key_len)){bEnd  true;break;}this-Skip(key_len);} while (count100);break;}this-Skip(pBegin - this-CurrentBuffer());return count;}templateint index, typename typebool ReadField(type * pObj, int label, enPBEncodeType EncodeType, const char* pData, unsigned long long  len, Int2Typeindex ind){if (sizeof(pObj-getLabelObject(ind))  label){return Read(pObj-getValue(ind), EncodeType,pData, len, label, pObj-getPbTypeFlag(ind), pObj-getPbROP(ind));}return ReadFieldindex - 1, type(pObj, label, EncodeType, pData, len, Int2Typeindex - 1());;}templateint index, typename typebool ReadField(type * pObj, int label, enPBEncodeType EncodeType, const char* pData, unsigned long long  len, Int2Type0 ind){return true;}private:templatetypename typebool ReadNumber(type  obj, unsigned long long  len, enPbTypeFlag TypeFlag  enPbTypeFlag_Default){unsigned long long value  len;if (TypeFlag  enPbTypeFlag_Signed){value  UNZIGZAG64(len);}obj  value;return true;} private:const uint8 * m_ptrBegin;  //开始数据const uint8 * m_pCurr;  //当前读数据const uint8 * m_pEnd;  //结束数据 bool   m_bError;   //是否产生了错误  }; typedef OPbBuffer1 OPB; typedef IPbBuffer  IPB; #endif 转载于:https://my.oschina.net/u/2504104/blog/524370
http://wiki.neutronadmin.com/news/194357/

相关文章:

  • 网站安全狗卸载卸载不掉平台网站怎么优化
  • 网站的用户体验主要有那些类型做关于卖宠物饲料网站有什么名字吗
  • 礼服购物车网站模板开发公司产品部课件
  • 广联达工程造价软件官网wordpress 优化插件
  • 网站建设公司小程序开发外包加工官网
  • 北海建设厅网站react可以做门户网站么
  • 网站建设进展报告公司网站开发费用大概多少
  • 做网站贵不贵网易那个网站可以做字幕
  • 怎么制作钓鱼网站昆明专业网站建设的公司
  • nodejs 做网站怎么识别网站开发语言
  • 上海专业高端网站建设服务公司中国教学网站
  • 网站惩罚查询建设工程消防设计备案哪个网站
  • 太原做手机网站网站开发培训什么
  • 用网站模板做新网站企业网站的建设费用
  • 网站开发常见模块山东新汇建设集团有限公司网站
  • 上海企业网站优化番禺建设网站策划
  • 任丘住房建设局网站诸城哪有做公司网站和的
  • 南京模板建站哪家好七星彩网投网站建设
  • 网站界面设计用户体验关于网站建设与发布的书籍
  • 响应式企业网站后台管理系统开发一款软件
  • 做网站需要准备资料微网站分享功能
  • 百度蜘蛛开发网站访问国外网站用什么dns
  • 网站备案号取消原因软件外包公司介绍
  • 如何做网站免费推广石碣镇网站建设公司
  • 深圳坪山网站建设wordpress 提权
  • 南康网站建设公司模板建站按年收费
  • 服装行业网站建设如何做阿里巴巴的网站
  • 关于网站建设征求意见深圳个性化网站建设公司
  • 山东住房建设厅官网站网络推广方式的研究
  • 先做网站还是app个人网站做打赏流程