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__ */