/** * @file NFStringGeneral.h * @brief ¹®ÀÚ¿­ ÆÄ½Ì ¹× »ý¼ºÅ¬·¡½º * @remarks * @author °­µ¿¸í(edith2580@gmail.com) * @date 2009-04-02 */ #pragma once #include namespace Nave { inline std::pair Split(const wchar_t* ibegin,const wchar_t* iend, wchar_t delimiter) { for ( const wchar_t* i=ibegin; i != iend; ++i) { if ( (*i) == delimiter ) { if (i == ibegin) { ++ibegin; continue; } return std::pair(ibegin,i); } } return std::pair(ibegin,iend); } template inline std::pair Split(fc ibegin,const fc& iend, typename fc::value_type delimiter) { for ( fc i=ibegin; i != iend; ++i) { if ( (*i) == delimiter ) { if (i == ibegin) { ++ibegin; continue; } return std::pair(ibegin,i); } } return std::pair(ibegin,iend); } template void Split(iterator ibegin, const iterator& iend, typename iterator::value_type delimiter, container& result) { std::pair p(ibegin, ibegin); while(p.second!=iend) { p=Split(p.first, iend, delimiter); container::value_type str(p.first, p.second); result.push_back(str); p.first=p.second; } } inline void LeftTrim(std::string& s) { s.erase(0, s.find_first_not_of(" ")); } inline void LeftTrim(std::wstring& s) { s.erase(0, s.find_first_not_of(L" ")); } inline void RightTrim(std::string& s) { s.resize(s.find_last_not_of(" ") + 1); } inline void RightTrim(std::wstring& s) { s.resize(s.find_last_not_of(L" ") + 1); } template inline void Trim(fc& s) { LeftTrim(s); RightTrim(s); } std::string Format(char* format, ...); std::wstring Format(wchar_t* format, ...); std::string PositionalFormat(char* format, ...); std::wstring PositionalFormat(wchar_t* format, ...); template inline fc ParseFileNameNoPath(const fc& str) { fc tmp=ParseFileName(str); fc::size_type pos = tmp.find_last_of(L"\\/:"); if (pos != std::wstring::npos) return tmp.substr(pos+1); return tmp; } /** Extract filename, "filename|itemname" -> filename file name includes path "c:\data\bla|something" -> "c:\data\bla" */ template inline fc ParseFileName(const fc& str) { std::pair pair=Split(str.begin(),str.end(),L'|'); return fc(pair.first, pair.second); } /** extracts the item name "filename|itenmae" -> itenname "c:\data\blabla.xml\hellsemething" -> "something" */ template inline fc ParseItemName(const fc& str) { std::pair pair=Split(str.begin(),str.end(),L'|'); if ( pair.second == str.end() ) return fc(); return fc(++pair.second, str.end()); } /** "c:\data\blabla.xml\hellsemething" -> "c:\data" */ inline std::wstring ParseFilePath(const std::wstring& str) { std::wstring::size_type pos = str.find_last_of(L"\\/:"); if (pos != std::wstring::npos) return str.substr(0,pos); return str; } std::wstring RemoveDots(const std::wstring& str2); }