diff options
author | vng <viktor.govako@gmail.com> | 2012-09-06 16:21:12 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:43:09 +0300 |
commit | 467610f1de0dd967e46386cfc6739b3499d00f7b (patch) | |
tree | 1bdd2bae05f686fe0dc18d419bb09b4422a2688b /base | |
parent | 29487ffc8d03b4a98fc49744159ac190bacd9c89 (diff) |
Fix buffer_vector::resize() and add some assertions and todo's (buffer_vector::data()).
Diffstat (limited to 'base')
-rw-r--r-- | base/buffer_vector.hpp | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/base/buffer_vector.hpp b/base/buffer_vector.hpp index 37de63efed..01eea4b6bd 100644 --- a/base/buffer_vector.hpp +++ b/base/buffer_vector.hpp @@ -76,7 +76,7 @@ public: void resize(size_t n, T c = T()) { if (m_size == USE_DYNAMIC) - m_dynamic.resize(n); + m_dynamic.resize(n, c); else { if (n <= N) @@ -104,16 +104,43 @@ public: m_size = 0; } - T const * data() const { return m_size == USE_DYNAMIC ? &m_dynamic[0] : &m_static[0]; } - T * data() { return m_size == USE_DYNAMIC ? &m_dynamic[0] : &m_static[0]; } + /// @todo Here is some inconsistencies: + /// - "data" method should return 0 if vector is empty;\n + /// - potential memory overrun if m_dynamic is empty;\n + /// The best way to fix this is to reset m_size from USE_DYNAMIC to 0 when vector becomes empty. + /// But now I will just add some assertions to test memory overrun. + //@{ + T const * data() const + { + if (m_size == USE_DYNAMIC) + { + ASSERT ( !m_dynamic.empty(), () ); + return &m_dynamic[0]; + } + else + return &m_static[0]; + } + + T * data() + { + if (m_size == USE_DYNAMIC) + { + ASSERT ( !m_dynamic.empty(), () ); + return &m_dynamic[0]; + } + else + return &m_static[0]; + } + //@} T const * begin() const { return data(); } T * begin() { return data(); } T const * end() const { return data() + size(); } T * end() { return data() + size(); } + //@} - bool empty() const { return m_size == USE_DYNAMIC ? m_dynamic.empty() : m_size == 0; } - size_t size() const { return m_size == USE_DYNAMIC ? m_dynamic.size() : m_size; } + bool empty() const { return (m_size == USE_DYNAMIC ? m_dynamic.empty() : m_size == 0); } + size_t size() const { return (m_size == USE_DYNAMIC ? m_dynamic.size() : m_size); } T const & front() const { |