ExpandableBuffer.h

Go to the documentation of this file.
00001 #ifndef __EXPANDABLEBUFFER_H__
00002 #define __EXPANDABLEBUFFER_H__
00003 
00004 #include <cstring>
00005 
00006 #include "../debug/DebugUtils.h"
00007 
00008 namespace oasys {
00009 
00015 struct ExpandableBuffer {
00016     ExpandableBuffer(size_t size = 0) 
00017         : buf_(0), buf_len_(0), len_(0) 
00018     {
00019         if (size != 0) {
00020             reserve(size);
00021         }
00022     }
00023 
00024     ExpandableBuffer(const ExpandableBuffer& other) 
00025         : buf_(0), buf_len_(0), len_(0)
00026     {
00027         if (other.buf_ == 0) {
00028             return;
00029         }
00030 
00031         reserve(other.buf_len_);
00032         memcpy(other.buf_, buf_, buf_len_);
00033         len_ = other.len_;
00034     }
00035 
00036     virtual ~ExpandableBuffer() { 
00037         if (buf_ != 0) {
00038             free(buf_);
00039             buf_ = 0;
00040         }
00041 
00042         buf_len_ = 0; 
00043         len_     = 0; 
00044     }
00045 
00050     char* tail_buf(size_t size) {
00051         if (size < (buf_len_ - len_)) {
00052             return buf_ + len_;
00053         }
00054 
00055         reserve(len_ + size);
00056         ASSERT(size <= (buf_len_ - len_));
00057         return buf_ + len_;
00058     }
00059 
00067     virtual void reserve(size_t size) {
00068         if (size > buf_len_) {
00069             buf_ = static_cast<char*>(realloc(buf_, size));
00070             if (buf_ == 0) {
00071                 PANIC("out of memory");
00072             }
00073             buf_len_ = size;
00074         }
00075     }
00076 
00078     int nfree() const {
00079         ASSERT(buf_len_ >= len_);
00080         return buf_len_ - len_;
00081     }
00082     
00084     char* raw_buf() const {
00085         ASSERT(buf_ != 0); 
00086         return buf_; 
00087     }
00088 
00091     char* at(size_t offset) const { 
00092         ASSERT(buf_ != 0);
00093 
00094         if (offset >=  buf_len_) {
00095             return 0;
00096         }
00097 
00098         return &buf_[offset]; 
00099     }
00100    
00102     char* end() const { 
00103         ASSERT(buf_ != 0);
00104         ASSERT(len_ < buf_len_);
00105         return at(len_); 
00106     }
00107     
00109     size_t buf_len() const { 
00110         return buf_len_; 
00111     }
00112 
00114     size_t len() const { return len_; }
00115 
00117     void set_len(size_t len) { 
00118         len_ = len; 
00119         ASSERT(len_ <= buf_len_);
00120     }
00121 
00123     void incr_len(size_t amt) {
00124         len_ += amt;
00125         ASSERT(len_ <= buf_len_);
00126     }        
00127 
00128     void clear() {
00129         set_len(0);
00130     }
00131 
00132 protected:
00133     char*  buf_;
00134     size_t buf_len_;
00135     size_t len_;
00136 };
00137 
00138 } // namespace oasys
00139 
00140 #endif /* __EXPANDABLEBUFFER_H__ */

Generated on Fri Dec 22 14:47:59 2006 for DTN Reference Implementation by  doxygen 1.5.1