/* * * Copyright (c) 1994 * Hewlett-Packard Company * */ #ifndef DATA_GENERATOR_H #define DATA_GENERATOR_H #include #include "assert.H" #include "statist.H" #include "statist.C" #include "permutation.H" template void iota(Iterator first, Iterator last, T value, ptrdiff_t step) { ASSERT(step); while (!(first == last)) { ptrdiff_t j = step; while (!(first == last) && j--) *first++ = value; value += step; } } template void reverseIota(Iterator first, Iterator last, T value) { while (!(first == last)) *first++ = value--; } template void reverseIota(Iterator first, Iterator last, T value, ptrdiff_t step) { iota(first, last, value, step); reverse(first, last); } template void randomIota(Iterator first, Iterator last) { iota(first, last, 0); randomShuffle(first, last); } template void randomIota(Iterator first, Iterator last, ptrdiff_t step) { iota(first, last, 0, step); randomShuffle(first, last); } template void hill(Iterator first, Iterator last) { Iterator middle = first + (last - first)/2; iota(first, middle, 0); reverseIota(middle, last, last - middle); } template void hill(Iterator first, Iterator last, ptrdiff_t step) { Iterator middle = first + (last - first)/2; iota(first, middle, 0, step); reverseIota(middle, last, 0, step); } template void valley(Iterator first, Iterator last) { Iterator middle = first + (last - first)/2; reverseIota(first, middle, last - middle); iota(middle, last, 0); } template void valley(Iterator first, Iterator last, ptrdiff_t step) { Iterator middle = first + (last - first)/2; reverseIota(first, middle, 0, step); iota(middle, last, 0, step); } template void doubleIota(Iterator first, Iterator last) { Iterator middle = first + (last - first)/2; iota(first, middle, 0); iota(middle, last, 0); } template void doubleIota(Iterator first, Iterator last, ptrdiff_t step) { Iterator middle = first + (last - first)/2; iota(first, middle, 0, step); iota(middle, last, 0, step); } template void doubleReverseIota(Iterator first, Iterator last) { Iterator middle = first + (last - first)/2; reverseIota(first, middle, middle - first); reverseIota(middle, last, last - middle); } template void doubleReverseIota(Iterator first, Iterator last, ptrdiff_t step) { Iterator middle = first + (last - first)/2; reverseIota(first, middle, 0, step); reverseIota(middle, last, 0, step); } template void zipfian(Iterator first, Iterator last, ptrdiff_t numValues) { zipf z(numValues); while (first != last) *first++ = z.random(); } #endif