亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? string.h

?? pe exe packer (must use vc2005 to compile)
?? H
字號:
// Common/String.h

#ifndef __COMMON_STRING_H
#define __COMMON_STRING_H

#include <string.h>
// #include <wchar.h>

#include "Vector.h"

#ifdef _WIN32
#include "MyWindows.h"
#endif

static const char *kTrimDefaultCharSet  = " \n\t";

template <class T>
inline int MyStringLen(const T *s)
{ 
  int i;
  for (i = 0; s[i] != '\0'; i++);
  return i;
}

template <class T>
inline T * MyStringCopy(T *dest, const T *src)
{ 
  T *destStart = dest;
  while((*dest++ = *src++) != 0);
  return destStart;
}

inline wchar_t* MyStringGetNextCharPointer(wchar_t *p)
  { return (p + 1); }
inline const wchar_t* MyStringGetNextCharPointer(const wchar_t *p)
  { return (p + 1); }
inline wchar_t* MyStringGetPrevCharPointer(const wchar_t *, wchar_t *p)
  { return (p - 1); }
inline const wchar_t* MyStringGetPrevCharPointer(const wchar_t *, const wchar_t *p)
  { return (p - 1); }

#ifdef _WIN32

inline char* MyStringGetNextCharPointer(char *p)
  { return CharNextA(p); }
inline const char* MyStringGetNextCharPointer(const char *p)
  { return CharNextA(p); }

inline char* MyStringGetPrevCharPointer(char *base, char *p)
  { return CharPrevA(base, p); }
inline const char* MyStringGetPrevCharPointer(const char *base, const char *p)
  { return CharPrevA(base, p); }

inline char MyCharUpper(char c)
  { return (char)(unsigned int)CharUpperA((LPSTR)(unsigned int)(unsigned char)c); }
#ifdef _UNICODE
inline wchar_t MyCharUpper(wchar_t c)
  { return (wchar_t)CharUpperW((LPWSTR)c); }
#else
wchar_t MyCharUpper(wchar_t c);
#endif

inline char MyCharLower(char c)
  { return (char)(unsigned int)CharLowerA((LPSTR)(unsigned int)(unsigned char)c); }
#ifdef _UNICODE
inline wchar_t MyCharLower(wchar_t c)
  { return (wchar_t)CharLowerW((LPWSTR)c); }
#else
wchar_t MyCharLower(wchar_t c);
#endif

inline char * MyStringUpper(char *s) { return CharUpperA(s); }
#ifdef _UNICODE
inline wchar_t * MyStringUpper(wchar_t *s) { return CharUpperW(s); }
#else
wchar_t * MyStringUpper(wchar_t *s);
#endif

inline char * MyStringLower(char *s) { return CharLowerA(s); }
#ifdef _UNICODE
inline wchar_t * MyStringLower(wchar_t *s) { return CharLowerW(s); }
#else
wchar_t * MyStringLower(wchar_t *s);
#endif

#else // Standard-C
wchar_t MyCharUpper(wchar_t c);
#endif

//////////////////////////////////////
// Compare

/*
#ifndef _WIN32_WCE
int MyStringCollate(const char *s1, const char *s2);
int MyStringCollateNoCase(const char *s1, const char *s2);
#endif
int MyStringCollate(const wchar_t *s1, const wchar_t *s2);
int MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2);
*/

int MyStringCompare(const char *s1, const char  *s2);
int MyStringCompare(const wchar_t *s1, const wchar_t *s2);

#ifdef _WIN32
int MyStringCompareNoCase(const char *s1, const char  *s2);
#endif

int MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2);

template <class T>
class CStringBase
{
  void TrimLeftWithCharSet(const CStringBase &charSet)
  {
    const T *p = _chars;
    while (charSet.Find(*p) >= 0 && (*p != 0))
      p = GetNextCharPointer(p);
    Delete(0, (int)(p - _chars));
  }
  void TrimRightWithCharSet(const CStringBase &charSet)
  {
    const T *p = _chars;
    const T *pLast = NULL;
    while (*p != 0)
    {
      if (charSet.Find(*p) >= 0)
      {
        if (pLast == NULL)
          pLast = p;
      }
      else
        pLast = NULL;
      p = GetNextCharPointer(p);
    }
    if(pLast != NULL)
    {
      int i = (int)(pLast - _chars);
      Delete(i, _length - i);
    }

  }
  void MoveItems(int destIndex, int srcIndex)
  {
    memmove(_chars + destIndex, _chars + srcIndex, 
        sizeof(T) * (_length - srcIndex + 1));
  }
  
  void InsertSpace(int &index, int size)
  {
    CorrectIndex(index);
    GrowLength(size);
    MoveItems(index + size, index);
  }

  static T *GetNextCharPointer(T *p)
    { return MyStringGetNextCharPointer(p); }
  static const T *GetNextCharPointer(const T *p)
    { return MyStringGetNextCharPointer(p); }
  static T *GetPrevCharPointer(T *base, T *p)
    { return MyStringGetPrevCharPointer(base, p); }
  static const T *GetPrevCharPointer(const T *base, const T *p)
    { return MyStringGetPrevCharPointer(base, p); }
protected:
  T *_chars;
  int _length;
	int _capacity;
  
  void SetCapacity(int newCapacity)
  {
    int realCapacity = newCapacity + 1;
    if(realCapacity == _capacity)
      return;
    /*
    const int kMaxStringSize = 0x20000000;
    #ifndef _WIN32_WCE
    if(newCapacity > kMaxStringSize || newCapacity < _length)
      throw 1052337;
    #endif
    */
    T *newBuffer = new T[realCapacity];
    if(_capacity > 0)
    {
      for (int i = 0; i < (_length + 1); i++)
        newBuffer[i] = _chars[i];
      delete []_chars;
      _chars = newBuffer;
    }
    else
    {
      _chars = newBuffer;
      _chars[0] = 0;
    }
    _capacity = realCapacity;
  }

  void GrowLength(int n)
  {
    int freeSize = _capacity - _length - 1;
    if (n <= freeSize) 
      return;
    int delta;
    if (_capacity > 64)
      delta = _capacity / 2;
    else if (_capacity > 8)
      delta = 16;
    else
      delta = 4;
    if (freeSize + delta < n)
      delta = n - freeSize;
    SetCapacity(_capacity + delta);
  }

  void CorrectIndex(int &index) const
  {
    if (index > _length)
      index = _length;
  }

public:
  CStringBase(): _chars(0), _length(0), _capacity(0)
    { SetCapacity(16 - 1); }
  CStringBase(T c):  _chars(0), _length(0), _capacity(0)
  {
    SetCapacity(1);
    _chars[0] = c;
    _chars[1] = 0;
    _length = 1;
  }
  CStringBase(const T *chars): _chars(0), _length(0), _capacity(0)
  {
    int length = MyStringLen(chars);
    SetCapacity(length);
    MyStringCopy(_chars, chars); // can be optimized by memove()
    _length = length;
  }
  CStringBase(const CStringBase &s):  _chars(0), _length(0), _capacity(0)
  {
    SetCapacity(s._length);
    MyStringCopy(_chars, s._chars);
    _length = s._length;
  }
  ~CStringBase() {  delete []_chars; }

  operator const T*() const { return _chars;} 

  // The minimum size of the character buffer in characters. 
  // This value does not include space for a null terminator.
  T* GetBuffer(int minBufLength)
  {
    if(minBufLength >= _capacity)
      SetCapacity(minBufLength + 1);
    return _chars;
  }
  void ReleaseBuffer() { ReleaseBuffer(MyStringLen(_chars)); }
  void ReleaseBuffer(int newLength)
  {
    /*
    #ifndef _WIN32_WCE
    if(newLength >= _capacity)
      throw 282217;
    #endif
    */
    _chars[newLength] = 0;
    _length = newLength;
  }

  CStringBase& operator=(T c)
  {
    Empty();
    SetCapacity(1);
    _chars[0] = c;
    _chars[1] = 0;
    _length = 1;
    return *this;
  }
  CStringBase& operator=(const T *chars)
  {
    Empty();
    int length = MyStringLen(chars);
    SetCapacity(length);
    MyStringCopy(_chars, chars);
    _length = length; 
    return *this;
  }  
  CStringBase& operator=(const CStringBase& s)
  {
    if(&s == this)
      return *this;
    Empty();
    SetCapacity(s._length);
    MyStringCopy(_chars, s._chars);
    _length = s._length;
    return *this;
  }
  
  CStringBase& operator+=(T c)
  {
    GrowLength(1);
    _chars[_length] = c;
    _chars[++_length] = 0;
    return *this;
  }
  CStringBase& operator+=(const T *s)
  {
    int len = MyStringLen(s);
    GrowLength(len);
    MyStringCopy(_chars + _length, s);
    _length += len;
    return *this;
  }
  CStringBase& operator+=(const CStringBase &s)
  {
    GrowLength(s._length);
    MyStringCopy(_chars + _length, s._chars);
    _length += s._length;
    return *this;
  }
  void Empty()
  {
    _length = 0;
    _chars[0] = 0;
  }
  int Length() const { return _length; }
  bool IsEmpty() const { return (_length == 0); }

  CStringBase Mid(int startIndex) const
    { return Mid(startIndex, _length - startIndex); }
  CStringBase Mid(int startIndex, int count ) const
  {
    if (startIndex + count > _length)
      count = _length - startIndex;
    
    if (startIndex == 0 && startIndex + count == _length)
      return *this;
    
    CStringBase<T> result;
    result.SetCapacity(count);
    // MyStringNCopy(result._chars, _chars + startIndex, count);
    for (int i = 0; i < count; i++)
      result._chars[i] = _chars[startIndex + i];
    result._chars[count] = 0;
    result._length = count;
    return result;
  }
  CStringBase Left(int count) const
    { return Mid(0, count); }
  CStringBase Right(int count) const
  {
    if (count > _length)
      count = _length;
    return Mid(_length - count, count);
  }

  void MakeUpper()
    { MyStringUpper(_chars); }
  void MakeLower()
    { MyStringLower(_chars); }

  int Compare(const CStringBase& s) const
    { return MyStringCompare(_chars, s._chars); }

  int CompareNoCase(const CStringBase& s) const
    { return MyStringCompareNoCase(_chars, s._chars); }
  /*
  int Collate(const CStringBase& s) const
    { return MyStringCollate(_chars, s._chars); }
  int CollateNoCase(const CStringBase& s) const
    { return MyStringCollateNoCase(_chars, s._chars); }
  */

  int Find(T c) const { return Find(c, 0); }
  int Find(T c, int startIndex) const
  {
    T *p = _chars + startIndex;
    while (true)
    {
      if (*p == c)
        return (int)(p - _chars);
      if (*p == 0)
        return -1;
      p = GetNextCharPointer(p);
    }
  }
  int Find(const CStringBase &s) const { return Find(s, 0); }
  int Find(const CStringBase &s, int startIndex) const
  {
    if (s.IsEmpty())
      return startIndex;
    for (; startIndex < _length; startIndex++)
    {
      int j;
      for (j = 0; j < s._length && startIndex + j < _length; j++)
        if (_chars[startIndex+j] != s._chars[j])
          break;
      if (j == s._length)
        return startIndex;
    }
    return -1;
  }
  int ReverseFind(T c) const
  {
    if (_length == 0)
      return -1;
    T *p = _chars + _length - 1;
    while (true)
    {
      if (*p == c)
        return (int)(p - _chars);
      if (p == _chars)
        return -1;
      p = GetPrevCharPointer(_chars, p);
    }
  }
  int FindOneOf(const CStringBase &s) const
  {
    for(int i = 0; i < _length; i++)
      if (s.Find(_chars[i]) >= 0)
        return i;
      return -1;
  }

