alsk/celero/bone/common.h

58 lines
2.0 KiB
C++

#ifndef ALSK_CELERO_BONE_COMMON_H
#define ALSK_CELERO_BONE_COMMON_H
#include <algorithm>
#include <cstdint>
#include <vector>
#include <celero/Celero.h>
#include <alsk/alsk.h>
namespace bench {
using Data = std::vector<int>;
using Value = Data::value_type;
struct Task {
std::size_t size;
Data operator()(int min, int max) const;
// TODO inline version: improve benchmarking for skeleton?
// Data operator()(int min, int max) const {
// Data v(size);
// std::generate_n(std::begin(v), size, [&, i=0]() mutable { return (++i)%(max-min+1) + min; });
// return v;
// };
};
constexpr auto eTask = alsk::edsl::makeOperand<Data(int, int), Task>();
constexpr auto eTaskStdFun = alsk::edsl::makeOperand<Data(int, int), std::function<Data(int, int)>>();
template<std::size_t count>
void taskV() {
std::vector<int> v(count);
std::generate_n(std::begin(v), count, [i=0]() mutable { return i++; });
for(std::size_t i = 0; i < count; ++i)
celero::DoNotOptimizeAway(std::accumulate(begin(v), end(v), i));
}
template<std::size_t count>
constexpr auto eTaskV = alsk::edsl::makeOperand<void(), FN(taskV<count>)>();
template<std::size_t count>
constexpr auto eTaskVStdFun = alsk::edsl::makeOperand<void(), std::function<void()>>();
Data taskD(Data const&);
constexpr auto eTaskD = alsk::edsl::makeOperand<Data(Data const&), FN(taskD)>();
constexpr auto eTaskDStdFun = alsk::edsl::makeOperand<Data(Data const&), std::function<Data(Data const&)>>();
Data const& select(Data const&, Data const&);
constexpr auto eSelect = alsk::edsl::makeOperand<Data(Data const&, Data const&), FN(select)>();
constexpr auto eSelectStdFun = alsk::edsl::makeOperand<Data(Data const&, Data const&), std::function<Data(Data const&, Data const&)>>();
Value project(Data const&, Value const&);
constexpr auto eProject = alsk::edsl::makeOperand<Value(Data const&, Value const&), FN(project)>();
constexpr auto eProjectStdFun = alsk::edsl::makeOperand<Value(Data const&, Value const&), std::function<Value(Data const&, Value const&)>>();
}
#endif