﻿//////////////////////////////////////////////////////////////////////////
// 函数: StrToData
// 日期: 2003-06-22日
// 作者: jin
//////////////////////////////////////////////////////////////////////////
#ifndef __STRINGTOOLS_H__
#define __STRINGTOOLS_H__
#include "Forcelib.h"
#include <Windows.h>
#include <string>
#include <functional>
#include <algorithm>
#include <cctype>       // for std::ptr_fun err
#include <vector>
namespace  strtools
{

#define BUF_LEN		1024

//convert  to upper
static inline std::wstring &toupper(std::wstring &s) { 
	std::transform(s.begin(), s.end(), s.begin(), std::toupper);
        return s; 
} 
//convert  to lower
static inline std::wstring &tolower(std::wstring &s) { 
	std::transform(s.begin(), s.end(), s.begin(), std::tolower);
        return s; 
} 

//trim from start 
static inline std::wstring &ltrim(std::wstring &s) { 
        //s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun<int, int>(std::isspace)))); 
	if (s.empty()){
        return s;
	}
	s.erase(0,s.find_first_not_of(L" \t\r\n"));
	return s;
        return s; 
} 

// trim from end 
static inline std::wstring &rtrim(std::wstring &s) { 
        //s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end()); 
	if (s.empty()){
        return s;
	}
	s.erase(s.find_last_not_of(L" \t\r\n")+1);
	return s;
} 

// trim from start and end
static inline std::wstring &trim(std::wstring &s) { 
        return ltrim(rtrim(s)); 
} 
// format  string
static inline std::wstring format(const wchar_t* format, ...) {
	wchar_t buf[BUF_LEN];
	va_list arglist;
	va_start(arglist, format);
	_vsnwprintf(buf, BUF_LEN, format, arglist);
	va_end(arglist);
	return std::wstring(buf);
} 


// I: ptr  		*ptr是要检索的 字符串开始地址，执行后*ptr指向分隔符之后的地址
// I: Delimiters	要分割字符集合开始地址，默认是TAB,SPACE
// O: ret		分割后字符串存放缓冲区（大小由调用时候充分考虑）
// 返回值		没有意义
// 补充		【‘，“】等字符包围的分隔符忽略
int wcstokEx(wchar_t* *ptr,wchar_t* Delimiters=L"\t ", wchar_t* ret=NULL);

// I: str  		要分割的字符串
// I: Delimiters	分割字符集合开始地址，默认是TAB,SPACE
// 返回值		分割之后的字符串
//------------------------------------------------
// 开始 字符【‘/“】时候连续一样的字符【‘/“】时候表示转义，如下
//  ''abc'	'123'   	=>	[][abc']
//  'a'bc'	'123'   	=>	[a][bc']
//  'a''bc'	'123'	=>	[a'bc][123]
//  'a'''bc'	'123'	=>	[a'][bc']
std::wstring subwcs(std::wstring &str, std::wstring Delimiters=L"\t ");

// I: str  		要分割的字符串
// I: substr		读取的一行
// 返回值		空字符：flase,有字符：true
//------------------------------------------------
// 读取一行，根据  CR[\r] LF[\n]  分割字符串
bool readwcs(std::wstring & str,std::wstring & substr);

// I: str  		要分割的字符串
// O: n		n
// O: m		m
//------------------------------------------------
// return 0		{n}
//  return 1		{,m}
//  return 2		{n,m}   {n,}
//  return 3		{}
long wcs2int(std::wstring& str,int & n, int& m );



std::wstring MStrToWStr(std::string& str,int len = -1);
std::string WStrToMStr(std::wstring& str,int len = -1);
std::wstring Format(const wchar_t * sFormat, ...);
}
#endif __STRINGTOOLS_H__

