46 typedef std::vector<unsigned int> shape;
51 unsigned int d_highest_offset;
56 unsigned int d_offset;
67 Odometer(shape shape) : d_shape(shape), d_offset(0)
69 d_rank = d_shape.size();
73 for (
unsigned int i = 0; i < d_rank; ++i) {
74 d_highest_offset *= d_shape.at(i);
77 d_indices.resize(d_rank, 0);
82 Odometer(
unsigned int x,
unsigned int y) : d_offset(0)
90 for (
unsigned int i = 0; i < d_rank; ++i) {
91 d_highest_offset *= d_shape.at(i);
94 d_indices.resize(d_rank, 0);
113 for (
unsigned int i = 0; i < d_rank; ++i)
132 shape::reverse_iterator si = d_shape.rbegin();
133 for (shape::reverse_iterator i = d_indices.rbegin(), e = d_indices.rend(); i != e; ++i, ++si) {
146 unsigned int next_safe();
160 unsigned int chunk_size = 1;
165 shape::reverse_iterator si = d_shape.rbegin();
166 for (shape::reverse_iterator i = d_indices.rbegin(), e = d_indices.rend(); i != e; ++i, ++si) {
168 d_offset += chunk_size * *i;
172 shape::reverse_iterator shape_index = d_shape.rbegin();
173 shape::reverse_iterator index = d_indices.rbegin(), index_end = d_indices.rend();
175 unsigned int chunk_size = *shape_index++;
176 while (index != index_end) {
177 d_offset += chunk_size * *index++;
178 chunk_size *= *shape_index++;
187 std::copy(
indices.begin(),
indices.end(), std::back_inserter(temp));
220 return d_highest_offset;