1
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2
#include "ObjectContents.h"
3
#include "include/buffer.h"
7
bool test_object_contents()
14
assert(c.size() == 20);
18
for (ObjectContents::Iterator iter = c.get_iterator();
23
assert(bl.length() == 20);
26
for (unsigned i = 0; i < 8; ++i) bl2.append(bl[i]);
29
ObjectContents::Iterator iter = c.get_iterator();
36
for (unsigned i = 12; i < 20; ++i) bl2.append(bl[i]);
37
assert(bl2.length() == 20);
39
for (ObjectContents::Iterator iter3 = c.get_iterator();
42
assert(bl2[iter3.get_pos()] == *iter3);
45
assert(bl2[0] == '\0');
46
assert(bl2[7] == '\0');
48
interval_set<uint64_t> to_clone;
49
to_clone.insert(5, 10);
50
d.clone_range(c, to_clone);
51
assert(d.size() == 15);
56
ObjectContents::Iterator iter2 = d.get_iterator();
58
for (uint64_t i = 5; i < 15; ++i, ++iter2) {
59
std::cerr << "i is " << i << std::endl;
60
assert(iter2.get_pos() == i);
61
assert(*iter2 == bl2[i]);
67
unsigned int ObjectContents::Iterator::get_state(uint64_t _pos)
69
if (parent->seeds.count(_pos)) {
70
return parent->seeds[_pos];
76
void ObjectContents::clone_range(ObjectContents &other,
77
interval_set<uint64_t> &intervals)
79
interval_set<uint64_t> written_to_clone;
80
written_to_clone.intersection_of(intervals, other.written);
82
interval_set<uint64_t> zeroed = intervals;
83
zeroed.subtract(written_to_clone);
85
written.union_of(intervals);
86
written.subtract(zeroed);
88
for (interval_set<uint64_t>::iterator i = written_to_clone.begin();
89
i != written_to_clone.end();
91
uint64_t start = i.get_start();
92
uint64_t len = i.get_len();
94
unsigned int seed = get_iterator().get_state(start+len);
96
seeds[start+len] = seed;
97
seeds.erase(seeds.lower_bound(start), seeds.lower_bound(start+len));
99
seeds[start] = other.get_iterator().get_state(start);
100
seeds.insert(other.seeds.upper_bound(start),
101
other.seeds.lower_bound(start+len));
104
if (intervals.range_end() > _size)
105
_size = intervals.range_end();
110
void ObjectContents::write(unsigned int seed,
115
unsigned int _seed = get_iterator().get_state(start+len);
116
seeds[start+len] = _seed;
117
seeds.erase(seeds.lower_bound(start),
118
seeds.lower_bound(start+len));
121
interval_set<uint64_t> to_write;
122
to_write.insert(start, len);
123
written.union_of(to_write);
125
if (start + len > _size)