@@ -38,44 +38,76 @@ t_argsort_comparator::t_argsort_comparator(
3838
3939bool
4040t_argsort_comparator::operator ()(t_index a, t_index b) const {
41- const t_tscalar& first = m_v[a];
42- const t_tscalar& second = m_v[b];
43-
4441 switch (m_sort_type) {
45- case SORTTYPE_ASCENDING: {
46- return (first < second);
47- } break ;
48- case SORTTYPE_DESCENDING: {
49- return (first > second);
50- } break ;
51- case SORTTYPE_ASCENDING_ABS: {
52- return std::abs (first.to_double ()) < std::abs (second.to_double ());
53- } break ;
54- case SORTTYPE_DESCENDING_ABS: {
55-
56- return std::abs (first.to_double ()) > std::abs (second.to_double ());
57- } break ;
58- case SORTTYPE_NONE: {
59- return a < b;
60- }
42+ case SORTTYPE_ASCENDING:
43+ return t_argsort_comparator_impl<SORTTYPE_ASCENDING>(m_v)(a, b);
44+ case SORTTYPE_DESCENDING:
45+ return t_argsort_comparator_impl<SORTTYPE_DESCENDING>(m_v)(a, b);
46+ case SORTTYPE_ASCENDING_ABS:
47+ return t_argsort_comparator_impl<SORTTYPE_ASCENDING_ABS>(m_v)(a, b);
48+ case SORTTYPE_DESCENDING_ABS:
49+ return t_argsort_comparator_impl<SORTTYPE_DESCENDING_ABS>(m_v)(
50+ a, b
51+ );
52+ case SORTTYPE_NONE:
53+ return t_argsort_comparator_impl<SORTTYPE_NONE>(m_v)(a, b);
6154 }
6255
6356 return a < b;
6457}
6558
59+ namespace {
60+
61+ void
62+ init_output (std::vector<t_index>& output) {
63+ for (t_index i = 0 , loop_end = output.size (); i != loop_end; ++i) {
64+ output[i] = i;
65+ }
66+ }
67+
68+ } // anonymous namespace
69+
6670void
6771simple_argsort (
6872 std::vector<t_tscalar>& v,
6973 std::vector<t_index>& output,
7074 const t_sorttype& sort_type
7175) {
72- // Output should be the same size is v
73- for (t_index i = 0 , loop_end = output.size (); i != loop_end; ++i) {
74- output[i] = i;
75- }
76- t_argsort_comparator cmp (v, sort_type);
76+ init_output (output);
7777
78- std::sort (output.begin (), output.end (), cmp);
78+ switch (sort_type) {
79+ case SORTTYPE_ASCENDING: {
80+ std::sort (
81+ output.begin (),
82+ output.end (),
83+ t_argsort_comparator_impl<SORTTYPE_ASCENDING>(v)
84+ );
85+ } break ;
86+ case SORTTYPE_DESCENDING: {
87+ std::sort (
88+ output.begin (),
89+ output.end (),
90+ t_argsort_comparator_impl<SORTTYPE_DESCENDING>(v)
91+ );
92+ } break ;
93+ case SORTTYPE_ASCENDING_ABS: {
94+ std::sort (
95+ output.begin (),
96+ output.end (),
97+ t_argsort_comparator_impl<SORTTYPE_ASCENDING_ABS>(v)
98+ );
99+ } break ;
100+ case SORTTYPE_DESCENDING_ABS: {
101+ std::sort (
102+ output.begin (),
103+ output.end (),
104+ t_argsort_comparator_impl<SORTTYPE_DESCENDING_ABS>(v)
105+ );
106+ } break ;
107+ case SORTTYPE_NONE: {
108+ // output is already identity-initialized
109+ } break ;
110+ }
79111}
80112
81113} // namespace perspective
0 commit comments