  void TrimLeft(T c)
  {
    const T *p = _chars;
    while (c == *p)
      p = GetNextCharPointer(p);
    Delete(0, p - _chars);
  }
  private:
  CStringBase GetTrimDefaultCharSet()
  {
    CStringBase<T> charSet;
    for(int i = 0; i < (int)(sizeof(kTrimDefaultCharSet) /
      sizeof(kTrimDefaultCharSet[0])); i++)
      charSet += (T)kTrimDefaultCharSet[i];
    return charSet;
  }
  public:

  void TrimLeft()
  {
    TrimLeftWithCharSet(GetTrimDefaultCharSet());
  }
  void TrimRight()
  {
    TrimRightWithCharSet(GetTrimDefaultCharSet());
  }
  void TrimRight(T c)
  {
    const T *p = _chars;
    const T *pLast = NULL;
    while (*p != 0)
    {
      if (*p == c)
      {
        if (pLast == NULL)
          pLast = p;
      }
      else
        pLast = NULL;
      p = GetNextCharPointer(p);
    }
    if(pLast != NULL)
    {
      int i = pLast - _chars;
      Delete(i, _length - i);
    }
  }
  void Trim()
  {
    TrimRight();
    TrimLeft();
  }

  int Insert(int index, T c)
  {
    InsertSpace(index, 1);
    _chars[index] = c;
    _length++;
    return _length;
  }
  int Insert(int index, const CStringBase &s)
  {
    CorrectIndex(index);
    if (s.IsEmpty())
      return _length;
    int numInsertChars = s.Length();
    InsertSpace(index, numInsertChars);
    for(int i = 0; i < numInsertChars; i++)
      _chars[index + i] = s[i];
    _length += numInsertChars;
    return _length;
  }

  // !!!!!!!!!!!!!!! test it if newChar = '\0'
  int Replace(T oldChar, T newChar)
  {
    if (oldChar == newChar)
      return 0;
    int number  = 0;
    int pos  = 0;
    while (pos < Length())
    {
      pos = Find(oldChar, pos);
      if (pos < 0) 
        break;
      _chars[pos] = newChar;
      pos++;
      number++;
    }
    return number;
  }
  int Replace(const CStringBase &oldString, const CStringBase &newString)
  {
    if (oldString.IsEmpty())
      return 0;
    if (oldString == newString)
      return 0;
    int oldStringLength = oldString.Length();
    int newStringLength = newString.Length();
    int number  = 0;
    int pos  = 0;
    while (pos < _length)
    {
      pos = Find(oldString, pos);
      if (pos < 0) 
        break;
      Delete(pos, oldStringLength);
      Insert(pos, newString);
      pos += newStringLength;
      number++;
    }
    return number;
  }
  int Delete(int index, int count = 1 )
  {
    if (index + count > _length)
      count = _length - index;
    if (count > 0)
    {
      MoveItems(index, index + count);
      _length -= count;
    }
    return _length;
  }
};

template <class T>
CStringBase<T> operator+(const CStringBase<T>& s1, const CStringBase<T>& s2)
{
  CStringBase<T> result(s1);
  result += s2;
  return result; 
}

template <class T>
CStringBase<T> operator+(const CStringBase<T>& s, T c)
{
  CStringBase<T> result(s);
  result += c;
  return result; 
}

template <class T>
CStringBase<T> operator+(T c, const CStringBase<T>& s)
{
  CStringBase<T> result(c);
  result += s;
  return result; 
}

template <class T>
CStringBase<T> operator+(const CStringBase<T>& s, const T * chars)
{
  CStringBase<T> result(s);
  result += chars;
  return result; 
}

template <class T>
CStringBase<T> operator+(const T * chars, const CStringBase<T>& s)
{
  CStringBase<T> result(chars);
  result += s;
  return result; 
}

template <class T>
bool operator==(const CStringBase<T>& s1, const CStringBase<T>& s2)
  { return (s1.Compare(s2) == 0); }

