Через год с появления первой мысли об унификации этой операции для
ANSI и
UNICODE строк, наконецто я устал от дублирования кода и создал следующее чудовище:
triml,trimr,trim - понятно что они делают
self_xxx - то же самое что и
xxx, только копия не создается
total_xxx - то же самое что и
xxx, только обрезаются все символы от '\0' до ' '
Может кому пригодиться ...
///////////////////////////////////////////////////////////////////////////////////
template<class TStr,class TTrimComp>
TStr trimr(const TStr& str,TTrimComp is_trim_char)
{
TStr::const_iterator i;
for(i=str.end()-1;
i>=str.begin() && is_trim_char(*i);
--i);
return TStr(str.begin(),++i);
}
template<class TStr,class TTrimComp>
TStr triml(const TStr& str,TTrimComp is_trim_char)
{
TStr::const_iterator i;
for(i=str.begin();i!=str.end() && is_trim_char(*i);++i);
return TStr(i,str.end());
}
template<class TStr,class TTrimComp>
TStr trim(const TStr& str,TTrimComp is_trim_char)
{
return triml(trimr(str,is_trim_char),is_trim_char);
}
template<class TStr,class TTrimComp>
TStr& self_trimr(TStr& str,TTrimComp is_trim_char)
{
TStr::iterator i;
for(i=str.end()-1;
i>=str.begin() && is_trim_char(*i);
--i);
str.erase(++i,str.end());
return str;
}
template<class TStr,class TTrimComp>
TStr& self_triml(TStr& str,TTrimComp is_trim_char)
{
TStr::iterator i;
for(i=str.begin();i!=str.end() && is_trim_char(*i);++i);
str.erase(str.begin(),i);
return str;
}
template<class TStr,class TTrimComp>
TStr& self_trim(TStr& str,TTrimComp is_trim_char)
{
return self_triml(self_trimr(str,is_trim_char),is_trim_char);
}
////////////////////////////////////////////////////////////////////////////////
//trim string functions
//ANSI -------------------------------------------------------------------
inline std::string trimr(const std::string& str)
{return trimr(str,std::bind1st(std::equal_to<BYTE>(),BYTE(' ')));}
inline std::string triml(const std::string& str)
{return triml(str,std::bind1st(std::equal_to<BYTE>(),BYTE(' ')));}
inline std::string trim(const std::string& str)
{return trim(str,std::bind1st(std::equal_to<BYTE>(),BYTE(' ')));}
inline std::string& self_trimr(std::string& str)
{return self_trimr(str,std::bind1st(std::equal_to<BYTE>(),BYTE(' ')));}
inline std::string& self_triml(std::string& str)
{return self_triml(str,std::bind1st(std::equal_to<BYTE>(),BYTE(' ')));}
inline std::string& self_trim(std::string& str)
{return self_trim(str,std::bind1st(std::equal_to<BYTE>(),BYTE(' ')));}
inline std::string total_trimr(const std::string& str)
{return trimr(str,std::bind1st(std::greater_equal<BYTE>(),BYTE(' ')));}
inline std::string total_triml(const std::string& str)
{return triml(str,std::bind1st(std::greater_equal<BYTE>(),BYTE(' ')));}
inline std::string total_trim(const std::string& str)
{return trim(str,std::bind1st(std::greater_equal<BYTE>(),BYTE(' ')));}
inline std::string& total_self_trimr(std::string& str)
{return self_trimr(str,std::bind1st(std::greater_equal<BYTE>(),BYTE(' ')));}
inline std::string& total_self_triml(std::string& str)
{return self_triml(str,std::bind1st(std::greater_equal<BYTE>(),BYTE(' ')));}
inline std::string& total_self_trim(std::string& str)
{return self_trim(str,std::bind1st(std::greater_equal<BYTE>(),BYTE(' ')));}
//UNICODE ----------------------------------------------------------------
inline std::wstring trimr(const std::wstring& str)
{return trimr(str,std::bind1st(std::equal_to<WCHAR>(),L' '));}
inline std::wstring triml(const std::wstring& str)
{return triml(str,std::bind1st(std::equal_to<WCHAR>(),L' '));}
inline std::wstring trim(const std::wstring& str)
{return trim(str,std::bind1st(std::equal_to<WCHAR>(),L' '));}
inline std::wstring& self_trimr(std::wstring& str)
{return self_trimr(str,std::bind1st(std::equal_to<WCHAR>(),L' '));}
inline std::wstring& self_triml(std::wstring& str)
{return self_triml(str,std::bind1st(std::equal_to<WCHAR>(),L' '));}
inline std::wstring& self_trim(std::wstring& str)
{return self_trim(str,std::bind1st(std::equal_to<WCHAR>(),L' '));}
inline std::wstring total_trimr(const std::wstring& str)
{return trimr(str,std::bind1st(std::greater_equal<wchar_t>(),L' '));}
inline std::wstring total_triml(const std::wstring& str)
{return triml(str,std::bind1st(std::greater_equal<wchar_t>(),L' '));}
inline std::wstring total_trim(const std::wstring& str)
{return trim(str,std::bind1st(std::greater_equal<wchar_t>(),L' '));}
inline std::wstring& total_self_trimr(std::wstring& str)
{return self_trimr(str,std::bind1st(std::greater_equal<wchar_t>(),L' '));}
inline std::wstring& total_self_triml(std::wstring& str)
{return self_triml(str,std::bind1st(std::greater_equal<wchar_t>(),L' '));}
inline std::wstring& total_self_trim(std::wstring& str)
{return self_trim(str,std::bind1st(std::greater_equal<wchar_t>(),L' '));}
27.05.03 10:55: Перенесено из 'C/C++'
-- Пользователи не приняли программу. Всех пришлось уничтожить. --