📄 strcast.h
字号:
}
//uchar* to char*
explicit string_cast(custr psz,size_t count = -1) :
m_psz( m_szBuffer ),
m_isSameType(false)
{
init((const char*)psz,count == -1 ?
strlen((const char*)(psz)) : count);
}
explicit string_cast(ustr psz,size_t count = -1) :
m_psz( m_szBuffer ),
m_isSameType(false)
{
init((const char*)psz,count == -1 ?
strlen((const char*)(psz)) : count);
}
explicit string_cast(const dnc::utf8_const_iterator &it ,size_t count = -1) :
m_psz(m_szBuffer),
m_isSameType(false)
{
init((const char*)it,count == -1 ? strlen(it) : count);
}
//char* to char*
explicit string_cast(const char* psz ) :
m_psz((DescType*)psz),
m_isSameType(true),
m_length(-1)
{
}
explicit string_cast(char* psz ) :
m_psz((DescType*)psz),
m_isSameType(true),
m_length(-1)
{
}
////int to char*
//explicit string_cast(NullType val) :
// m_psz( m_szBuffer ),
// m_isSameType(false),
// m_length(-1)
//{
// strcpy(m_psz,"null");
//}
//explicit string_cast(bool val) :
// m_psz( m_szBuffer ),
// m_isSameType(false),
// m_length(-1)
//{
// sprintf(m_psz,t_nBufferLength,"%i",val);
//}
//explicit string_cast(char val) :
// m_psz( m_szBuffer ),
// m_isSameType(false),
// m_length(-1)
//{
// sprintf(m_psz,t_nBufferLength,"%i",val);
//}
//explicit string_cast(unsigned char val) :
// m_psz( m_szBuffer ),
// m_isSameType(false),
// m_length(-1)
//{
// sprintf(m_psz,t_nBufferLength,"%i",val);
//}
//explicit string_cast(short val) :
// m_psz( m_szBuffer ),
// m_isSameType(false),
// m_length(-1)
//{
// sprintf(m_psz,t_nBufferLength,"%i",val);
//}
//explicit string_cast(unsigned short val) :
// m_psz( m_szBuffer ),
// m_isSameType(false)
//{
// sprintf(m_psz,t_nBufferLength,"%i",val);
//}
//explicit string_cast(long val) :
// m_psz( m_szBuffer ),
// m_isSameType(false),
// m_length(-1)
//{
// sprintf(m_psz,t_nBufferLength,"%i",val);
//}
//explicit string_cast(unsigned long val) :
// m_psz( m_szBuffer ),
// m_isSameType(false),
// m_length(-1)
//{
// sprintf(m_psz,t_nBufferLength,"%i",val);
//}
//explicit string_cast(int val) :
// m_psz( m_szBuffer ),
// m_isSameType(false),
// m_length(-1)
//{
// sprintf(m_psz,t_nBufferLength,"%i",val);
//}
//explicit string_cast(unsigned int val) :
// m_psz( m_szBuffer ),
// m_isSameType(false),
// m_length(-1)
//{
// sprintf(m_psz,t_nBufferLength,"%i",val);
//}
//explicit string_cast(long long val) :
// m_psz( m_szBuffer ),
// m_isSameType(false),
// m_length(-1)
//{
// sprintf(m_psz,t_nBufferLength,"%i",val);
//}
//explicit string_cast(unsigned long long val) :
// m_psz( m_szBuffer ),
// m_isSameType(false),
// m_length(-1)
//{
// sprintf(m_psz,t_nBufferLength,"%i",val);
//}
////double to char*
//explicit string_cast(double val) :
// m_psz( m_szBuffer ),
// m_isSameType(false),
// m_length(-1)
//{
// sprintf(m_psz,t_nBufferLength,"%f",val);
//}
////float to char*
//explicit string_cast(float val) :
// m_psz( m_szBuffer ),
// m_isSameType(false),
// m_length(-1)
//{
// sprintf(m_psz,t_nBufferLength,"%f",val);
//}
////Variant to wchar_t*
//explicit string_cast(const Variant &val) :
// m_psz( m_szBuffer ),
// m_isSameType(false),
// m_length(-1)
//{
// const dlc_variant& v=(const dlc_variant&)val;
// switch(getVariantTypeId(v)){
// case vt_string:
// m_psz = v.strval;
// m_isSameType = true;
// break;
// default:
// std::string str(val);
// m_length = str.size();
// size_t len = m_length+1;
// if(len > t_nBufferLength){
// m_psz = new char[len];
// }
// strcpy(m_psz,str.c_str());
// }
//}
//template<class TSrc>
//explicit string_cast(const TSrc &val) :
// m_psz( m_szBuffer ),
// m_isSameType(false),
// m_length(-1)
//{
// std::string str;
// val.toString(str);
// if(str.size() >= t_nBufferLength){
// m_psz = new DescType[str.size()+1];
// }
// m_length = str.size();
// memcpy(m_psz,str.c_str(),m_length+1);
//}
~string_cast() throw(){
if( m_psz != m_szBuffer && !m_isSameType){
delete [] m_psz;
}
}
inline operator DescType* () const throw(){
return const_cast<DescType*>(m_psz);
}
inline DescType* c_str() const throw(){
return const_cast<DescType*>(m_psz);
}
inline size_t size() const{
if(m_length == -1){
const_cast<string_cast*>(this)->m_length = (size_t)strlen(m_psz);
}
return m_length;
}
private:
size_t m_length;
DescType* m_psz;
bool m_isSameType;
DescType m_szBuffer[t_nBufferLength];
private:
void init(cwstr str,size_t count) {
if (str == NULL){
m_psz = NULL;
return;
}
if( count*3 >= t_nBufferLength ){
m_psz = new char[count*3+1];
}
m_length = UNICODEToANSI(str,count,m_psz,count*3);
m_psz[m_length] = 0;
}
void init(const char* str,size_t count) {
if (str == NULL){
m_psz = NULL;
return;
}
if( count >=t_nBufferLength ){
m_psz = new char[count+1];
}
m_length = UTF8ToANSI((uchar*)str,count,m_psz,count);
m_psz[m_length] = 0;
}
explicit string_cast( const string_cast& ) throw();
string_cast& operator=( const string_cast& ) throw();
};
//------------------------------------------------------------------------------
//to uchar*
//------------------------------------------------------------------------------
#ifdef DNC_OLDVC
template<>
class string_cast<uchar>{
enum{t_nBufferLength = 128};
#else
template<int t_nBufferLength>
class string_cast<uchar,t_nBufferLength>{
#endif
public:
typedef wchar SrcType;
typedef uchar DescType;
public:
//wchar_t* to uchar*
explicit string_cast(cwstr str,size_t count = -1) :
m_psz( m_szBuffer ),
m_isSameType(false)
{
init(str,count == -1 ? wcslen(str) : count);
}
explicit string_cast(wstr str,size_t count = -1) :
m_psz( m_szBuffer ),
m_isSameType(false)
{
init(str,count == -1 ? wcslen(str) : count);
}
template<class Char,class Traits,class Allocator>
explicit string_cast(const std::basic_string<Char,Traits,Allocator> &str,size_t count = -1) :
m_psz( m_szBuffer ),
m_isSameType(false)
{
init(str.data(),count == -1 ? str.size() : count);
}
//uchar* to uchar*
template<class Traits,class Allocator>
explicit string_cast(const std::basic_string<char,Traits,Allocator> &sz ,size_t count = -1) :
m_psz((uchar*)sz.c_str()),
m_isSameType(true),
m_length(sz.size())
{
}
explicit string_cast(custr str ,size_t count = -1) :
m_psz((uchar*)str),
m_isSameType(true),
m_length(-1)
{
}
explicit string_cast(ustr str,size_t count = -1 ) :
m_psz(str),
m_isSameType(true),
m_length(-1)
{
}
explicit string_cast(const dnc::utf8_const_iterator &it ,size_t count = -1) :
m_psz((uchar*)(const char*)it),
m_isSameType(true),
m_length(-1)
{
}
//char* to uchar*
explicit string_cast(castr str ,size_t count = -1) :
m_psz(m_szBuffer),
m_isSameType(false)
{
init(str,count == -1 ? strlen(str): count);
}
explicit string_cast(astr str,size_t count = -1 ) :
m_psz(m_szBuffer),
m_isSameType(false)
{
init(str,count == -1 ? strlen(str): count);
}
template<class TSrc>
explicit string_cast(const TSrc &val) :
m_psz( m_szBuffer ),
m_isSameType(false),
m_length(-1)
{
std::string str;
val.toString(str);
if(str.size() >= t_nBufferLength){
m_psz = new DescType[str.size()+1];
}
m_length = str.size();
memcpy(m_psz,str.c_str(),m_length+1);
}
~string_cast() throw(){
if( m_psz != m_szBuffer && !m_isSameType){
delete [] m_psz;
}
}
inline operator char* () const throw(){
return (char*)m_psz;
}
inline char* c_str() const throw(){
return (char*)(m_psz);
}
inline std::string str() const{
return std::string((char*)m_psz,size());
}
inline size_t size() const{
if(m_length == -1){
const_cast<string_cast*>(this)->m_length = strlen((char*)m_psz);
}
return m_length;
}
private:
size_t m_length;
ustr m_psz;
bool m_isSameType;
uchar m_szBuffer[t_nBufferLength];
private:
void init(cwstr psz,size_t count) {
if (psz == NULL){
m_psz = NULL;
return;
}
if( count*3 >= t_nBufferLength ){
m_psz = new uchar[count*3+1];
}
m_length = UNICODEToUTF8(psz,count,m_psz,count*3);
m_psz[m_length] = 0;
}
void init(castr psz,size_t count) {
if (psz == NULL){
m_psz = NULL;
return;
}
if( count*3 >= t_nBufferLength ){
m_psz = new uchar[count*3];
}
m_length = ANSIToUTF8((char*)psz,count,m_psz,count*3);
m_psz[m_length] = 0;
}
explicit string_cast( const string_cast& ) throw();
string_cast& operator=( const string_cast& ) throw();
};
}
#endif //__DNC_STRCAST_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -