@@ -17,7 +17,7 @@ using namespace vxsort::types;
1717using ::vxsort::vector_machine;
1818
1919template <typename T, i32 Unroll, vector_machine M>
20- void vxsort_pattern_test (SortPattern , usize size, T first_value, T stride) {
20+ void vxsort_pattern_test (sort_pattern , usize size, T first_value, T stride) {
2121 VXSORT_TEST_ISA ();
2222
2323 auto V = unique_values<T>(size, first_value, stride);
@@ -57,64 +57,55 @@ void vxsort_hinted_test(std::vector<T>& V, T min_value, T max_value) {
5757 }
5858}
5959
60- static inline std::vector<SortPattern> test_patterns () {
60+ static inline std::vector<sort_pattern> fullsort_test_patterns () {
6161 return {
62- SortPattern ::unique_values,
63- SortPattern ::shuffled_16_values,
64- SortPattern ::all_equal,
62+ sort_pattern ::unique_values,
63+ // sort_pattern ::shuffled_16_values,
64+ // sort_pattern ::all_equal,
6565 };
6666}
6767
6868template <typename T>
69- struct SortTestParams2 {
69+ struct fullsort_test_params {
7070public:
71- SortTestParams2 (SortPattern pattern, usize size, i32 slack, T first_value, T value_stride)
72- : Pattern (pattern), Size (size), Slack (slack), FirstValue (first_value), ValueStride (value_stride) {}
73- SortPattern Pattern ;
74- usize Size ;
75- i32 Slack ;
76- T FirstValue ;
77- T ValueStride ;
71+ fullsort_test_params (sort_pattern pattern, usize size, i32 slack, T first_value, T value_stride)
72+ : pattern (pattern), size (size), slack (slack), first_value (first_value), stride (value_stride) {}
73+ sort_pattern pattern ;
74+ usize size ;
75+ i32 slack ;
76+ T first_value ;
77+ T stride ;
7878};
7979
80- class VxSortFixture : public testing ::Test {
81- public:
82- using FunctionType = std::function<void ()>;
83- explicit VxSortFixture (FunctionType fn) : _fn(std::move(fn)) {}
80+ template <typename T>
81+ std::vector<fullsort_test_params<T>>
82+ gen_params (usize start, usize stop, usize step, i32 slack, T first_value, T value_stride)
83+ {
84+ auto patterns = fullsort_test_patterns ();
8485
85- VxSortFixture (VxSortFixture const &) = delete ;
86+ using TestParams = fullsort_test_params<T>;
87+ std::vector<TestParams> tests;
8688
87- void TestBody () override {
88- _fn ();
89+ for (auto p : fullsort_test_patterns ()) {
90+ for (auto i : multiply_range<i32 >(start, stop, step)) {
91+ for (auto j : range<i32 >(-slack, slack, 1 )) {
92+ if ((i64 )i + j <= 0 )
93+ continue ;
94+ tests.push_back (fullsort_test_params<T>(p, i, j, first_value, value_stride));
95+ }
96+ }
8997 }
90-
91- private:
92- FunctionType _fn;
93- };
94-
95- template <class Lambda , class ... Args>
96- void RegisterSingleTest (const char * test_suite_name, const char * test_name,
97- const char * type_param, const char * value_param,
98- const char * file, int line,
99- Lambda&& fn, Args&&... args) {
100-
101- testing::RegisterTest (
102- test_suite_name, test_name, type_param, value_param,
103- file, line,
104- [=]() mutable -> testing::Test* { return new VxSortFixture (
105- [=]() mutable { fn (args...); });
106- });
98+ return tests;
10799}
108100
109-
110101template <vector_machine M, i32 U, typename T>
111- void register_fullsort_benchmarks (usize start, usize stop, usize step, T first_value, T value_stride) {
102+ void register_fullsort_tests (usize start, usize stop, usize step, T first_value, T value_stride) {
112103 if (step == 0 ) {
113104 throw std::invalid_argument (" step for range must be non-zero" );
114105 }
115106
116107 if constexpr (U >= 2 ) {
117- register_fullsort_benchmarks <M, U / 2 , T>(start, stop, step, first_value, value_stride);
108+ register_fullsort_tests <M, U / 2 , T>(start, stop, step, first_value, value_stride);
118109 }
119110
120111 using VM = vxsort::vxsort_machine_traits<T, M>;
@@ -124,31 +115,20 @@ void register_fullsort_benchmarks(usize start, usize stop, usize step, T first_v
124115 constexpr i32 slack = sizeof (typename VM::TV) / sizeof (T);
125116 static_assert (slack > 1 );
126117
127- std::vector<SortTestParams2<T>> tests;
128- size_t i = start;
129- for (auto p : test_patterns ()) {
130- while ((step > 0 ) ? (i <= stop) : (i > stop)) {
131- for (auto j : range<int >(-slack, slack, 1 )) {
132- if ((i64 )i + j <= 0 )
133- continue ;
134- tests.push_back (SortTestParams2<T>(p, i, j, first_value, value_stride));
135- }
136- i *= step;
137- }
138- }
118+ auto tests = gen_params (start, stop, step, slack, first_value, value_stride);
139119
140120 for (auto p : tests) {
141121 auto *test_type = get_canonical_typename<T>();
142122
143- auto test_size = p.Size + p.Slack ;
123+ auto test_size = p.size + p.slack ;
144124 auto test_name = fmt::format (" vxsort_pattern_test<{}, {}, {}>/{}/{}" , test_type, U,
145- magic_enum::enum_name (M), magic_enum::enum_name (p.Pattern ), test_size);
125+ magic_enum::enum_name (M), magic_enum::enum_name (p.pattern ), test_size);
146126
147- RegisterSingleTest (
127+ RegisterSingleLambdaTest (
148128 " fullsort" , test_name.c_str (), nullptr ,
149- std::to_string (p. Size ).c_str (),
129+ std::to_string (test_size ).c_str (),
150130 __FILE__, __LINE__,
151- vxsort_pattern_test<T, U, M>, p.Pattern , test_size, p.FirstValue , p.ValueStride );
131+ vxsort_pattern_test<T, U, M>, p.pattern , test_size, p.first_value , p.stride );
152132 }
153133}
154134
0 commit comments