diff --git a/inc/hgl/io/LoadString.h b/inc/hgl/io/LoadString.h index 9f09b80..6a44c52 100644 --- a/inc/hgl/io/LoadString.h +++ b/inc/hgl/io/LoadString.h @@ -3,6 +3,7 @@ #include #include +#include namespace hgl { @@ -10,5 +11,8 @@ namespace hgl int LoadStringFromText(U16String &full_text,const void *source_data,const int size,const CharSet &cs=UTF8CharSet); ///<加载一个原始文本块到U16String int LoadStringFromTextFile(U8String &str,const OSString &filename,const CharSet &cs=UTF8CharSet); ///<加载一个原始文本文件到U8String int LoadStringFromTextFile(U16String &str,const OSString &filename,const CharSet &cs=UTF8CharSet); ///<加载一个原始文本文件到U16String + + int LoadStringFromTextFile(std::string &str,const OSString &filename,const CharSet &cs=UTF8CharSet); ///<加载一个原始文本文件到U8String + int LoadStringFromTextFile(std::wstring &str,const OSString &filename,const CharSet &cs=UTF8CharSet); ///<加载一个原始文本文件到U16String }//namespace hgl #endif//HGL_LOAD_STRING_INCLUDE diff --git a/src/Text/LoadString.cpp b/src/Text/LoadString.cpp index 27c1ace..16ad5da 100644 --- a/src/Text/LoadString.cpp +++ b/src/Text/LoadString.cpp @@ -1,13 +1,62 @@ #include #include +#include namespace hgl { + namespace + { + template struct MakeString + { + virtual void set(CH *str,const int count)=0; + }; + + template struct MakeStringImpl:public MakeString + { + STR *hgl_string; + + MakeStringImpl(STR *s) + { + hgl_string=s; + } + + void set(CH *str,const int count) override + { + hgl_string->fromString(str,count); + } + }; + + template struct MakeStringSTD:public MakeString + { + STR *std_string; + + MakeStringSTD(STR *s) + { + std_string=s; + } + + void set(CH *str,const int count) override + { + std_string->assign(str,count); + } + }; + + using MakeAString =MakeStringImpl; + using MakeU8String =MakeStringImpl; + using MakeU16String =MakeStringImpl; + using MakeWString =MakeStringImpl; + + using MakeStdString =MakeStringSTD; + using MakeStdU8String =MakeStringSTD; + using MakeStdU16String =MakeStringSTD; + using MakeStdWString =MakeStringSTD; + } + /** * 加载一个原始文本块到U8String */ - int LoadStringFromText(U8String &full_text,const void *source_data,const int size,const CharSet &cs) + int LoadStringFromText(MakeString *make_string,const void *source_data,const int size,const CharSet &cs) { - if(!source_data||size<=0) + if(!make_string||!source_data||size<=0) return 0; u8char *str=nullptr; @@ -17,7 +66,7 @@ namespace hgl if(size>=3&&data[0]==0xEF&&data[1]==0xBB&&data[2]==0xBF) //utf8 { - full_text.fromString((u8char *)(data+3),size-3); + make_string->set((u8char *)(data+3),size-3); char_count=size-3; } else @@ -75,7 +124,7 @@ namespace hgl char_count=to_utf8(cs,&str,(char *)data,size); #endif// - full_text.fromString(str,char_count); + make_string->set(str,char_count); delete[] str; } @@ -85,9 +134,9 @@ namespace hgl /** * 加载一个原始文本块到U16String */ - int LoadStringFromText(U16String &full_text,const void *source_data,const int size,const CharSet &cs) + int LoadStringFromText(MakeString *make_string,const void *source_data,const int size,const CharSet &cs) { - if(!source_data||size<=0) + if(!make_string||!source_data||size<=0) return(0); const uint8 *data=(const uint8 *)source_data; @@ -130,7 +179,7 @@ namespace hgl if((uchar *)str>=data&&(uchar *)str<=data+size) //如果str的地址在data的范围内 { - full_text.fromString(str,char_count); + make_string->set(str,char_count); } else { @@ -156,41 +205,66 @@ namespace hgl #endif// } - full_text.fromString(str,char_count); - + make_string->set(str,char_count); delete[] str; } return char_count; } + + int LoadStringFromText(U8String &full_text,const void *source_data,const int size,const CharSet &cs) + { + MakeU8String make_string(&full_text); + + return LoadStringFromText(&make_string,source_data,size,cs); + } + + int LoadStringFromText(U16String &full_text,const void *source_data,const int size,const CharSet &cs) + { + MakeU16String make_string(&full_text); + + return LoadStringFromText(&make_string,source_data,size,cs); + } + + template + int LoadStringFromTextFile(MakeString *make_string,const OSString &filename,const CharSet &cs) + { + uchar *data; + + const int size=filesystem::LoadFileToMemory(filename,(void **)&data); + + if(size<=0) + return size; + + return LoadStringFromText(make_string,data,size,cs); + } - /** - * 加载一个原始文本文件到U8String - */ int LoadStringFromTextFile(U8String &str,const OSString &filename,const CharSet &cs) { - uchar *data; + MakeU8String make_string(&str); - const int size=filesystem::LoadFileToMemory(filename,(void **)&data); - - if(size<=0) - return size; - - return LoadStringFromText(str,data,size,cs); + return LoadStringFromTextFile(&make_string,filename,cs); } - /** - * 加载一个原始文本文件到U16String - */ int LoadStringFromTextFile(U16String &str,const OSString &filename,const CharSet &cs) { - uchar *data; + MakeU16String make_string(&str); - const int size=filesystem::LoadFileToMemory(filename,(void **)&data); - - if(size<=0) - return size; - - return LoadStringFromText(str,data,size,cs); + return LoadStringFromTextFile(&make_string,filename,cs); } + + int LoadStringFromTextFile(std::string &str,const OSString &filename,const CharSet &cs) + { + MakeStdString make_string(&str); + + return LoadStringFromTextFile((MakeU8String *)&make_string,filename,cs); + } + + int LoadStringFromTextFile(std::wstring &str,const OSString &filename,const CharSet &cs) + { + MakeStdWString make_string(&str); + + return LoadStringFromTextFile(&make_string,filename,cs); + } + }//namespace hgl