commit 5ff97339dc1ba681d2e728c69dee9b5f8135b4f7
parent d38a5aa048a510c6e3a447874a48a91ac8f7d4a3
Author: d.levin256@gmail.com <d.levin256@gmail.com>
Date: Wed, 14 Nov 2018 00:56:48 +0300
Fix partition
Diffstat:
2 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/include/kfr/base/basic_expressions.hpp b/include/kfr/base/basic_expressions.hpp
@@ -75,7 +75,7 @@ struct expression_iterator
iterator end() const { return { *this, e1.size() }; }
E1 e1;
};
-}
+} // namespace internal
template <typename To, typename E>
CMT_INLINE internal::expression_convert<To, E> convert(E&& expr)
@@ -171,7 +171,7 @@ struct expression_writer
size_t m_position = 0;
E1 e1;
};
-}
+} // namespace internal
template <typename T, typename E1>
internal::expression_reader<T, E1> reader(E1&& e1)
@@ -350,13 +350,13 @@ struct expression_adjacent : expression_base<E>
{
const vec<T, N> in = this->argument_first(cinput, index, vec_t<T, N>());
const vec<T, N> delayed = insertleft(data, in);
- data = in[N - 1];
+ data = in[N - 1];
return this->fn(in, delayed);
}
Fn fn;
mutable value_type data = value_type(0);
};
-}
+} // namespace internal
template <typename E1>
CMT_INLINE internal::expression_slice<E1> slice(E1&& e1, size_t start, size_t size = infinite_size)
@@ -451,7 +451,7 @@ struct expression_padded : expression_base<E>
value_type fill_value;
const size_t input_size;
};
-}
+} // namespace internal
/**
* @brief Returns infinite template expression that pads e with fill_value (default value = 0)
@@ -535,7 +535,7 @@ private:
swallow{ (std::get<indices>(this->args)(coutput, index, xx[indices]), void(), 0)... };
}
};
-}
+} // namespace internal
template <typename... E, KFR_ENABLE_IF(is_output_expressions<E...>::value)>
internal::expression_unpack<E...> unpack(E&&... e)
@@ -564,9 +564,10 @@ struct task_partition
size_t count;
size_t operator()(size_t index)
{
- if (index > count)
+ if (index >= count)
return 0;
- return process(output, input, index * chunk_size, chunk_size);
+ return process(output, input, index * chunk_size,
+ index == count - 1 ? size - (count - 1) * chunk_size : chunk_size);
}
};
diff --git a/tests/expression_test.cpp b/tests/expression_test.cpp
@@ -114,7 +114,7 @@ constexpr inline size_t fast_range_sum(size_t stop) { return stop * (stop + 1) /
TEST(partition)
{
{
- univector<double, 400> output = zeros();
+ univector<double, 371> output = zeros();
auto result = partition(output, counter(), 5, 1);
CHECK(result.count == 5);
CHECK(result.chunk_size == 80);
@@ -128,11 +128,11 @@ TEST(partition)
result(3);
CHECK(sum(output) >= fast_range_sum(320 - 1));
result(4);
- CHECK(sum(output) == fast_range_sum(400 - 1));
+ CHECK(sum(output) == fast_range_sum(371 - 1));
}
{
- univector<double, 400> output = zeros();
+ univector<double, 371> output = zeros();
auto result = partition(output, counter(), 5, 160);
CHECK(result.count == 3);
CHECK(result.chunk_size == 160);
@@ -142,7 +142,7 @@ TEST(partition)
result(1);
CHECK(sum(output) >= fast_range_sum(320 - 1));
result(2);
- CHECK(sum(output) == fast_range_sum(400 - 1));
+ CHECK(sum(output) == fast_range_sum(371 - 1));
}
}