template <class T>
bool operator<(const CStringBase<T>& s1, const CStringBase<T>& s2)
  { return (s1.Compare(s2) < 0); }

template <class T>
bool operator==(const T *s1, const CStringBase<T>& s2)
  { return (s2.Compare(s1) == 0); }

template <class T>
bool operator==(const CStringBase<T>& s1, const T *s2)
  { return (s1.Compare(s2) == 0); }

template <class T>
bool operator!=(const CStringBase<T>& s1, const CStringBase<T>& s2)
  { return (s1.Compare(s2) != 0); }

template <class T>
bool operator!=(const T *s1, const CStringBase<T>& s2)
  { return (s2.Compare(s1) != 0); }

template <class T>
bool operator!=(const CStringBase<T>& s1, const T *s2)
  { return (s1.Compare(s2) != 0); }

typedef CStringBase<char> AString;
typedef CStringBase<wchar_t> UString;

typedef CObjectVector<AString> AStringVector;
typedef CObjectVector<UString> UStringVector;

#ifdef _UNICODE
  typedef UString CSysString;
#else
  typedef AString CSysString;
#endif

typedef CObjectVector<CSysString> CSysStringVector;

#endif

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品视频一区二区三区不卡| 亚洲欧美国产77777| 99久久99久久久精品齐齐| 日韩不卡在线观看日韩不卡视频| 亚洲国产精品成人久久综合一区| 欧美性大战久久久久久久| 欧美视频一区在线| 国产成人自拍在线| 免费黄网站欧美| 亚洲欧美偷拍另类a∨色屁股| 日韩欧美专区在线| 欧美性大战久久| 99久久99久久精品免费观看| 精品在线观看免费| 婷婷成人激情在线网| 国产精品久久久久影院| 精品国产欧美一区二区| 欧美中文字幕一区二区三区 | 日韩手机在线导航| 色呦呦日韩精品| av电影一区二区| 国产一区二区0| 免费观看91视频大全| 午夜亚洲福利老司机| 一区av在线播放| 亚洲欧美另类久久久精品2019| 国产精品久久久爽爽爽麻豆色哟哟| 精品美女在线播放| 日韩亚洲欧美中文三级| 欧美日韩国产一级二级| 91极品视觉盛宴| 色偷偷一区二区三区| 一本色道久久综合亚洲aⅴ蜜桃| 高清久久久久久| 成人性视频网站| 成人在线综合网| 99久久久久免费精品国产| www.99精品| 91麻豆免费观看| 色欧美88888久久久久久影院| 97久久超碰国产精品| 色噜噜狠狠色综合中国| www.亚洲精品| 91视频91自| 日本韩国欧美三级| 欧美日韩在线三区| 欧美欧美午夜aⅴ在线观看| 欧美狂野另类xxxxoooo| 欧美一区二区三区在线观看| 日韩三区在线观看| 精品国产免费人成电影在线观看四季| 精品福利一区二区三区免费视频| 精品国产乱码久久久久久1区2区 | 久久精品国产色蜜蜜麻豆| 日本91福利区| 伦理电影国产精品| 国产精品一区二区视频| 99精品欧美一区二区三区小说| 91免费版pro下载短视频| 欧美午夜免费电影| 欧美成人三级电影在线| 欧美国产日韩a欧美在线观看 | 老司机一区二区| 国产高清不卡一区| 色综合久久久久网| 日韩亚洲欧美在线| 欧美国产一区视频在线观看| 亚洲啪啪综合av一区二区三区| 天天综合网天天综合色| 韩国三级在线一区| 色综合天天做天天爱| 欧美精品久久99| 亚洲国产精品黑人久久久| 一区二区在线观看不卡| 喷水一区二区三区| 成人激情小说乱人伦| 欧美美女激情18p| 国产欧美一区二区精品性| 亚洲国产一区在线观看| 国产精品自拍av| 在线精品国精品国产尤物884a| 欧美大片在线观看一区二区| 国产精品久久久久久久久晋中| 石原莉奈在线亚洲三区| 成人av一区二区三区| 91精品国产综合久久福利| 国产日韩av一区| 日本成人在线不卡视频| 成年人国产精品| 精品日韩99亚洲| 亚洲线精品一区二区三区| 国产成人亚洲精品青草天美| 欧美日韩三级一区| 国产精品不卡一区| 麻豆国产91在线播放| 色88888久久久久久影院野外| 久久久不卡网国产精品二区| 亚洲成精国产精品女| 成人av在线观| 26uuu国产电影一区二区| 亚洲成av人片一区二区梦乃| jizzjizzjizz欧美| 精品国内片67194| 天天免费综合色| 99国产精品视频免费观看| 精品国产不卡一区二区三区| 亚洲成人自拍偷拍| 一本大道久久a久久综合| 国产免费久久精品| 国产老肥熟一区二区三区| 91麻豆精品国产综合久久久久久| 一区二区在线观看免费视频播放 | 国产日韩精品视频一区| 麻豆成人综合网| 欧美日韩国产三级| 亚洲欧美韩国综合色| 不卡免费追剧大全电视剧网站| 欧美精品一区在线观看| 麻豆精品在线看| 制服.丝袜.亚洲.中文.综合| 亚洲国产精品精华液网站| 91在线观看下载| 最好看的中文字幕久久| 风间由美一区二区av101 | 精品国产露脸精彩对白| 日韩福利电影在线| 欧美群妇大交群中文字幕| 依依成人精品视频| 在线视频一区二区三区| 亚洲精品国产a| 欧美性受极品xxxx喷水| 亚洲综合色自拍一区| 欧美亚洲另类激情小说| 一片黄亚洲嫩模| 欧美日韩另类国产亚洲欧美一级| 亚洲黄色片在线观看| 欧洲亚洲国产日韩| 亚洲国产精品久久久久婷婷884| 在线一区二区三区| 亚洲第一福利一区| 日韩一区二区在线看片| 日本aⅴ精品一区二区三区 | 国产三级精品视频| 成人av电影在线| 亚洲黄色录像片| 欧美做爰猛烈大尺度电影无法无天| 亚洲女子a中天字幕| 欧美性大战xxxxx久久久| 婷婷一区二区三区| 日韩一区二区在线观看视频 | 久久影院午夜论| 粉嫩一区二区三区在线看| 国产精品视频免费| 色综合久久久久| 日本欧美大码aⅴ在线播放| 精品久久久久久久人人人人传媒| 国产乱人伦偷精品视频不卡| 日本一区二区视频在线| 91视视频在线观看入口直接观看www| 一卡二卡三卡日韩欧美| 欧美电影精品一区二区| 成人免费观看视频| 亚洲自拍偷拍麻豆| 欧美草草影院在线视频| 大胆欧美人体老妇| 亚洲国产精品自拍| 亚洲精品日韩专区silk| 欧美午夜理伦三级在线观看| 美国三级日本三级久久99| 国产拍揄自揄精品视频麻豆| 日本高清视频一区二区| 蜜桃久久久久久久| 中文字幕一区二区三区av| 555www色欧美视频| 大尺度一区二区| 天堂蜜桃一区二区三区| 久久久久国产精品人| 欧美体内she精高潮| 国产一区二区网址| 亚洲影院久久精品| 久久久久久久综合日本| 欧美性生活久久| 国产成人精品免费| 三级影片在线观看欧美日韩一区二区| 国产亚洲一本大道中文在线| 欧美三级电影网站| www.日韩大片| 国内成人自拍视频| 亚洲成人你懂的| 国产欧美精品区一区二区三区| 欧美日韩国产精品成人| 成人一区二区三区视频| 日产欧产美韩系列久久99| 亚洲欧美一区二区三区国产精品 | 亚洲综合在线观看视频| 2017欧美狠狠色| 欧美日韩一级片在线观看| av毛片久久久久**hd| 国产精品亚洲第一| 久久国内精品自在自线400部|