Mercurial > hg > octave-nkf
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); |