use "enum class" in ByteOrderMask

This commit is contained in:
2020-09-11 18:51:36 +08:00
parent c140850e37
commit 7c69cfff60
5 changed files with 50 additions and 47 deletions

View File

@@ -2,6 +2,7 @@
#define HGL_ENDIAN_INCLUDE #define HGL_ENDIAN_INCLUDE
#include<hgl/platform/Platform.h> // 平台定义 #include<hgl/platform/Platform.h> // 平台定义
#include<hgl/TypeFunc.h>
namespace hgl namespace hgl
{ {
namespace endian namespace endian
@@ -47,15 +48,16 @@ namespace hgl
/** /**
* 字节序类型枚举 * 字节序类型枚举
*/ */
enum ByteOrderMask enum class ByteOrderMask
{ {
bomNone=0, NONE=0,
bomUTF8, UTF8,
bomUTF16LE, UTF16LE,
bomUTF16BE, UTF16BE,
bomUTF32LE, UTF32LE,
bomUTF32BE, UTF32BE,
bomEnd
ENUM_CLASS_RANGE(UTF8,UTF32BE)
}; };
constexpr uint CharSetNameLength=32; ///<字符集名称长度 constexpr uint CharSetNameLength=32; ///<字符集名称长度
@@ -95,25 +97,26 @@ namespace hgl
/** /**
* 字节序文件头定义 * 字节序文件头定义
*/ */
constexpr BOMFileHeader BOMData[bomEnd]= constexpr BOMFileHeader BOMData[size_t(ByteOrderMask::RANGE_SIZE)]=
{ {
{0,{} ,bomNone, nullptr ,ccpNone }, {3,{0xEF,0xBB,0xBF} ,ByteOrderMask::UTF8, &utf8_charset ,ccpUTF8 },
{3,{0xEF,0xBB,0xBF} ,bomUTF8, &utf8_charset ,ccpUTF8 }, {2,{0xFF,0xFE} ,ByteOrderMask::UTF16LE,&utf16le_charset ,ccpUTF16LE },
{2,{0xFF,0xFE} ,bomUTF16LE,&utf16le_charset ,ccpUTF16LE }, {2,{0xFE,0xFF} ,ByteOrderMask::UTF16BE,&utf16be_charset ,ccpUTF16BE },
{2,{0xFE,0xFF} ,bomUTF16BE,&utf16be_charset ,ccpUTF16BE }, {4,{0xFF,0xFE,0x00,0x00},ByteOrderMask::UTF32LE,&utf32le_charset ,ccpUTF32LE },
{4,{0xFF,0xFE,0x00,0x00},bomUTF32LE,&utf32le_charset ,ccpUTF32LE }, {4,{0x00,0x00,0xFE,0xFF},ByteOrderMask::UTF32BE,&utf32be_charset ,ccpUTF32BE }
{4,{0x00,0x00,0xFE,0xFF},bomUTF32BE,&utf32be_charset ,ccpUTF32BE }
}; };
inline ByteOrderMask CheckBOM(const void *data) inline ByteOrderMask CheckBOM(const void *data)
{ {
for(uint i=bomNone+1;i<bomEnd;i++) const BOMFileHeader *bom=BOMData;
for(int i=int(ByteOrderMask::BEGIN_RANGE);i<int(ByteOrderMask::END_RANGE);i++)
{ {
if(memcmp(data,BOMData[i].data,BOMData[i].size)==0) if(memcmp(data,bom->data,bom->size)==0)
return (ByteOrderMask)i; return (ByteOrderMask)i;
} }
return bomNone; return ByteOrderMask::NONE;
} }
template<typename T> template<typename T>

View File

@@ -50,7 +50,7 @@ namespace hgl
{ {
if(!out)return(false); if(!out)return(false);
const BOMFileHeader *bom_item=BOMData+bom; const BOMFileHeader *bom_item=BOMData+int(bom)-int(ByteOrderMask::BEGIN_RANGE);
return(out->Write(bom_item->data,bom_item->size)==bom_item->size); return(out->Write(bom_item->data,bom_item->size)==bom_item->size);
} }
@@ -59,7 +59,7 @@ namespace hgl
virtual bool WriteChars(const u16char *,int64)=0; ///<写入一个字符串 virtual bool WriteChars(const u16char *,int64)=0; ///<写入一个字符串
template<typename N> template<typename N>
bool WriteString(const String<N> &str) ///<写入一个字符串 bool WriteString(const String<N> &str) ///<写入一个字符串
{ {
return WriteChars(str.c_str(),str.Length()); return WriteChars(str.c_str(),str.Length());
} }
@@ -166,9 +166,9 @@ namespace hgl
bool WriteChars(const u16char *,int64); ///<写入一个字符串 bool WriteChars(const u16char *,int64); ///<写入一个字符串
};//template<ByteOrderMask BOM> class EndianTextOutputStream };//template<ByteOrderMask BOM> class EndianTextOutputStream
typedef EndianTextOutputStream<bomUTF8 > UTF8TextOutputStream; typedef EndianTextOutputStream<ByteOrderMask::UTF8 > UTF8TextOutputStream;
typedef EndianTextOutputStream<bomUTF16LE> UTF16LETextOutputStream; typedef EndianTextOutputStream<ByteOrderMask::UTF16LE> UTF16LETextOutputStream;
typedef EndianTextOutputStream<bomUTF16BE> UTF16BETextOutputStream; typedef EndianTextOutputStream<ByteOrderMask::UTF16BE> UTF16BETextOutputStream;
template<typename T> TextOutputStream *CreateTextOutputStream(OutputStream *os); template<typename T> TextOutputStream *CreateTextOutputStream(OutputStream *os);
}//namespace io }//namespace io

