summaryrefslogtreecommitdiff
path: root/external/mdds/mdds-c++98.patch.0
blob: eaf1d60a86afba2d0989a8d59d1f4ac2e11fae5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
--- 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; }