обрезания строк - достали :)
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 04.12.01 08:27
Оценка: 18 (2)
Через год с появления первой мысли об унификации этой операции для 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++'
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.