1 // Copyright (c) 2021
2 // GeometryFactory (France),
3 //
4 // This file is part of CGAL (www.cgal.org)
5 //
6 // $URL: https://github.com/CGAL/cgal/blob/v5.3/Kernel_23/include/CGAL/rank.h $
7 // $Id: rank.h 7ebdd07 2021-03-30T14:28:55+01:00 Andreas Fabri
8 // SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
9 //
10 //
11 // Author(s) : Sebastien Loriot
12
13 #ifndef CGAL_RANK_H
14 #define CGAL_RANK_H
15
16 namespace CGAL {
17
18 template <class RT>
rank_11(const RT & a0)19 int rank_11(const RT& a0)
20 {
21 return a0!=0 ? 1 : 0;
22 }
23
24 template <class RT>
rank_21(const RT & a0,const RT & a1)25 int rank_21(const RT& a0, const RT& a1)
26 {
27 return (a0!=0 || a1 !=0) ? 1 : 0;
28 }
29
30 template <class RT>
rank_12(const RT & a0,const RT & a1)31 int rank_12(const RT& a0, const RT& a1)
32 {
33 return (a0!=0 || a1 !=0) ? 1 : 0;
34 }
35
36 template <class RT>
rank_31(const RT & a0,const RT & a1,const RT & a2)37 int rank_31(const RT& a0, const RT& a1, const RT& a2)
38 {
39 return (a0!=0 || a1 !=0 || a2 !=0) ? 1 : 0;
40 }
41
42 template <class RT>
rank_32(const RT & a0,const RT & b0,const RT & a1,const RT & b1,const RT & a2,const RT & b2)43 int rank_32(const RT& a0, const RT& b0,
44 const RT& a1, const RT& b1,
45 const RT& a2, const RT& b2)
46 {
47 if (a0==0)
48 {
49 if (a1==0)
50 {
51 if (a2==0)
52 {
53 return rank_31<RT>(b0,b1,b2);
54 }
55 else
56 {
57 return 1 + rank_21<RT>(b0, b1);
58 }
59 }
60 else
61 {
62 return 1 + rank_21<RT>(b0, a1*b2-a2*b1);
63 }
64 }
65 else
66 {
67 return 1 + rank_21<RT>(a0*b1-a1*b0, a0*b2-a2*b0);
68 }
69 }
70
71 template <class RT>
rank_22(const RT & a0,const RT & b0,const RT & a1,const RT & b1)72 int rank_22(const RT& a0, const RT& b0,
73 const RT& a1, const RT& b1)
74 {
75 if (a0==0)
76 {
77 if (a1==0)
78 {
79 return rank_21<RT>(b0,b1);
80 }
81 else
82 return 1 + rank_11<RT>(b0);
83 }
84 return 1 + rank_11<RT>(a0*b1-a1*b0);
85 }
86
87 template <class RT>
rank_33(const RT & a0,const RT & b0,const RT & c0,const RT & a1,const RT & b1,const RT & c1,const RT & a2,const RT & b2,const RT & c2)88 int rank_33(const RT& a0, const RT& b0, const RT& c0,
89 const RT& a1, const RT& b1, const RT& c1,
90 const RT& a2, const RT& b2, const RT& c2)
91 {
92 if (a0==0)
93 {
94 if (a1==0)
95 {
96 if (a2==0)
97 {
98 return rank_32<RT>(b0, c0, b1, c1, b2, c2);
99 }
100 else
101 {
102 return 1 + rank_22<RT>(b0, c0, b1, c1);
103 }
104 }
105 else
106 return 1 + rank_22<RT>(b0, c0, a1*b2-a2*b1, a1*c2-a2*c1);
107 }
108 else
109 {
110 return 1 + rank_22<RT>(a0*b1-a1*b0, a0*c1-a1*c0, a0*b2-a2*b0, a0*c2-a2*c0);
111 }
112 }
113
114
115 template <class RT>
rank_23(const RT & a0,const RT & b0,const RT & c0,const RT & a1,const RT & b1,const RT & c1)116 int rank_23(const RT& a0, const RT& b0, const RT& c0,
117 const RT& a1, const RT& b1, const RT& c1)
118 {
119 if (a0==0)
120 {
121 if (a1==0)
122 {
123 return rank_22<RT>(b0, c0, b1, c1);
124 }
125 else
126 return 1 + rank_12<RT>(b0,c0);
127 }
128 else
129 {
130 return 1 + rank_12<RT>(a0*b1-a1*b0,a0*c1-a1*c0);
131 }
132 }
133
134
135 template <class RT>
rank_34(const RT & a0,const RT & b0,const RT & c0,const RT & d0,const RT & a1,const RT & b1,const RT & c1,const RT & d1,const RT & a2,const RT & b2,const RT & c2,const RT & d2)136 int rank_34(const RT& a0, const RT& b0, const RT& c0, const RT& d0,
137 const RT& a1, const RT& b1, const RT& c1, const RT& d1,
138 const RT& a2, const RT& b2, const RT& c2, const RT& d2)
139 {
140 if (a0==0)
141 {
142 if (a1==0)
143 {
144 if (a2==0)
145 {
146 return rank_33<RT>(b0, c0, d0, b1, c1, d1, b2, c2, d2);
147 }
148 else
149 {
150 return 1 + rank_23<RT>(b0, c0, d0, b1, c1, d1);
151 }
152 }
153 else
154 return 1 + rank_23<RT>(b0, c0, d0,a1*b2-a2*b1, a1*c2-a2*c1, a1*d2 - a2*d1);
155 }
156 else
157 {
158 return 1 + rank_23<RT>(a0*b1-a1*b0, a0*c1-a1*c0, a0*d1-a1*d0, a0*b2-a2*b0, a0*c2-a2*c0, a0*d2-a2*d0);
159 }
160 }
161
162 } // namespace CGAL
163
164 #endif // CGAL_RANK_H
165