summaryrefslogtreecommitdiff
path: root/xdelta3/testing/modify.h
diff options
context:
space:
mode:
Diffstat (limited to 'xdelta3/testing/modify.h')
-rw-r--r--xdelta3/testing/modify.h44
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
167void 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
167class Modify1stByte : public Mutator { 206class Modify1stByte : public Mutator {
168public: 207public:
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
176private:
177 ChangeListMutator clm_;
178}; 214};
179 215
180} // namespace regtest 216} // namespace regtest