#pragma once #include #include template static bool diff_results(benchmark::State &state, const T &result, const T &reference); template struct result_differ { static bool diff(benchmark::State &state, const T &result, const T &reference) { if (result != reference) { std::stringstream str; str << "result incorrect: " << result << " ... reference: " << reference; state.SkipWithError(str.str().data()); return false; } return true; } }; template struct result_differ> { static bool diff(benchmark::State &state, const std::vector &result, const std::vector &reference) { auto result_iter = result.begin(); auto reference_iter = reference.begin(); while (result_iter != result.end() && reference_iter != reference.end()) { if (!diff_results(state, *result_iter, *reference_iter)) { return false; } result_iter++; reference_iter++; } if (result_iter != result.end()) { std::stringstream str; str << "extra results (got " << result.size() << ", expected " << reference.size() << "): first extra element: " << *result_iter; state.SkipWithError(str.str().data()); return false; } else if (reference_iter != reference.end()) { std::stringstream str; str << "missing results (got " << result.size() << ", expected " << reference.size() << "): first missing element: " << *reference_iter; state.SkipWithError(str.str().data()); return false; } return true; } }; template static bool diff_results(benchmark::State &state, const T &result, const T &reference) { return result_differ::diff(state, result, reference); }