00001 #ifndef __REALM_GROW_BUFFER__ 00002 #define __REALM_GROW_BUFFER__ 00003 00004 namespace realm { 00005 00006 class GrowBuffer { 00007 public: 00008 GrowBuffer(size_t capacity) 00009 : m_capacity(capacity), 00010 m_buf(capacity, '\0'), 00011 m_index(0) 00012 {} 00013 00014 GrowBuffer() 00015 : m_capacity(0), 00016 m_buf(), 00017 m_index(0) 00018 {} 00019 00020 void clear() { 00021 if (m_buf.size() > m_capacity) 00022 m_buf.resize(m_capacity); 00023 m_index = 0; 00024 } 00025 00026 char* data() { 00027 return &m_buf[0]; 00028 } 00029 00030 size_t size() { 00031 return m_index; 00032 } 00033 00034 size_t free() { 00035 return m_buf.size() - m_index; 00036 } 00037 00038 char* prepare(size_t capacity) { 00039 if (free() < capacity) 00040 m_buf.resize(m_buf.size() + (capacity - free())); 00041 return &m_buf[m_index]; 00042 } 00043 00044 void commit(size_t capacity) { 00045 if (m_index + capacity > m_buf.size()) 00046 return; // TODO: throw exception 00047 m_index += capacity; 00048 } 00049 00050 private: 00051 size_t m_capacity; 00052 std::string m_buf; 00053 size_t m_index; 00054 }; 00055 00056 } 00057 00058 #endif /* __REALM_GROW_BUFFER__ */