diff options
Diffstat (limited to 'xdelta3/testing/modify.h')
-rw-r--r-- | xdelta3/testing/modify.h | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/xdelta3/testing/modify.h b/xdelta3/testing/modify.h index 8da03a2..2080904 100644 --- a/xdelta3/testing/modify.h +++ b/xdelta3/testing/modify.h | |||
@@ -111,7 +111,7 @@ void ChangeListMutator::Mutate(const Change &ch, | |||
111 | MTRandom *rand) { | 111 | MTRandom *rand) { |
112 | switch (ch.kind) { | 112 | switch (ch.kind) { |
113 | case Change::ADD: | 113 | case Change::ADD: |
114 | //AddChange(ch, table, source_table, rand); | 114 | AddChange(ch, table, source_table, rand); |
115 | break; | 115 | break; |
116 | case Change::MODIFY: | 116 | case Change::MODIFY: |
117 | ModifyChange(ch, table, source_table, rand); | 117 | ModifyChange(ch, table, source_table, rand); |
@@ -164,6 +164,45 @@ void ChangeListMutator::ModifyChange(const Change &ch, | |||
164 | } | 164 | } |
165 | } | 165 | } |
166 | 166 | ||
167 | void ChangeListMutator::AddChange(const Change &ch, | ||
168 | SegmentMap *table, | ||
169 | const SegmentMap *source_table, | ||
170 | MTRandom *rand) { | ||
171 | xoff_t m_start = ch.addr1; | ||
172 | |||
173 | for (SegmentMap::const_iterator iter(source_table->begin()); | ||
174 | iter != source_table->end(); | ||
175 | ++iter) { | ||
176 | const Segment &seg = iter->second; | ||
177 | xoff_t i_start = iter->first; | ||
178 | xoff_t i_end = i_start + seg.length; | ||
179 | |||
180 | if (i_end <= m_start) { | ||
181 | table->insert(table->end(), make_pair(i_start, seg)); | ||
182 | continue; | ||
183 | } | ||
184 | |||
185 | if (i_start > m_start) { | ||
186 | table->insert(table->end(), make_pair(i_start + ch.size, seg)); | ||
187 | continue; | ||
188 | } | ||
189 | |||
190 | if (i_start < m_start) { | ||
191 | Segment before(seg.seed, m_start - i_start, seg.seed_offset); | ||
192 | table->insert(table->end(), make_pair(i_start, before)); | ||
193 | } | ||
194 | |||
195 | Segment addseg(rand->Rand32(), ch.size); | ||
196 | table->insert(table->end(), make_pair(m_start, addseg)); | ||
197 | |||
198 | if (m_start < i_end) { | ||
199 | Segment after(seg.seed, i_end - m_start, | ||
200 | seg.seed_offset + (m_start - i_start)); | ||
201 | table->insert(table->end(), make_pair(m_start + ch.size, after)); | ||
202 | } | ||
203 | } | ||
204 | } | ||
205 | |||
167 | class Modify1stByte : public Mutator { | 206 | class Modify1stByte : public Mutator { |
168 | public: | 207 | public: |
169 | void Mutate(SegmentMap *table, | 208 | void Mutate(SegmentMap *table, |
@@ -172,9 +211,6 @@ public: | |||
172 | ChangeListMutator::Mutate(Change(Change::MODIFY, 1, 0), | 211 | ChangeListMutator::Mutate(Change(Change::MODIFY, 1, 0), |
173 | table, source_table, rand); | 212 | table, source_table, rand); |
174 | } | 213 | } |
175 | |||
176 | private: | ||
177 | ChangeListMutator clm_; | ||
178 | }; | 214 | }; |
179 | 215 | ||
180 | } // namespace regtest | 216 | } // namespace regtest |