comparison liboctave/Array-fC.cc @ 8700:314be237cd5b

sorting optimizations
author Jaroslav Hajek <highegg@gmail.com>
date Mon, 09 Feb 2009 13:05:35 +0100
parents 7cbe01c21986
children e9cb742df9eb
comparison
equal deleted inserted replaced
8699:6e764b7317bd 8700:314be237cd5b
29 29
30 #include "oct-cmplx.h" 30 #include "oct-cmplx.h"
31 31
32 #include "Array.h" 32 #include "Array.h"
33 #include "Array.cc" 33 #include "Array.cc"
34 #include "oct-sort.cc"
34 35
35 static float 36 static float
36 xabs (const FloatComplex& x) 37 xabs (const FloatComplex& x)
37 { 38 {
38 return (xisinf (x.real ()) || xisinf (x.imag ())) ? octave_Float_Inf : abs (x); 39 return (xisinf (x.real ()) || xisinf (x.imag ())) ? octave_Float_Inf : abs (x);
39 } 40 }
40 41
41 static bool
42 operator < (const FloatComplex& a, const FloatComplex& b)
43 {
44 return (xisnan (b) || (xabs (a) < xabs (b))
45 || ((xabs (a) == xabs (b)) && (arg (a) < arg (b))));
46 }
47
48 static bool
49 operator > (const FloatComplex& a, const FloatComplex& b)
50 {
51 return (xisnan (a) || (xabs (a) > xabs (b))
52 || ((xabs (a) == xabs (b)) && (arg (a) > arg (b))));
53 }
54
55 // This file must be included after the < and > operators are
56 // defined to avoid errors with the Intel C++ compiler.
57 #include "oct-sort.cc"
58
59 template <> 42 template <>
60 bool 43 bool
61 ascending_compare (FloatComplex a, FloatComplex b) 44 octave_sort<FloatComplex>::ascending_compare (FloatComplex a, FloatComplex b)
62 { 45 {
63 return (xisnan (b) || (xabs (a) < xabs (b)) 46 return (xisnan (b) || (xabs (a) < xabs (b))
64 || ((xabs (a) == xabs (b)) && (arg (a) < arg (b)))); 47 || ((xabs (a) == xabs (b)) && (arg (a) < arg (b))));
65 } 48 }
66 49
67 template <> 50 template <>
68 bool 51 bool
69 ascending_compare (vec_index<FloatComplex> *a, vec_index<FloatComplex> *b) 52 octave_sort<FloatComplex>::descending_compare (FloatComplex a, FloatComplex b)
70 {
71 return (xisnan (b->vec)
72 || (xabs (a->vec) < xabs (b->vec))
73 || ((xabs (a->vec) == xabs (b->vec))
74 && (arg (a->vec) < arg (b->vec))));
75 }
76
77 template <>
78 bool
79 descending_compare (FloatComplex a, FloatComplex b)
80 { 53 {
81 return (xisnan (a) || (xabs (a) > xabs (b)) 54 return (xisnan (a) || (xabs (a) > xabs (b))
82 || ((xabs (a) == xabs (b)) && (arg (a) > arg (b)))); 55 || ((xabs (a) == xabs (b)) && (arg (a) > arg (b))));
83 }
84
85 template <>
86 bool
87 descending_compare (vec_index<FloatComplex> *a, vec_index<FloatComplex> *b)
88 {
89 return (xisnan (a->vec)
90 || (xabs (a->vec) > xabs (b->vec))
91 || ((xabs (a->vec) == xabs (b->vec))
92 && (arg (a->vec) > arg (b->vec))));
93 } 56 }
94 57
95 INSTANTIATE_ARRAY_SORT (FloatComplex); 58 INSTANTIATE_ARRAY_SORT (FloatComplex);
96 59
97 INSTANTIATE_ARRAY_AND_ASSIGN (FloatComplex, OCTAVE_API); 60 INSTANTIATE_ARRAY_AND_ASSIGN (FloatComplex, OCTAVE_API);