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
#include<hgl/platform/Platform.h> // 平台定义
#include<hgl/TypeFunc.h>
namespace hgl
{
namespace endian
@@ -47,15 +48,16 @@ namespace hgl
/**
* 字节序类型枚举
*/
enum ByteOrderMask
enum class ByteOrderMask
{
bomNone=0,
bomUTF8,
bomUTF16LE,
bomUTF16BE,
bomUTF32LE,
bomUTF32BE,
bomEnd
NONE=0,
UTF8,
UTF16LE,
UTF16BE,
UTF32LE,
UTF32BE,
ENUM_CLASS_RANGE(UTF8,UTF32BE)
};
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} ,bomUTF8, &utf8_charset ,ccpUTF8 },
{2,{0xFF,0xFE} ,bomUTF16LE,&utf16le_charset ,ccpUTF16LE },
{2,{0xFE,0xFF} ,bomUTF16BE,&utf16be_charset ,ccpUTF16BE },
{4,{0xFF,0xFE,0x00,0x00},bomUTF32LE,&utf32le_charset ,ccpUTF32LE },
{4,{0x00,0x00,0xFE,0xFF},bomUTF32BE,&utf32be_charset ,ccpUTF32BE }
{3,{0xEF,0xBB,0xBF} ,ByteOrderMask::UTF8, &utf8_charset ,ccpUTF8 },
{2,{0xFF,0xFE} ,ByteOrderMask::UTF16LE,&utf16le_charset ,ccpUTF16LE },
{2,{0xFE,0xFF} ,ByteOrderMask::UTF16BE,&utf16be_charset ,ccpUTF16BE },
{4,{0xFF,0xFE,0x00,0x00},ByteOrderMask::UTF32LE,&utf32le_charset ,ccpUTF32LE },
{4,{0x00,0x00,0xFE,0xFF},ByteOrderMask::UTF32BE,&utf32be_charset ,ccpUTF32BE }
};
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 bomNone;
return ByteOrderMask::NONE;
}
template<typename T>

View File

@@ -50,7 +50,7 @@ namespace hgl
{
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);
}
@@ -166,9 +166,9 @@ namespace hgl
bool WriteChars(const u16char *,int64); ///<写入一个字符串
};//template<ByteOrderMask BOM> class EndianTextOutputStream
typedef EndianTextOutputStream<bomUTF8 > UTF8TextOutputStream;
typedef EndianTextOutputStream<bomUTF16LE> UTF16LETextOutputStream;
typedef EndianTextOutputStream<bomUTF16BE> UTF16BETextOutputStream;
typedef EndianTextOutputStream<ByteOrderMask::UTF8 > UTF8TextOutputStream;
typedef EndianTextOutputStream<ByteOrderMask::UTF16LE> UTF16LETextOutputStream;
typedef EndianTextOutputStream<ByteOrderMask::UTF16BE> UTF16BETextOutputStream;
template<typename T> TextOutputStream *CreateTextOutputStream(OutputStream *os);
}//namespace io

View File

@@ -628,7 +628,7 @@ namespace hgl
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)
{
@@ -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)
{
@@ -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)
{
@@ -684,9 +684,9 @@ namespace hgl
return(result);
}//int LoadStringList
inline int LoadUTF8StringList (UTF8StringList & sl,io::DataInputStream *dis){return LoadStringList<u8char, bomUTF8 >(sl,dis);}
inline int LoadUTF16LEStringList (UTF16StringList & sl,io::DataInputStream *dis){return LoadStringList<u16char, bomUTF16LE >(sl,dis);}
inline int LoadUTF16BEStringList (UTF16StringList & sl,io::DataInputStream *dis){return LoadStringList<u16char, bomUTF16BE >(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, ByteOrderMask::UTF16LE >(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(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);
};
template<typename T> struct WriteStringToDOS<T,bomUTF8>
template<typename T> struct WriteStringToDOS<T,ByteOrderMask::UTF8>
{
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)
{
@@ -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)
{
@@ -750,17 +750,17 @@ namespace hgl
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)
{
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)
{
return WriteStringList<T,bomUTF16BE>(dos,sl);
return WriteStringList<T,ByteOrderMask::UTF16BE>(dos,sl);
}
}//namespace hgl
#endif//HGL_STRINGLIST_INCLUDE

View File

@@ -4,9 +4,9 @@ namespace hgl
{
namespace io
{
template<> EndianTextOutputStream<bomUTF8>::EndianTextOutputStream(OutputStream *os):TextOutputStream(bomUTF8,new DirectDataOutputStream(os)){}
template<> EndianTextOutputStream<bomUTF16LE>::EndianTextOutputStream(OutputStream *os):TextOutputStream(bomUTF16LE,new LEDataOutputStream(os)){}
template<> EndianTextOutputStream<bomUTF16BE>::EndianTextOutputStream(OutputStream *os):TextOutputStream(bomUTF16BE,new BEDataOutputStream(os)){}
template<> EndianTextOutputStream<ByteOrderMask::UTF8>::EndianTextOutputStream(OutputStream *os):TextOutputStream(ByteOrderMask::UTF8,new DirectDataOutputStream(os)){}
template<> EndianTextOutputStream<ByteOrderMask::UTF16LE>::EndianTextOutputStream(OutputStream *os):TextOutputStream(ByteOrderMask::UTF16LE,new LEDataOutputStream(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<wchar_t>(OutputStream *os){return(new UTF16LETextOutputStream(os));}
@@ -14,32 +14,32 @@ namespace hgl
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}

View File

@@ -234,9 +234,9 @@ namespace hgl
{
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)
return bfh;
@@ -258,7 +258,7 @@ namespace hgl
if(!cs)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;
memcpy(cs->charset,bom->char_set,sizeof(CharSetName));