⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 straccum.hh

📁 COPE the first practical network coding scheme which is developped on click
💻 HH
字号:
// -*- c-basic-offset: 4; related-file-name: "../../lib/straccum.cc" -*-#ifndef CLICK_STRACCUM_HH#define CLICK_STRACCUM_HH#include <click/glue.hh>#include <click/string.hh>#ifdef CLICK_LINUXMODULE# include <asm/string.h>#elif defined(CLICK_BSDMODULE)# include <sys/systm.h>#else	/* User-space */# include <string.h>#endifCLICK_DECLSclass StringAccum { public:      StringAccum()			: _s(0), _len(0), _cap(0) { }    explicit inline StringAccum(int);    ~StringAccum()			{ if (_cap >= 0) delete[] _s; }    const char *data() const		{ return (const char *)_s; }    char *data()			{ return (char *)_s; }    int length() const			{ return _len; }    operator bool()			{ return _len != 0; }    operator bool() const		{ return _len != 0; }    bool operator!() const		{ return _len == 0; }    bool out_of_memory() const		{ return _cap < 0; }      const char *c_str();    const char *cc()			{ return c_str(); }      char operator[](int i) const { assert(i>=0&&i<_len); return (char)_s[i]; }    char &operator[](int i)	{ assert(i>=0&&i<_len); return (char &)_s[i]; }    char back() const		{ assert(_len>0); return (char)_s[_len-1]; }    char &back()		{ assert(_len>0); return (char &)_s[_len-1]; }    inline void clear();      inline char *extend(int, int = 0);      inline void append(char);    inline void append(unsigned char);    inline void append(const char *, int);    inline void append(const char *begin, const char *end);    inline void append(const unsigned char *, int);    void append_fill(int c, int len);    inline char *reserve(int);    void set_length(int l)	{ assert(l>=0 && _len<=_cap);	_len = l; }    void forward(int n)		{ assert(n>=0 && _len+n<=_cap);	_len += n; }    void pop_back(int n = 1)	{ assert(n>=0 && _len>=n);	_len -= n; }    StringAccum &snprintf(int, const char *, ...);      inline unsigned char *take_bytes();	// returns array allocated by new[]    String take_string();		// returns String    void swap(StringAccum &);    // see also operator<< declarations below    private:      unsigned char *_s;    int _len;    int _cap;      void make_out_of_memory();    inline void safe_append(const char *, int);    bool grow(int);    void erase()			{ _s = 0; _len = 0; _cap = 0; }    StringAccum(const StringAccum &);    StringAccum &operator=(const StringAccum &);    friend StringAccum &operator<<(StringAccum &, const char *);  };inline StringAccum &operator<<(StringAccum &, char);inline StringAccum &operator<<(StringAccum &, unsigned char);inline StringAccum &operator<<(StringAccum &, const char *);inline StringAccum &operator<<(StringAccum &, const String &);inline StringAccum &operator<<(StringAccum &, const StringAccum &);#ifdef HAVE_PERMSTRINGinline StringAccum &operator<<(StringAccum &, PermString);#endifinline StringAccum &operator<<(StringAccum &, bool);inline StringAccum &operator<<(StringAccum &, short);inline StringAccum &operator<<(StringAccum &, unsigned short);inline StringAccum &operator<<(StringAccum &, int);inline StringAccum &operator<<(StringAccum &, unsigned);StringAccum &operator<<(StringAccum &, long);StringAccum &operator<<(StringAccum &, unsigned long);#if HAVE_INT64_TYPES && !HAVE_INT64_IS_LONGStringAccum &operator<<(StringAccum &, int64_t);StringAccum &operator<<(StringAccum &, uint64_t);#endif#if defined(CLICK_USERLEVEL) || defined(CLICK_TOOL)StringAccum &operator<<(StringAccum &, double);#endifStringAccum &operator<<(StringAccum &, void *);inlineStringAccum::StringAccum(int cap)    : _s(new unsigned char[cap]), _len(0), _cap(cap){    assert(cap > 0);    if (!_s)	_cap = -1;}inline voidStringAccum::append(unsigned char c){    if (_len < _cap || grow(_len))	_s[_len++] = c;}inline voidStringAccum::append(char c){    append(static_cast<unsigned char>(c));}inline char *StringAccum::reserve(int hm){    assert(hm >= 0);    if (_len + hm <= _cap || grow(_len + hm))	return (char *)(_s + _len);    else	return 0;}inline char *StringAccum::extend(int amt, int extra){    assert(extra >= 0);    char *c = reserve(amt + extra);    if (c)	_len += amt;    return c;}inline voidStringAccum::safe_append(const char *s, int len){    if (char *x = extend(len))	memcpy(x, s, len);}inline voidStringAccum::append(const char *s, int len){    if (len < 0)	len = strlen(s);    else if (len == 0 && s == String::out_of_memory_data())	make_out_of_memory();    safe_append(s, len);}	inline voidStringAccum::append(const unsigned char *s, int len){    append(reinterpret_cast<const char *>(s), len);}inline voidStringAccum::append(const char *begin, const char *end){    if (begin < end)	safe_append(begin, end - begin);    else if (begin == String::out_of_memory_data())	make_out_of_memory();}inline unsigned char *StringAccum::take_bytes(){    unsigned char *str = _s;    erase();    return str;}inline voidStringAccum::clear(){    if (_cap < 0)	_cap = 0, _s = 0;    _len = 0;}inline StringAccum &operator<<(StringAccum &sa, char c){    sa.append(c);    return sa;}inline StringAccum &operator<<(StringAccum &sa, unsigned char c){    sa.append(c);    return sa;}inline StringAccum &operator<<(StringAccum &sa, const char *s){    sa.safe_append(s, strlen(s));    return sa;}inline StringAccum &operator<<(StringAccum &sa, bool b){    return sa << (b ? "true" : "false");}inline StringAccum &operator<<(StringAccum &sa, short i){    return sa << static_cast<long>(i);}inline StringAccum &operator<<(StringAccum &sa, unsigned short u){    return sa << static_cast<unsigned long>(u);}inline StringAccum &operator<<(StringAccum &sa, int i){    return sa << static_cast<long>(i);}inline StringAccum &operator<<(StringAccum &sa, unsigned u){    return sa << static_cast<unsigned long>(u);}inline StringAccum &operator<<(StringAccum &sa, const String &s){    sa.append(s.data(), s.length());    return sa;}#ifdef HAVE_PERMSTRINGinline StringAccum &operator<<(StringAccum &sa, PermString s){    sa.safe_append(s.c_str(), s.length());    return sa;}#endifinline StringAccum &operator<<(StringAccum &sa, const StringAccum &sb){    sa.append(sb.data(), sb.length());    return sa;}CLICK_ENDDECLS#endif

⌨️ 快捷键说明

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