CSDN博客

img javenstudio

FastString大功告成!

发表于2004/6/18 10:32:00  2184人阅读

FastString类大功告成,比string快30%,小数据处理快3倍以上,提供丰富的字符串处理方法。

主要用于一些性能要求较高的应用,大部分是一行数据处理的场合,如服务器协议处理、邮件协议处理和邮件解析处理等。

/**
 * @class FastString
 *
 * @brief This class provides a wrapper facade for C strings.
 *
 * This class uses an included engine to allocate memory,
 * that stored one line string buffer in chars arrary and bigger
 * string in malloc buffer.
 * NOTE: if an instance of this class is constructed from or
 * assigned an empty string (with first element of '/0'), then it
 * is not allocated new space.  Instead, its internal
 * representation is set equal to a global empty string.
 * CAUTION: in cases when FastString is constructed from a
 * provided buffer with the release parameter set to 0,
 * FastString is not guaranteed to be '/0' terminated.
 *
 * @author Naven
 */

template <typename CHAR, size_t BUFSIZE = 256>
class FastString_Base
{
protected:
    CHAR m_psBufLine[BUFSIZE];
    CHAR *m_psBuf;
    CHAR *m_psRep;
    size_t m_nLen;
    size_t m_nBufLen;

private:
    void init();
    void allocate(const size_t size, int reallocate = 0);

public:
    FastString_Base<CHAR, BUFSIZE>();
    FastString_Base<CHAR, BUFSIZE>(const FastString_Base<CHAR, BUFSIZE> &s);
    FastString_Base<CHAR, BUFSIZE>(const CHAR *str);
    FastString_Base<CHAR, BUFSIZE>(const CHAR *str, const size_t len);
    FastString_Base<CHAR, BUFSIZE>(const size_t len, const CHAR c);
    ~FastString_Base<CHAR, BUFSIZE>();

    void set(const CHAR *str, size_t len);
    FastString_Base<CHAR, BUFSIZE> substring(const size_t offset, size_t length = -1) const;
    void substring(FastString_Base<CHAR, BUFSIZE> &s, const size_t offset, size_t length = -1) const;
    FastString_Base<CHAR, BUFSIZE>& append(const CHAR *str, size_t len);
    int startsWith(const CHAR *prefix, size_t len = 0, size_t offset = 0, int ignorecase = 0) const;
    int equals(const CHAR *str, size_t len = 0, int ignorecase = 0) const;
    FastString_Base<CHAR, BUFSIZE>& toLowerCase();
    FastString_Base<CHAR, BUFSIZE>& toUpperCase();
    FastString_Base<CHAR, BUFSIZE>& replace(const FastString_Base<CHAR, BUFSIZE> &name, const FastString_Base<CHAR, BUFSIZE> &value, const int ignorecase = 0);
    FastString_Base<CHAR, BUFSIZE>& replaces(FastString_Base<CHAR, BUFSIZE> *pNames, FastString_Base<CHAR, BUFSIZE> *pValues, int count, const int ignorecase = 0);
    CHAR *detach();
    CHAR *clone();
    void resize(size_t len, CHAR c);
    void resize(size_t len);
    void release();
    void clear();

    size_t length() const;
    size_t size() const;
    size_t capacity() const;
    const CHAR *c_str() const;
    CHAR *rep() const;
    //CHAR operator [] (size_t i) const;
    CHAR charAt(const size_t i) const;
    operator CHAR * () const;
    operator const CHAR * () const;
    operator void * () const;
    operator const void * () const;
    FastString_Base<CHAR, BUFSIZE>& replaceIgnoreCase(const FastString_Base<CHAR, BUFSIZE> &name, const FastString_Base<CHAR, BUFSIZE> &value);
    FastString_Base<CHAR, BUFSIZE>& replacesIgnoreCase(FastString_Base<CHAR, BUFSIZE> *pNames, FastString_Base<CHAR, BUFSIZE> *pValues, int count);
    FastString_Base<CHAR, BUFSIZE> substr(const size_t offset, size_t length = -1) const;
    FastString_Base<CHAR, BUFSIZE> &operator = (const FastString_Base<CHAR, BUFSIZE> &s);
    FastString_Base<CHAR, BUFSIZE> &operator = (const CHAR *str);
    FastString_Base<CHAR, BUFSIZE>& append(const FastString_Base<CHAR, BUFSIZE> &s);
    FastString_Base<CHAR, BUFSIZE>& append(const CHAR *str);
    FastString_Base<CHAR, BUFSIZE>& append(const CHAR c);
    FastString_Base<CHAR, BUFSIZE>& append(const int n);
    FastString_Base<CHAR, BUFSIZE>& append(const unsigned int n);
    FastString_Base<CHAR, BUFSIZE>& append(const float f);
    int endsWith(const CHAR *suffix, size_t len = 0) const;
    int endsWithIgnoreCase(const CHAR *suffix, size_t len = 0) const;
    int startsWithIgnoreCase(const CHAR *prefix, size_t len = 0, size_t offset = 0) const;
    int equalsIgnoreCase(const CHAR *str, size_t len = 0) const;
    int equals(const FastString_Base<CHAR, BUFSIZE> &s) const;
    int equalsIgnoreCase(const FastString_Base<CHAR, BUFSIZE> &s) const;
    int getline(int pos, FastString_Base<CHAR, BUFSIZE> &s, const CHAR *sep = NULL);
    int empty() const;

