42 typedef std::vector<unsigned int> shape;
47 unsigned int d_highest_offset;
52 unsigned int d_offset;
63 Odometer(shape shape) : d_shape(shape), d_offset(0)
65 d_rank = d_shape.size();
69 for (
unsigned int i = 0; i < d_rank; ++i) {
70 d_highest_offset *= d_shape.at(i);
73 d_indices.resize(d_rank, 0);
78 Odometer(
unsigned int x,
unsigned int y) : d_offset(0)
86 for (
unsigned int i = 0; i < d_rank; ++i) {
87 d_highest_offset *= d_shape.at(i);
90 d_indices.resize(d_rank, 0);
109 for (
unsigned int i = 0; i < d_rank; ++i)
128 shape::reverse_iterator si = d_shape.rbegin();
129 for (shape::reverse_iterator i = d_indices.rbegin(), e = d_indices.rend(); i != e; ++i, ++si) {
142 unsigned int next_safe();
156 unsigned int chunk_size = 1;
161 shape::reverse_iterator si = d_shape.rbegin();
162 for (shape::reverse_iterator i = d_indices.rbegin(), e = d_indices.rend(); i != e; ++i, ++si) {
164 d_offset += chunk_size * *i;
168 shape::reverse_iterator shape_index = d_shape.rbegin();
169 shape::reverse_iterator index = d_indices.rbegin(), index_end = d_indices.rend();
171 unsigned int chunk_size = *shape_index++;
172 while (index != index_end) {
173 d_offset += chunk_size * *index++;
174 chunk_size *= *shape_index++;
183 std::copy(
indices.begin(),
indices.end(), std::back_inserter(temp));
216 return d_highest_offset;
unsigned int set_indices(const shape &indices)
void indices(shape &indices)