Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorvng <viktor.govako@gmail.com>2012-09-06 16:21:12 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:43:09 +0300
commit467610f1de0dd967e46386cfc6739b3499d00f7b (patch)
tree1bdd2bae05f686fe0dc18d419bb09b4422a2688b /base
parent29487ffc8d03b4a98fc49744159ac190bacd9c89 (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.hpp37
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
{