91 template<
class I> Image<I> *Image<I>::Build(Timestamp timestamp, uint32 map_size, uint32 code_size, uint32 names_size) {
93 I *image =
new(map_size + code_size) I(timestamp, map_size, code_size, names_size);
94 return (Image<I> *)image;
97 template<
class I> Image<I> *Image<I>::Read(std::ifstream &stream) {
103 stream.read((
char *)×tamp,
sizeof(uint64));
104 stream.read((
char *)&map_size,
sizeof(uint32));
105 stream.read((
char *)&code_size,
sizeof(uint32));
106 stream.read((
char *)&names_size,
sizeof(uint32));
107 Image *image = Build(timestamp, map_size, code_size, names_size);
108 stream.read((
char *)image->data(), image->get_size() *
sizeof(word32));
112 template<
class I>
void Image<I>::Write(Image<I> *image, std::ofstream &stream) {
114 Timestamp timestamp = image->timestamp();
115 uint32 map_size = image->map_size();
116 uint32 code_size = image->code_size();
117 uint32 names_size = image->names_size();
118 stream.write((
char *)×tamp,
sizeof(uint64));
119 stream.write((
char *)&map_size,
sizeof(uint32));
120 stream.write((
char *)&code_size,
sizeof(uint32));
121 stream.write((
char *)&names_size,
sizeof(uint32));
122 stream.write((
char *)image->data(), image->get_size() *
sizeof(word32));
125 template<
class I> Image<I>::Image() : I() {
128 template<
class I> Image<I>::~Image() {
131 template<
class I> uint32 Image<I>::get_size()
const {
133 return I::map_size() + I::code_size() + I::names_size();
136 template<
class I> uint32 Image<I>::getObjectCount()
const {
138 return I::map_size();
141 template<
class I> word32 *Image<I>::get_object(uint32 i) {
143 return I::data() + I::data(i);
146 template<
class I> word32 *Image<I>::getCodeSegment() {
148 return I::data() + I::map_size();
151 template<
class I> uint32 Image<I>::getCodeSegmentSize()
const {
153 return I::code_size();
156 template<
class I>
void Image<I>::trace()
const {
158 std::cout <<
"---Image---\n";
159 std::cout <<
"Size: " << get_size() << std::endl;
160 std::cout <<
"Object Map Size: " << I::map_size() << std::endl;
161 std::cout <<
"Code Segment Size: " << I::code_size() << std::endl;
162 std::cout <<
"Names Size: " << I::names_size() << std::endl;
166 std::cout <<
"===Object Map===" << std::endl;
167 for (; i < I::map_size(); ++i)
168 std::cout << i <<
" " << I::data(i) << std::endl;
171 std::cout <<
"===Code Segment===" << std::endl;
172 uint32 code_start = I::map_size();
173 for (uint32 j = 0; j < code_start; ++j) {
175 uint32 object_axiom = I::data(I::data(j));
176 uint32 object_code_size = I::data(I::data(j) + 1);
177 uint32 object_reference_set_size = I::data(I::data(j) + 2);
178 uint32 object_marker_set_size = I::data(I::data(j) + 3);
179 uint32 object_view_set_size = I::data(I::data(j) + 4);
180 std::cout <<
"---object---\n";
182 std::cout << i++ <<
" code size: " << object_code_size << std::endl;
183 std::cout << i++ <<
" reference set size: " << object_reference_set_size << std::endl;
184 std::cout << i++ <<
" marker set size: " << object_marker_set_size << std::endl;
185 std::cout << i++ <<
" view set size: " << object_view_set_size << std::endl;
187 std::cout <<
"---code---\n";
188 for (; i < I::data(j) + 5 + object_code_size; ++i) {
190 std::cout << i <<
" ";
191 Atom::TraceContext context;
192 ((Atom *)&I::data(i))->trace(context, std::cout);
193 std::cout << std::endl;
196 std::cout <<
"---reference set---\n";
197 for (; i < I::data(j) + 5 + object_code_size + object_reference_set_size; ++i)
198 std::cout << i <<
" " << I::data(i) << std::endl;
200 std::cout <<
"---marker set---\n";
201 for (; i < I::data(j) + 5 + object_code_size + object_reference_set_size + object_marker_set_size; ++i)
202 std::cout << i <<
" " << I::data(i) << std::endl;
204 std::cout <<
"---view set---\n";
205 for (uint32 k = 0; k < object_view_set_size; ++k) {
207 uint32 view_code_size = I::data(i);
208 uint32 view_reference_set_size = I::data(i + 1);
210 std::cout <<
"view[" << k <<
"]\n";
211 std::cout << i++ <<
" code size: " << view_code_size << std::endl;
212 std::cout << i++ <<
" reference set size: " << view_reference_set_size << std::endl;
214 std::cout <<
"---code---\n";
216 for (l = 0; l < view_code_size; ++i, ++l) {
218 std::cout << i <<
" ";
219 Atom::TraceContext context;
220 ((Atom *)&I::data(i))->trace(context, std::cout);
221 std::cout << std::endl;
224 std::cout <<
"---reference set---\n";
225 for (l = 0; l < view_reference_set_size; ++i, ++l)
226 std::cout << i <<
" " << I::data(i) << std::endl;