@@ -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