    FastString_Base<CHAR, BUFSIZE>& trimRight(size_t offset);
    FastString_Base<CHAR, BUFSIZE>& trimLeft(size_t offset);
    FastString_Base<CHAR, BUFSIZE>& removeChar(const CHAR c);
    FastString_Base<CHAR, BUFSIZE>& removeChars(const CHAR *chrs);
    FastString_Base<CHAR, BUFSIZE>& replaceChars(const CHAR *chrs, const CHAR chr);
    FastString_Base<CHAR, BUFSIZE>& rtrimChars(const CHAR *chrs);
    FastString_Base<CHAR, BUFSIZE>& ltrimChars(const CHAR *chrs);
    FastString_Base<CHAR, BUFSIZE>& trimChars(const CHAR *chrs);
    FastString_Base<CHAR, BUFSIZE>& trimRight();
    FastString_Base<CHAR, BUFSIZE>& trimLeft();
    FastString_Base<CHAR, BUFSIZE>& rtrim();
    FastString_Base<CHAR, BUFSIZE>& ltrim();
    FastString_Base<CHAR, BUFSIZE>& trim();
    size_t extractValueByName(
                    const CHAR *substr,
                    const CHAR *div1, const CHAR *div2,
                    FastString_Base<CHAR, BUFSIZE> &value,
                    const CHAR *vdiv,
                    const int count = 1);
    size_t extractIntegerByName(
                    const CHAR *substr,
                    long *value,
                    const long defval = 0);
    size_t extractValueByName(
                    const CHAR *substr,
                    FastString_Base<CHAR, BUFSIZE> &value,
                    const int count = 1);
    size_t extractValueByIndex(
                    FastString_Base<CHAR, BUFSIZE> &value,
                    const CHAR tag,
                    const int index);
    int indexOf(    CHAR target[], size_t targetCount,
                    size_t fromIndex,
                    const int ignorecase = 0);
    int indexOf(    CHAR target[],
                    size_t fromIndex = 0);
    int indexOfIgnoreCase(
                    CHAR target[], size_t targetCount,
                    size_t fromIndex);
    int indexOfIgnoreCase(
                    CHAR target[],
                    size_t fromIndex = 0);
    int lastIndexOf(CHAR target[], size_t targetCount,
                    size_t fromIndex,
                    const int ignorecase = 0);
    int lastIndexOf(CHAR target[],
                    size_t fromIndex = 0);
    int lastIndexOfIgnoreCase(
                    CHAR target[], size_t targetCount,
                    size_t fromIndex);
    int lastIndexOfIgnoreCase(
                    CHAR target[],
                    size_t fromIndex = 0);

public:
    static CHAR* removechars(CHAR *s, const CHAR *chrs);
    static CHAR* replacechars(CHAR *s, const CHAR *chrs, const CHAR chr);
    static CHAR* rtrimchars(CHAR *s, const CHAR *chrs);
    static CHAR* ltrimchars(CHAR *s, const CHAR *chrs);
    static CHAR* trimchars(CHAR *s, const CHAR *chrs);
    static CHAR* rtrim(CHAR *s);
    static CHAR* ltrim(CHAR *s);
    static CHAR* trim(CHAR *s);
    static CHAR* nextline(CHAR *sbuf, const int size,
                    CHAR **pptr, CHAR **ppchr, CHAR *chr);
    static size_t extractValueByName(
                    const CHAR *str, const CHAR *substr,
                    const CHAR *div1, const CHAR *div2,
                    CHAR *buf, const size_t size,
                    const CHAR *vdiv,
                    const int count = 1);
    static size_t extractIntegerByName(
                    const CHAR *str, const CHAR *substr,
                    long *value,
                    const long defval = 0);
    static size_t extractValueByName(
                    const CHAR *str, const CHAR *substr,
                    CHAR *value, const size_t size,
                    const int count=1);
    static size_t extractValueByIndex(
                    const CHAR *pstr, const size_t len,
                    CHAR *value, const size_t valsize,
                    const CHAR tag,
                    const int index);
    static int findIndexOf(
                    CHAR source[], size_t sourceCount,
                    CHAR target[], size_t targetCount,
                    size_t fromIndex = 0,
                    const int ignorecase = 0);
    static int findIndexOf(
                    CHAR source[], CHAR target[],
                    size_t fromIndex = 0);
    static int findIndexOfIgnoreCase(
                    CHAR source[], size_t sourceCount,
                    CHAR target[], size_t targetCount,
                    size_t fromIndex = 0);
    static int findIndexOfIgnoreCase(
                    CHAR source[], CHAR target[],
                    size_t fromIndex = 0);
    static int findLastIndexOf(
                    CHAR source[], size_t sourceCount,
                    CHAR target[], size_t targetCount,
                    size_t fromIndex = 0,
                    const int ignorecase = 0);
    static int findLastIndexOf(
                    CHAR source[], CHAR target[],
                    size_t fromIndex = 0);
    static int findLastIndexOfIgnoreCase(
                    CHAR source[], size_t sourceCount,
                    CHAR target[], size_t targetCount,
                    size_t fromIndex = 0);
    static int findLastIndexOfIgnoreCase(
                    CHAR source[], CHAR target[],
                    size_t fromIndex = 0);
};


typedef class FastString_Base<char, 256>        FastString;
typedef class FastString_Base<char, 65>         ShortString;

typedef class FastArray_Base<FastString>        FastStringArray;
typedef class FastArray_Base<ShortString>       ShortStringArray;

typedef class FastArray_Iterator<FastString>    FastStringArrayIterator;
typedef class FastArray_Iterator<ShortString>   ShortStringArrayIterator;

0 0

相关博文

我的热门文章

img
取 消
img