旧的恢复MergeFilename,新的Combine重写并测试

This commit is contained in:
2025-03-27 23:40:43 +08:00
parent 54f484c442
commit d09fe4326e
5 changed files with 47 additions and 65 deletions

View File

@@ -3,6 +3,7 @@
#include<hgl/type/StringList.h>
#include<hgl/math/PrimaryMathematics.h>
#include<initializer_list>
/**
* Maximum Path Length Limitation
@@ -73,21 +74,17 @@ namespace hgl
return String<T>::newOf(fullname,p-fullname);
}
template<typename T,typename ...ARGS>
inline const String<T> Combine(const T spear_char,const T *str1,ARGS...args)
template<typename T>
inline const String<T> CombineFilename(const T spear_char,const std::initializer_list<const T *> &args)
{
const int count=sizeof...(ARGS);
if(args.size()<=0)
return String<T>();
if(count<=0)
return String<T>(str1);
int total_len=hgl::strlen(str1);
AutoDeleteArray<int> str_len[count+1];
str_len[0]=total_len;
int total=0;
AutoDeleteArray<int> str_len(args.size());
{
int index=1;
int index=0;
for(const T *str:args)
{
str_len[index]=hgl::strlen(str);
@@ -99,56 +96,48 @@ namespace hgl
T *fullname=new T[total];
T *p=fullname;
hgl_cpy<T>(p,str1,str_len[0]);
p+=str_len[0];
{
int index=1;
int index=0;
for(const T *str:args)
{
hgl_cpy<T>(p,str,str_len[index]);
p+=(int)str_len[index];
*p=spear_char;
++p;
hgl_cpy<T>(p,str,str_len[index])
p+=str_len[index];
}
fullename[total-1]=0;
fullname[total-1]=0;
}
return String<T>::newOf(fullname,total-1);
}
template<typename ...ARGS>
inline const String<char> Combine(const char *str1,ARGS...args)
inline const String<char> Combine(const std::initializer_list<const char *> &args)
{
return Combine<char>(HGL_DIRECTORY_SEPARATOR_RAWCHAR,str1,args...);
return CombineFilename<char>(HGL_DIRECTORY_SEPARATOR_RAWCHAR,args);
}
#ifdef HGL_SUPPORT_CHAR8_T
template<typename ...ARGS>
inline const String<char8_t> Combine(const char8_t *str1,ARGS...args)
inline const String<char8_t> Combine(const std::initializer_list<const char8_t *> &args)
{
return Combine<char8_t>(HGL_DIRECTORY_SEPARATOR_U8CHAR,str1,args...);
return CombineFilename<char8_t>(HGL_DIRECTORY_SEPARATOR_U8CHAR,args);
}
#endif//HGL_SUPPORT_CHAR8_T
#if HGL_OS == HGL_OS_Windows
template<typename ...ARGS>
inline const String<wchar_t> Combine(const wchar_t *str1,ARGS...args)
inline const String<wchar_t> Combine(const std::initializer_list<const wchar_t *> &args)
{
return Combine<wchar_t>(HGL_DIRECTORY_SEPARATOR_WCHAR,str1,args...);
return CombineFilename<wchar_t>(HGL_DIRECTORY_SEPARATOR_WCHAR,args);
}
#endif//HGL_OS == HGL_OS_Windows
template<typename T,typename ...ARGS>
inline const String<T> Combine(const T spear_char,const String<T> &str1,ARGS...args)
template<typename T>
inline const String<T> CombineFilename(const T spear_char,const std::initializer_list<const String<T>> &args)
{
const int count=sizeof...(ARGS);
if(args.size()<=0)
return String<T>();
if(count<=0)
return str1;
int total_len=str1.Length()
int total=0;
for(const String<T> &str:args)
total+=str.Length()+1;
@@ -156,44 +145,37 @@ namespace hgl
T *fullname=new T[total];
T *p=fullname;
hgl_cpy<T>(p,str1.c_str(),str1.Length());
p+=str1.Length();
{
int index=1;
for(const String<T> &str:args)
{
hgl_cpy<T>(p,str.c_str(),str.Length());
p+=str.Length();
*p=spear_char;
++p;
hgl_cpy<T>(p,str.c_str(),str.Length())
p+=str1.Length();
}
fullename[total-1]=0;
fullname[total-1]=0;
}
return String<T>::newOf(fullname,total-1);
}
template<typename ...ARGS>
inline const String<char> Combine(const String<char> &str1,ARGS...args)
inline const String<char> Combine(const std::initializer_list<const String<char>> &args)
{
return Combine<char>(HGL_DIRECTORY_SEPARATOR_RAWCHAR,str1,args...);
return CombineFilename<char>(HGL_DIRECTORY_SEPARATOR_RAWCHAR,args);
}
#ifdef HGL_SUPPORT_CHAR8_T
template<typename ...ARGS>
inline const String<char8_t> Combine(const String<char8_t> &str1,ARGS...args)
inline const String<char8_t> Combine(const std::initializer_list<const String<char8_t>> &args)
{
return Combine<char8_t>(HGL_DIRECTORY_SEPARATOR_U8CHAR,str1,args...);
return CombineFilename<char8_t>(HGL_DIRECTORY_SEPARATOR_U8CHAR,args);
}
#endif//HGL_SUPPORT_CHAR8_T
#if HGL_OS == HGL_OS_Windows
template<typename ...ARGS>
inline const String<wchar_t> Combine(const String<wchar_t> &str1,ARGS...args)
inline const String<wchar_t> Combine(const std::initializer_list<const String<wchar_t>> &args)
{
return Combine<wchar_t>(HGL_DIRECTORY_SEPARATOR_WCHAR,str1,args...);
return CombineFilename<wchar_t>(HGL_DIRECTORY_SEPARATOR_WCHAR,args);
}
#endif//HGL_OS == HGL_OS_Windows
@@ -248,7 +230,7 @@ namespace hgl
* 根据路径名和文件名
*/
template<typename T>
inline String<T> Combine(const String<T> &pathname,const String<T> &filename,const T directory_separator_char,const T *directory_separator_str)
inline String<T> MergeFilename(const String<T> &pathname,const String<T> &filename,const T directory_separator_char,const T *directory_separator_str)
{
String<T> fullname;
@@ -493,16 +475,16 @@ namespace hgl
}
#ifdef HGL_SUPPORT_CHAR8_T
inline AnsiString Combine(const AnsiString &pathname,const AnsiString &filename) ///<组合路径名与文件名
{return Combine<char>(pathname,filename,HGL_DIRECTORY_SEPARATOR,HGL_DIRECTORY_SEPARATOR_RAWSTR);}
inline AnsiString MergeFilename(const AnsiString &pathname,const AnsiString &filename) ///<组合路径名与文件名
{return MergeFilename<char>(pathname,filename,HGL_DIRECTORY_SEPARATOR,HGL_DIRECTORY_SEPARATOR_RAWSTR);}
#endif//HGL_SUPPORT_CHAR8_T
inline U8String Combine(const U8String &pathname,const U8String &filename) ///<组合路径名与文件名
{return Combine<u8char>(pathname,filename,HGL_DIRECTORY_SEPARATOR,HGL_DIRECTORY_SEPARATOR_U8STR);}
inline U8String MergeFilename(const U8String &pathname,const U8String &filename) ///<组合路径名与文件名
{return MergeFilename<u8char>(pathname,filename,HGL_DIRECTORY_SEPARATOR,HGL_DIRECTORY_SEPARATOR_U8STR);}
#if HGL_OS == HGL_OS_Windows
inline WString Combine(const WString &pathname,const WString &filename) ///<组合路径名与文件名
{return Combine<wchar_t>(pathname,filename,HGL_DIRECTORY_SEPARATOR,HGL_DIRECTORY_SEPARATOR_STR);}
inline WString MergeFilename(const WString &pathname,const WString &filename) ///<组合路径名与文件名
{return MergeFilename<wchar_t>(pathname,filename,HGL_DIRECTORY_SEPARATOR,HGL_DIRECTORY_SEPARATOR_STR);}
#endif//HGL_OS == HGL_OS_Windows
OSString FixFilename(const OSString &filename); ///<修正部分文件名问题