dwstring.cpp.svn-base

来自「ffshow源码」· SVN-BASE 代码 · 共 2,010 行 · 第 1/4 页

SVN-BASE
2,010
字号
{    assert(aBuf != 0);    if (aBuf != 0) {        _replace(mLength, 0, aBuf, aLen);    }    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::append(const tchar* aCstr){    assert(aCstr != 0);    size_t len = (aCstr) ? strlen(aCstr) : 0;    _replace(mLength, 0, aCstr, len);    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::append(size_t aLen, tchar aChar){    _replace(mLength, 0, aLen, aChar);    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::assign(const DwString<tchar>& aStr){    if (this != &aStr) {        assign(aStr, 0, aStr.mLength);    }    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::assign(const DwString<tchar>& aStr, size_t aPos, size_t aLen){    assert(aPos <= aStr.mLength);    size_t pos = std::min(aPos, aStr.mLength);    size_t len = std::min(aLen, aStr.mLength - pos);    if (mRep == aStr.mRep) {        mStart = aStr.mStart + pos;        mLength = len;    }    else {        delete_rep_safely(mRep);        mRep = new_rep_reference(aStr.mRep);        mStart = aStr.mStart + pos;        mLength = len;    }    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::assign(const tchar* aBuf, size_t aLen){    assert(aBuf != 0);    assert(aLen != (size_t)-1);    _replace(0, mLength, aBuf, aLen);    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::assign(const tchar* aCstr){    assert(aCstr != 0);    size_t len = (aCstr) ? strlen(aCstr) : 0;    _replace(0, mLength, aCstr, len);    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::assign(size_t aLen, tchar aChar){    assert(aLen != (size_t)-1);    _replace(0, mLength, aLen, aChar);    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::insert(size_t aPos, const DwString<tchar>& aStr){    return insert(aPos, aStr, 0, aStr.mLength);}template<class tchar> DwString<tchar>& DwString<tchar>::insert(size_t aPos1, const DwString<tchar>& aStr, size_t aPos2, size_t aLen2){    assert(aPos1 <= mLength);    assert(aPos2 <= aStr.mLength);    size_t pos2 = std::min(aPos2, aStr.mLength);    size_t len2 = std::min(aLen2, aStr.mLength - pos2);    if (&aStr == this) {        DwString<tchar> temp(aStr);        _replace(aPos1, 0, &temp.mRep->mBuffer[temp.mStart+pos2], len2);    }    else {        _replace(aPos1, 0, &aStr.mRep->mBuffer[aStr.mStart+pos2], len2);    }    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::insert(size_t aPos, const tchar* aBuf, size_t aLen){    assert(aBuf != 0);    _replace(aPos, 0, aBuf, aLen);    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::insert(size_t aPos, const tchar* aCstr){    assert(aCstr != 0);    size_t len = (aCstr) ? strlen(aCstr) : 0;    _replace(aPos, 0, aCstr, len);    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::insert(size_t aPos, size_t aLen, tchar aChar){    _replace(aPos, 0, aLen, aChar);    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::erase(size_t aPos, size_t aLen){    assert(aPos <= mLength);    size_t pos = std::min(aPos, mLength);    size_t len = std::min(aLen, mLength - pos);    _replace(pos, len, _L(""), 0);    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::replace(size_t aPos1, size_t aLen1, const DwString<tchar>& aStr){    return replace(aPos1, aLen1, aStr, 0, aStr.mLength);}template<class tchar> DwString<tchar>& DwString<tchar>::replace(size_t aPos1, size_t aLen1, const DwString<tchar>& aStr, size_t aPos2, size_t aLen2){    assert(aPos2 <= aStr.mLength);    size_t pos2 = std::min(aPos2, aStr.mLength);    size_t len2 = std::min(aLen2, aStr.mLength - pos2);    if (&aStr == this) {        DwString<tchar> temp(aStr);        _replace(aPos1, aLen1, &temp.mRep->mBuffer[temp.mStart+pos2], len2);    }    else {        _replace(aPos1, aLen1, &aStr.mRep->mBuffer[aStr.mStart+pos2], len2);    }    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::replace(size_t aPos1, size_t aLen1, const tchar* aBuf, size_t aLen2){    _replace(aPos1, aLen1, aBuf, aLen2);    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::replace(size_t aPos1, size_t aLen1, const tchar* aCstr){    size_t len2 = (aCstr) ? strlen(aCstr) : 0;    _replace(aPos1, aLen1, aCstr, len2);    return *this;}template<class tchar> DwString<tchar>& DwString<tchar>::replace(size_t aPos1, size_t aLen1, size_t aLen2, tchar aChar){    _replace(aPos1, aLen1, aLen2, aChar);    return *this;}template<class tchar> size_t DwString<tchar>::copy(tchar* aBuf, size_t aLen, size_t aPos) const{    assert(aPos <= mLength);    assert(aBuf != 0);    size_t pos = std::min(aPos, mLength);    size_t len = std::min(aLen, mLength - pos);    tchar* to = aBuf;    const tchar* from = mRep->mBuffer + mStart + pos;    mem_copy(from, len, to);    return len;}template<class tchar> void DwString<tchar>::swap(DwString<tchar>& aStr){    DwStringRep<tchar>* rep = mRep;    mRep = aStr.mRep;    aStr.mRep = rep;    size_t n = mStart;    mStart = aStr.mStart;    aStr.mStart = n;    n = mLength;    mLength = aStr.mLength;    aStr.mLength = n;}template<class tchar> size_t DwString<tchar>::find(const DwString<tchar>& aStr, size_t aPos) const{    return find(&aStr.mRep->mBuffer[aStr.mStart], aPos, aStr.mLength);}template<class tchar> size_t DwString<tchar>::find(const tchar* aBuf, size_t aPos, size_t aLen) const{    assert(aBuf != 0);    if (aBuf == 0) return (size_t)-1;    if (aLen > mLength) return (size_t)-1;    if (aPos > mLength-aLen) return (size_t)-1;    if (aLen == 0) return aPos;    const tchar* buf = mRep->mBuffer + mStart;    for (size_t i=aPos; i <= mLength-aLen; ++i) {        size_t k = i;        size_t j = 0;        while (j < aLen && aBuf[j] == buf[k]) {            ++j; ++k;        }        if (j == aLen) return i;    }    return (size_t)-1;}template<class tchar> size_t DwString<tchar>::find(const tchar* aCstr, size_t aPos) const{    assert(aCstr != 0);    if (aCstr == 0) return (size_t)-1;    size_t len = strlen(aCstr);    return find(aCstr, aPos, len);}template<class tchar> size_t DwString<tchar>::find(tchar aChar, size_t aPos) const{    if (aPos >= mLength) return (size_t)-1;    const tchar* buf = mRep->mBuffer + mStart;    for (size_t i=aPos; i < mLength; ++i) {        if (buf[i] == aChar) return i;    }    return (size_t)-1;}template<class tchar> size_t DwString<tchar>::rfind(const DwString<tchar>& aStr, size_t aPos) const{    return rfind(&aStr.mRep->mBuffer[aStr.mStart], aPos, aStr.mLength);}template<class tchar> size_t DwString<tchar>::rfind(const tchar* aBuf, size_t aPos, size_t aLen) const{    assert(aBuf != 0);    if (aBuf == 0) return (size_t)-1;    if (aLen > mLength) return (size_t)-1;    size_t pos = std::min(aPos, mLength - aLen);    if (aLen == 0) return pos;    const tchar* buf = mRep->mBuffer + mStart;    for (size_t i=0; i <= pos; ++i) {        size_t k = pos - i;        size_t j = 0;        while (j < aLen && aBuf[j] == buf[k]) {            ++j; ++k;        }        if (j == aLen) return pos - i;    }    return (size_t)-1;}template<class tchar> size_t DwString<tchar>::rfind(const tchar* aCstr, size_t aPos) const{    assert(aCstr != 0);    size_t len = (aCstr) ? strlen(aCstr) : 0;    return rfind(aCstr, aPos, len);}template<class tchar> size_t DwString<tchar>::rfind(tchar aChar, size_t aPos) const{    size_t pos = std::min(aPos, mLength - 1);    const tchar* buf = mRep->mBuffer + mStart;    for (size_t i=0; i <= pos; ++i) {        size_t k = pos - i;        if (buf[k] == aChar) return k;    }    return (size_t)-1;}template<class tchar> size_t DwString<tchar>::find_first_of(const DwString<tchar>& aStr, size_t aPos) const{    return find_first_of(&aStr.mRep->mBuffer[aStr.mStart], aPos, aStr.mLength);}template<class tchar> size_t DwString<tchar>::find_first_of(const tchar* aBuf, size_t aPos, size_t aLen) const{    assert(aBuf != 0);    if (aBuf == 0) return (size_t)-1;    if (aPos >= mLength) return (size_t)-1;    if (aLen == 0) return aPos;    tchar table[256];    memset(table, 0, sizeof(table));    for (size_t j=0; j < aLen; ++j) {        table[aBuf[j]&0xff] = 1;    }    const tchar* buf = mRep->mBuffer + mStart;    for (size_t i=aPos; i < mLength; ++i) {        if (table[buf[i]&0xff]) return i;    }    return (size_t)-1;}template<class tchar> size_t DwString<tchar>::find_first_of(const tchar* aCstr, size_t aPos) const{    assert(aCstr != 0);    if (aCstr == 0) return (size_t)-1;    size_t len = strlen(aCstr);    return find_first_of(aCstr, aPos, len);}template<class tchar> size_t DwString<tchar>::find_last_of(const DwString<tchar>& aStr, size_t aPos) const{    return find_last_of(&aStr.mRep->mBuffer[aStr.mStart], aPos, aStr.mLength);}template<class tchar> size_t DwString<tchar>::find_last_of(const tchar* aBuf, size_t aPos, size_t aLen) const{    assert(aBuf != 0);    if (aBuf == 0) return (size_t)-1;    if (mLength == 0) return (size_t)-1;    size_t pos = std::min(aPos, mLength - 1);    if (aLen == 0) return pos;    tchar table[256];    memset(table, 0, sizeof(table));    for (size_t j=0; j < aLen; ++j) {        table[aBuf[j]&0xff] = 1;    }    const tchar* buf = mRep->mBuffer + mStart;    for (size_t k=0; k <= pos; ++k) {        size_t i = pos - k;        if (table[buf[i]&0xff]) return i;    }    return (size_t)-1;}template<class tchar> size_t DwString<tchar>::find_last_of(const tchar* aCstr, size_t aPos) const{    assert(aCstr != 0);    if (aCstr == 0) return (size_t)-1;    size_t len = strlen(aCstr);    return find_last_of(aCstr, aPos, len);}template<class tchar> size_t DwString<tchar>::find_first_not_of(const DwString<tchar>& aStr, size_t aPos) const{    return find_first_not_of(&aStr.mRep->mBuffer[aStr.mStart], aPos, aStr.mLength);}template<class tchar> size_t DwString<tchar>::find_first_not_of(const tchar* aBuf, size_t aPos, size_t aLen) const{    assert(aBuf != 0);    if (aBuf == 0) return (size_t)-1;    if (aPos >= mLength) return (size_t)-1;    if (aLen == 0) return (size_t)-1;    tchar table[256];    memset(table, 1, sizeof(table));    for (size_t j=0; j < aLen; ++j) {        table[aBuf[j]&0xff] = 0;    }    const tchar* buf = mRep->mBuffer + mStart;    for (size_t i=aPos; i < mLength; ++i) {        if (table[buf[i]&0xff]) return i;    }    return (size_t)-1;}template<class tchar> size_t DwString<tchar>::find_first_not_of(const tchar* aCstr, size_t aPos) const{    assert(aCstr != 0);    if (aCstr == 0) return (size_t)-1;    size_t len = strlen(aCstr);    return find_first_not_of(aCstr, aPos, len);}template<class tchar> size_t DwString<tchar>::find_last_not_of(const DwString<tchar>& aStr, size_t aPos) const{    return find_last_not_of(&aStr.mRep->mBuffer[aStr.mStart], aPos, aStr.mLength);}template<class tchar> size_t DwString<tchar>::find_last_not_of(const tchar* aBuf, size_t aPos, size_t aLen) const{    assert(aBuf != 0);    if (aBuf == 0) return (size_t)-1;    if (mLength == 0) return (size_t)-1;    size_t pos = std::min(aPos, mLength - 1);    if (aLen == 0) return (size_t)-1;    tchar table[256];    memset(table, 1, sizeof(table));    for (size_t j=0; j < aLen; ++j) {        table[aBuf[j]&0xff] = 0;    }    const tchar* buf = mRep->mBuffer + mStart;    for (size_t k=0; k <= pos; ++k) {        size_t i = pos - k;        if (table[buf[i]&0xff]) return i;    }    return (size_t)-1;}template<class tchar> size_t DwString<tchar>::find_last_not_of(const tchar* aCstr, size_t aPos) const{    assert(aCstr != 0);    if (aCstr == 0) return (size_t)-1;    size_t len = strlen(aCstr);    return find_last_not_of(aCstr, aPos, len);}template<class tchar> DwString<tchar> DwString<tchar>::substr(size_t aPos, size_t aLen) const{    assert(aPos <= mLength);    size_t pos = std::min(aPos, mLength);    size_t len = std::min(aLen, mLength - pos);    return DwString<tchar>(*this, pos, len);}template<class tchar> int DwString<tchar>::compare(const DwString<tchar>& aStr) const{    return compare(0, mLength, aStr, 0, aStr.mLength);}template<class tchar> int DwString<tchar>::compare(size_t aPos1, size_t aLen1, const DwString<tchar>& aStr) const{    return compare(aPos1, aLen1, aStr, 0, aStr.mLength);}template<class tchar> int DwString<tchar>::compare(size_t aPos1, size_t aLen1, const DwString<tchar>& aStr,        size_t aPos2, size_t aLen2) const{    assert(aPos1 <= mLength);    assert(aPos2 <= aStr.mLength);    size_t pos1 = std::min(aPos1, mLength);    const tchar* buf1 = mRep->mBuffer + mStart + pos1;    size_t len1 = std::min(aLen1, mLength - pos1);    size_t pos2 = std::min(aPos2, aStr.mLength);    const tchar* buf2 = aStr.mRep->mBuffer + aStr.mStart + pos2;    size_t len2 = std::min(aLen2, aStr.mLength - pos2);    size_t len = std::min(len1, len2);    int r = strncmp(buf1, buf2, len);    if (r == 0) {        if (len1 < len2)            r = -1;        else if (len1 > len2) {            r = 1;        }    }    return r;}template<class tchar> int DwString<tchar>::compare(const tchar* aCstr) const{    assert(aCstr != 0);    size_t len = (aCstr) ? strlen(aCstr) : 0;    return compare(0, mLength, aCstr, len);}template<class tchar> int DwString<tchar>::compare(size_t aPos1, size_t aLen1, const tchar* aBuf, size_t aLen2) const{    assert(aBuf != 0);    assert(aPos1 <= mLength);    if (aBuf == 0) {        return (aLen1 > 0) ? 1 : 0;    }    size_t pos1 = std::min(aPos1, mLength);    const tchar* buf1 = mRep->mBuffer + mStart + pos1;    size_t len1 = std::min(aLen1, mLength - pos1);    const tchar* buf2 = aBuf;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?