use "enum class" in ByteOrderMask
This commit is contained in:
@@ -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>
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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));
|
||||||
|
Reference in New Issue
Block a user