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)