View File

@@ -628,7 +628,7 @@ namespace hgl
bool ReadString(io::DataInputStream *dis,T &str); bool ReadString(io::DataInputStream *dis,T &str);
}; };
template<typename T> struct ReadStringFromDIS<T,bomUTF8> template<typename T> struct ReadStringFromDIS<T,ByteOrderMask::UTF8>
{ {
bool ReadString(io::DataInputStream *dis,T &str) bool ReadString(io::DataInputStream *dis,T &str)
{ {
@@ -636,7 +636,7 @@ namespace hgl
} }
}; };
template<typename T> struct ReadStringFromDIS<T,bomUTF16LE> template<typename T> struct ReadStringFromDIS<T,ByteOrderMask::UTF16LE>
{ {
bool ReadString(io::DataInputStream *dis,T &str) bool ReadString(io::DataInputStream *dis,T &str)
{ {
@@ -644,7 +644,7 @@ namespace hgl
} }
}; };
template<typename T> struct ReadStringFromDIS<T,bomUTF16BE> template<typename T> struct ReadStringFromDIS<T,ByteOrderMask::UTF16BE>
{ {
bool ReadString(io::DataInputStream *dis,T &str) bool ReadString(io::DataInputStream *dis,T &str)
{ {
@@ -684,9 +684,9 @@ namespace hgl
return(result); return(result);
}//int LoadStringList }//int LoadStringList
inline int LoadUTF8StringList (UTF8StringList & sl,io::DataInputStream *dis){return LoadStringList<u8char, bomUTF8 >(sl,dis);} inline int LoadUTF8StringList (UTF8StringList & sl,io::DataInputStream *dis){return LoadStringList<u8char, ByteOrderMask::UTF8 >(sl,dis);}
inline int LoadUTF16LEStringList (UTF16StringList & sl,io::DataInputStream *dis){return LoadStringList<u16char, bomUTF16LE >(sl,dis);} inline int LoadUTF16LEStringList (UTF16StringList & sl,io::DataInputStream *dis){return LoadStringList<u16char, ByteOrderMask::UTF16LE >(sl,dis);}
inline int LoadUTF16BEStringList (UTF16StringList & sl,io::DataInputStream *dis){return LoadStringList<u16char, bomUTF16BE >(sl,dis);} inline int LoadUTF16BEStringList (UTF16StringList & sl,io::DataInputStream *dis){return LoadStringList<u16char, ByteOrderMask::UTF16BE >(sl,dis);}
int LoadStringFromText(UTF8String &str,const void *data,const int size,const CharSet &default_charset=UTF8CharSet); ///<从文件加载一个文本块到UTF8StringList int LoadStringFromText(UTF8String &str,const void *data,const int size,const CharSet &default_charset=UTF8CharSet); ///<从文件加载一个文本块到UTF8StringList
int LoadStringFromText(UTF16String &str,const void *data,const int size,const CharSet &default_charset=UTF8CharSet); ///<从文件加载一个文本块到UTF16StringList int LoadStringFromText(UTF16String &str,const void *data,const int size,const CharSet &default_charset=UTF8CharSet); ///<从文件加载一个文本块到UTF16StringList
@@ -703,7 +703,7 @@ namespace hgl
bool WriteString(io::DataOutputStream *dos,const T &str); bool WriteString(io::DataOutputStream *dos,const T &str);
}; };
template<typename T> struct WriteStringToDOS<T,bomUTF8> template<typename T> struct WriteStringToDOS<T,ByteOrderMask::UTF8>
{ {
bool WriteString(io::DataOutputStream *dos,const T &str) bool WriteString(io::DataOutputStream *dos,const T &str)
{ {
@@ -711,7 +711,7 @@ namespace hgl
} }
}; };
template<typename T> struct WriteStringToDOS<T,bomUTF16LE> template<typename T> struct WriteStringToDOS<T,ByteOrderMask::UTF16LE>
{ {
bool WriteString(io::DataOutputStream *dos,const T &str) bool WriteString(io::DataOutputStream *dos,const T &str)
{ {
@@ -719,7 +719,7 @@ namespace hgl
} }
}; };
template<typename T> struct WriteStringToDOS<T,bomUTF16BE> template<typename T> struct WriteStringToDOS<T,ByteOrderMask::UTF16BE>
{ {
bool WriteString(io::DataOutputStream *dos,const T &str) bool WriteString(io::DataOutputStream *dos,const T &str)
{ {
@@ -750,17 +750,17 @@ namespace hgl
template<typename T> int SaveUTF8StringList(io::DataOutputStream *dos,const StringList<T> &sl) template<typename T> int SaveUTF8StringList(io::DataOutputStream *dos,const StringList<T> &sl)
{ {
return WriteStringList<T,bomUTF8>(dos,sl); return WriteStringList<T,ByteOrderMask::UTF8>(dos,sl);
} }
template<typename T> int SaveUTF16LEStringList(io::DataOutputStream *dos,const StringList<T> &sl) template<typename T> int SaveUTF16LEStringList(io::DataOutputStream *dos,const StringList<T> &sl)
{ {
return WriteStringList<T,bomUTF16LE>(dos,sl); return WriteStringList<T,ByteOrderMask::UTF16LE>(dos,sl);
} }
template<typename T> int SaveUTF16BEStringList(io::DataOutputStream *dos,const StringList<T> &sl) template<typename T> int SaveUTF16BEStringList(io::DataOutputStream *dos,const StringList<T> &sl)
{ {
return WriteStringList<T,bomUTF16BE>(dos,sl); return WriteStringList<T,ByteOrderMask::UTF16BE>(dos,sl);
} }
}//namespace hgl }//namespace hgl
#endif//HGL_STRINGLIST_INCLUDE #endif//HGL_STRINGLIST_INCLUDE

View File

@@ -4,9 +4,9 @@ namespace hgl
{ {
namespace io namespace io
{ {
template<> EndianTextOutputStream<bomUTF8>::EndianTextOutputStream(OutputStream *os):TextOutputStream(bomUTF8,new DirectDataOutputStream(os)){} template<> EndianTextOutputStream<ByteOrderMask::UTF8>::EndianTextOutputStream(OutputStream *os):TextOutputStream(ByteOrderMask::UTF8,new DirectDataOutputStream(os)){}
template<> EndianTextOutputStream<bomUTF16LE>::EndianTextOutputStream(OutputStream *os):TextOutputStream(bomUTF16LE,new LEDataOutputStream(os)){} template<> EndianTextOutputStream<ByteOrderMask::UTF16LE>::EndianTextOutputStream(OutputStream *os):TextOutputStream(ByteOrderMask::UTF16LE,new LEDataOutputStream(os)){}
template<> EndianTextOutputStream<bomUTF16BE>::EndianTextOutputStream(OutputStream *os):TextOutputStream(bomUTF16BE,new BEDataOutputStream(os)){} template<> EndianTextOutputStream<ByteOrderMask::UTF16BE>::EndianTextOutputStream(OutputStream *os):TextOutputStream(ByteOrderMask::UTF16BE,new BEDataOutputStream(os)){}
template<> TextOutputStream *CreateTextOutputStream<u8char>(OutputStream *os){return(new UTF8TextOutputStream(os));} template<> TextOutputStream *CreateTextOutputStream<u8char>(OutputStream *os){return(new UTF8TextOutputStream(os));}
template<> TextOutputStream *CreateTextOutputStream<wchar_t>(OutputStream *os){return(new UTF16LETextOutputStream(os));} template<> TextOutputStream *CreateTextOutputStream<wchar_t>(OutputStream *os){return(new UTF16LETextOutputStream(os));}
@@ -14,32 +14,32 @@ namespace hgl
namespace io //WriteChars函数 namespace io //WriteChars函数
{ {
template<> bool EndianTextOutputStream<bomUTF8>::WriteChars(const u8char *str,int64 size) template<> bool EndianTextOutputStream<ByteOrderMask::UTF8>::WriteChars(const u8char *str,int64 size)
{ {
return out?out->WriteUTF8Chars(str,size):false; return out?out->WriteUTF8Chars(str,size):false;
} }
template<> bool EndianTextOutputStream<bomUTF8>::WriteChars(const u16char *str,int64 size) template<> bool EndianTextOutputStream<ByteOrderMask::UTF8>::WriteChars(const u16char *str,int64 size)
{ {
return out?out->WriteUTF8Chars(str,size):false; return out?out->WriteUTF8Chars(str,size):false;
} }
template<> bool EndianTextOutputStream<bomUTF16LE>::WriteChars(const u8char *str,int64 size) template<> bool EndianTextOutputStream<ByteOrderMask::UTF16LE>::WriteChars(const u8char *str,int64 size)
{ {
return out?out->WriteUTF16LEChars(str,size):false; return out?out->WriteUTF16LEChars(str,size):false;
} }
template<> bool EndianTextOutputStream<bomUTF16LE>::WriteChars(const u16char *str,int64 size) template<> bool EndianTextOutputStream<ByteOrderMask::UTF16LE>::WriteChars(const u16char *str,int64 size)
{ {
return out?out->WriteUTF16LEChars(str,size):false; return out?out->WriteUTF16LEChars(str,size):false;
} }
template<> bool EndianTextOutputStream<bomUTF16BE>::WriteChars(const u8char *str,int64 size) template<> bool EndianTextOutputStream<ByteOrderMask::UTF16BE>::WriteChars(const u8char *str,int64 size)
{ {
return out?out->WriteUTF16BEChars(str,size):false; return out?out->WriteUTF16BEChars(str,size):false;
} }
template<> bool EndianTextOutputStream<bomUTF16BE>::WriteChars(const u16char *str,int64 size) template<> bool EndianTextOutputStream<ByteOrderMask::UTF16BE>::WriteChars(const u16char *str,int64 size)
{ {
return out?out->WriteUTF16BEChars(str,size):false; return out?out->WriteUTF16BEChars(str,size):false;
} }

View File

@@ -234,9 +234,9 @@ namespace hgl
{ {
if(!input)return(nullptr); if(!input)return(nullptr);
const BOMFileHeader *bfh=BOMData+bomUTF8; const BOMFileHeader *bfh=BOMData+(uint)ByteOrderMask::UTF8;
for(uint i=bomUTF8;i<bomEnd;i++) for(uint i=(uint)ByteOrderMask::BEGIN_RANGE+1;i<(uint)ByteOrderMask::END_RANGE;i++)
{ {
if(memcmp(input,bfh->data,bfh->size)==0) if(memcmp(input,bfh->data,bfh->size)==0)
return bfh; return bfh;
@@ -258,7 +258,7 @@ namespace hgl
if(!cs)return(false); if(!cs)return(false);
if(!bom)return(false); if(!bom)return(false);
if(bom->bom<=bomNone||bom->bom>=bomEnd)return(false); if(!RangeCheck<ByteOrderMask>(bom->bom))return(false);
cs->codepage=bom->code_page; cs->codepage=bom->code_page;
memcpy(cs->charset,bom->char_set,sizeof(CharSetName)); memcpy(cs->charset,bom->char_set,sizeof(CharSetName));