Code cleanup: Proper assignment and copying of HttpHeader. Besides being the Right Thing, having correct assignment operator and copy constructor helps classes that have HttpHeader data members to avoid defining explicit assignment operators and copy constructors. Also adds forgotten reset of "len" in the clean() method. Perhaps that data member is not needed at all? Other polishing touches. HttpHeader::reset() is now a tiny bit faster. No runtime changes expected. === modified file 'src/HttpHeader.cc' --- src/HttpHeader.cc 2010-11-01 05:44:28 +0000 +++ src/HttpHeader.cc 2011-02-18 04:59:02 +0000 @@ -383,18 +383,37 @@ httpHeaderMaskInit(&mask, 0); } -HttpHeader::HttpHeader(http_hdr_owner_type const &anOwner) : owner (anOwner), len (0) +HttpHeader::HttpHeader(const http_hdr_owner_type anOwner): owner(anOwner), len(0) { assert(anOwner > hoNone && anOwner <= hoReply); debugs(55, 7, "init-ing hdr: " << this << " owner: " << owner); httpHeaderMaskInit(&mask, 0); } +HttpHeader::HttpHeader(const HttpHeader &other): owner(other.owner), len(other.len) +{ + httpHeaderMaskInit(&mask, 0); + update(&other, NULL); // will update the mask as well +} + HttpHeader::~HttpHeader() { clean(); } +HttpHeader & +HttpHeader::operator =(const HttpHeader &other) +{ + if (this != &other) { + // we do not really care, but the caller probably does + assert(owner == other.owner); + clean(); + update(&other, NULL); // will update the mask as well + len = other.len; + } + return *this; +} + void HttpHeader::clean() { @@ -437,6 +456,7 @@ } entries.clean(); httpHeaderMaskInit(&mask, 0); + len = 0; // TODO: this line was missing for a while; do we need len at all? PROF_stop(HttpHeaderClean); } @@ -500,10 +520,7 @@ int HttpHeader::reset() { - http_hdr_owner_type ho; - ho = owner; clean(); - *this = HttpHeader(ho); return 0; } === modified file 'src/HttpHeader.h' --- src/HttpHeader.h 2010-11-01 00:52:59 +0000 +++ src/HttpHeader.h 2011-02-18 04:58:56 +0000 @@ -205,8 +205,12 @@ public: HttpHeader(); - HttpHeader(http_hdr_owner_type const &owner); + explicit HttpHeader(const http_hdr_owner_type owner); + HttpHeader(const HttpHeader &other); ~HttpHeader(); + + HttpHeader &operator =(const HttpHeader &other); + /* Interface functions */ void clean(); void append(const HttpHeader * src); @@ -271,10 +275,6 @@ private: HttpHeaderEntry *findLastEntry(http_hdr_type id) const; - /// Made it non-copyable. Our destructor is a bit nasty... - HttpHeader(const HttpHeader &); - //assignment is used by the reset method, can't block it.. - //const HttpHeader operator=(const HttpHeader &); };