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