office-gobmx/external/mdds/mdds-c++98.patch.0
Stephan Bergmann 22aa9fce30 Avoid copying of singular iterators
Change-Id: If873d2c369ef6458fdf3289f09802e90dc7367f2
2014-05-15 11:33:44 +02:00

84 lines
2.4 KiB
Text

--- include/mdds/multi_type_vector_itr.hpp
+++ include/mdds/multi_type_vector_itr.hpp
@@ -139,14 +139,15 @@
typedef typename parent_type::size_type size_type;
typedef iterator_value_node<size_type, typename parent_type::element_block_type> node;
- iterator_common_base() : m_cur_node(0, 0) {}
+ iterator_common_base() : m_cur_node(0, 0), m_singular(true) {}
iterator_common_base(
const base_iterator_type& pos, const base_iterator_type& end,
size_type start_pos, size_type block_index) :
m_cur_node(start_pos, block_index),
m_pos(pos),
- m_end(end)
+ m_end(end),
+ m_singular(false)
{
if (m_pos != m_end)
update_node();
@@ -154,9 +155,13 @@
iterator_common_base(const iterator_common_base& other) :
m_cur_node(other.m_cur_node),
- m_pos(other.m_pos),
- m_end(other.m_end)
+ m_singular(other.m_singular)
{
+ if (!m_singular)
+ {
+ m_pos = other.m_pos;
+ m_end = other.m_end;
+ }
}
void update_node()
@@ -196,6 +201,7 @@
node m_cur_node;
base_iterator_type m_pos;
base_iterator_type m_end;
+ bool m_singular;
public:
bool operator== (const iterator_common_base& other) const
@@ -218,8 +224,12 @@
iterator_common_base& operator= (const iterator_common_base& other)
{
m_cur_node = other.m_cur_node;
- m_pos = other.m_pos;
- m_end = other.m_end;
+ m_singular = other.m_singular;
+ if (!m_singular)
+ {
+ m_pos = other.m_pos;
+ m_end = other.m_end;
+ }
return *this;
}
@@ -226,8 +236,22 @@
void swap(iterator_common_base& other)
{
m_cur_node.swap(other.m_cur_node);
- std::swap(m_pos, other.m_pos);
- std::swap(m_end, other.m_end);
+ std::swap(m_singular, other.m_singular);
+ if (!(m_singular || other.m_singular))
+ {
+ std::swap(m_pos, other.m_pos);
+ std::swap(m_end, other.m_end);
+ }
+ else if (!m_singular)
+ {
+ m_pos = other.m_pos;
+ m_end = other.m_end;
+ }
+ else if (!other.m_singular)
+ {
+ other.m_pos = m_pos;
+ other.m_end = m_end;
+ }
}
const node& get_node() const { return m_cur_node; }