Skip to content

Commit

Permalink
refs #132 Внешнее управление сортировкой
Browse files Browse the repository at this point in the history
  • Loading branch information
izvolov committed Apr 17, 2021
1 parent d313381 commit d4705ec
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 37 deletions.
67 changes: 32 additions & 35 deletions benchmark/include/utility/io/generate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,15 @@ namespace utility
return result;
}

template <typename URNG, typename OutputIterator>
template <typename URNG, typename BinaryPredicate, typename OutputIterator>
OutputIterator
generate_sorted_part
(
URNG && generator,
std::size_t range_length,
std::int64_t min,
std::int64_t max,
bool descending,
BinaryPredicate order,
OutputIterator result
)
{
Expand All @@ -55,15 +55,7 @@ namespace utility

std::generate(range.begin(), range.end(),
[& uniform, & generator] {return uniform(generator);});

if (descending)
{
std::sort(range.begin(), range.end(), std::greater<>{});
}
else
{
std::sort(range.begin(), range.end());
}
std::sort(range.begin(), range.end(), order);

return std::copy(range.begin(), range.end(), result);
}
Expand Down Expand Up @@ -104,7 +96,7 @@ namespace utility
return bounds;
}

template <typename URNG, typename OutputIterator>
template <typename URNG, typename BinaryPredicate, typename OutputIterator>
OutputIterator
generate_one_blockwise
(
Expand All @@ -113,62 +105,67 @@ namespace utility
std::size_t range_length,
std::int64_t global_min,
std::int64_t global_max,
bool descending,
BinaryPredicate order,
OutputIterator result
)
{
auto bounds =
generate_block_bounds(generator, block_size, range_length, global_min, global_max);
if (descending)
{
std::sort(bounds.begin(), bounds.end(), std::greater<>{});
}
else
{
std::sort(bounds.begin(), bounds.end());
}
std::sort(bounds.begin(), bounds.end(), order);

*result++ = range_length;
for (auto i = 1ul; i < bounds.size() - 1; ++i)
{
const auto min = std::min(bounds[i - 1], bounds[i]);
const auto max = std::max(bounds[i - 1], bounds[i]);
result = generate_sorted_part(generator, block_size - 1, min, max, descending, result);
result = generate_sorted_part(generator, block_size - 1, min, max, order, result);
*result++ = bounds[i];
}
const auto min = std::min(bounds[bounds.size() - 2], bounds[bounds.size() - 1]);
const auto max = std::max(bounds[bounds.size() - 2], bounds[bounds.size() - 1]);
const auto remainder = range_length % block_size;
const auto tail = remainder != 0 ? remainder : block_size;
return generate_sorted_part(generator, tail, min, max, descending, result);
return generate_sorted_part(generator, tail, min, max, order, result);
}

template <typename URNG, typename BinaryPredicate, typename OutputIterator>
OutputIterator
generate_sorted
(
URNG && generator,
std::size_t block_size,
std::size_t range_count,
std::size_t range_length,
std::int64_t min,
std::int64_t max,
BinaryPredicate order,
OutputIterator result
)
{
for (std::size_t i = 0; i < range_count; ++i)
{
result =
generate_one_blockwise(generator, block_size, range_length, min, max, order, result);
}

return result;
}

template <typename URNG, typename OutputIterator>
OutputIterator
generate
(
URNG && generator,
std::size_t block_size,
std::size_t range_count,
std::size_t range_length,
std::int64_t min,
std::int64_t max,
bool sort,
bool descending,
OutputIterator result
)
{
for (std::size_t i = 0; i < range_count; ++i)
{
if (sort)
{
result =
generate_one_blockwise(generator, block_size, range_length, min, max, descending, result);
}
else
{
result = generate_one(generator, range_length, min, max, result);
}
result = generate_one(generator, range_length, min, max, result);
}

return result;
Expand Down
51 changes: 49 additions & 2 deletions benchmark/tools/range_generator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,47 @@
#include <iostream>
#include <limits>

template <typename URNG>
void
do_generate_sorted
(
URNG && generator,
std::ostream & stream,
std::size_t block_size,
std::size_t range_count,
std::size_t range_length,
std::int64_t min,
std::int64_t max,
bool descending
)
{
auto result = burst::make_binary_ostream_iterator(stream);
if (descending)
{
utility::generate_sorted(generator, block_size, range_count, range_length, min, max, std::greater<>{}, result);
}
else
{
utility::generate_sorted(generator, block_size, range_count, range_length, min, max, std::less<>{}, result);
}
}

template <typename URNG>
void
do_generate
(
URNG && generator,
std::ostream & stream,
std::size_t range_count,
std::size_t range_length,
std::int64_t min,
std::int64_t max
)
{
auto result = burst::make_binary_ostream_iterator(stream);
utility::generate(generator, range_count, range_length, min, max, result);
}

void
do_generate
(
Expand All @@ -33,8 +74,14 @@ void
: 0;
std::default_random_engine generator(seed_value);

auto result = burst::make_binary_ostream_iterator(stream);
utility::generate(generator, block_size, range_count, range_length, min, max, sort, descending, result);
if (sort)
{
do_generate_sorted(generator, stream, block_size, range_count, range_length, min, max, descending);
}
else
{
do_generate(generator, stream, range_count, range_length, min, max);
}
}

int main (int argc, const char * argv[])
Expand Down

0 comments on commit d4705ec

Please sign in to comment.