1use super::ot_shaper_arabic::hb_arabic_joining_type_t::{
4    self, GroupAlaph as A, GroupDalathRish as DR, D, L, R, T, U, X,
5};
6
7#[rustfmt::skip]
8pub const JOINING_TABLE: &[hb_arabic_joining_type_t] = &[
9
10  U,U,U,U,U,U,X,X,U,X,X,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
13  D,U,R,R,R,R,D,R,D,R,D,D,D,D,D,R,R,R,R,D,D,D,D,D,D,D,D,D,D,D,D,D,
14  D,D,D,D,D,D,D,D,R,D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
15  X,X,X,X,X,X,X,X,X,X,X,X,X,X,D,D,X,R,R,R,U,R,R,R,D,D,D,D,D,D,D,D,
16  D,D,D,D,D,D,D,D,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,D,D,D,D,D,D,
17  D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
18  R,D,D,R,R,R,R,R,R,R,R,R,D,R,D,R,D,D,R,R,X,R,X,X,X,X,X,X,X,U,X,X,
19  X,X,X,X,X,X,X,X,X,X,X,X,X,X,R,R,X,X,X,X,X,X,X,X,X,X,D,D,D,X,X,D,
20
21  X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,T,A,X,D,D,D,DR,DR,R,R,R,D,D,D,D,R,D,
24  D,D,D,D,D,D,D,D,R,D,DR,D,R,D,D,DR,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
25  X,X,X,X,X,X,X,X,X,X,X,X,X,R,D,D,
26
27  D,D,D,D,D,D,D,D,D,R,R,R,D,D,D,D,
30  D,D,D,D,D,D,D,D,D,D,D,R,R,D,D,D,D,R,D,R,R,D,D,D,R,R,D,D,D,D,D,D,
31
32  X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
35  X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
36
37  X,X,X,X,X,X,X,X,X,X,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
40  D,D,D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,D,X,X,X,X,X,
41
42  X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
45  X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
46
47  R,D,D,D,D,D,R,R,D,R,D,D,D,D,D,D,D,D,D,D,R,D,R,R,R,X,X,X,X,X,X,X,
50
51  D,U,D,D,D,D,U,R,D,R,R,X,X,X,X,X,
54
55  R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,
58  R,R,R,D,D,D,D,U,U,D,D,D,D,D,R,X,U,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
59
60  D,D,D,D,D,D,D,D,D,D,R,R,R,U,R,D,D,R,R,D,D,D,D,D,D,R,D,D,D,D,D,D,
63  D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
64  X,X,U,
65
66  U,D,X,X,D,X,X,X,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
69  D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
70  D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
71  D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,
72  U,U,U,U,U,T,T,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
73  D,D,D,D,D,D,D,D,D,X,D,
74
75  U,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
78  X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
79  X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
80  X,X,X,X,X,X,U,U,U,U,
81
82  D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
85  D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,L,U,
86
87  D,D,D,D,D,R,U,R,U,R,R,U,U,L,R,R,R,R,R,D,D,D,D,L,D,D,D,D,D,R,D,D,
90  D,R,U,U,R,X,X,X,X,X,X,D,D,D,D,R,
91
92  D,R,D,R,R,R,D,D,D,R,D,D,R,D,R,R,D,R,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
95  X,X,X,X,X,X,X,X,X,R,R,R,R,D,D,U,
96
97  L,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
100  D,D,R,D,
101
102  R,D,D,
105
106  D,D,D,R,D,D,D,D,D,D,D,D,D,D,D,D,
109  D,D,D,D,D,U,X,X,X,X,X,X,X,X,X,X,X,D,D,D,R,X,X,X,X,X,X,X,X,X,X,X,
110  X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
111
112  D,D,D,D,R,R,D,D,D,D,D,D,D,D,D,D,
115  D,D,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
116  X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
117
118  D,U,D,D,R,R,R,U,D,R,R,D,D,R,D,D,
121  U,D,R,R,D,U,U,U,U,R,D,L,
122
123  U,X,X,
126  X,X,X,X,X,X,X,X,X,X,X,X,X,U,
127
128  D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
131  D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
132  D,D,D,D,X,X,X,X,X,X,X,T,
133];
134
135const JOINING_OFFSET_0X0600: usize = 0;
136const JOINING_OFFSET_0X1806: usize = 739;
137const JOINING_OFFSET_0X200C: usize = 904;
138const JOINING_OFFSET_0XA840: usize = 998;
139const JOINING_OFFSET_0X10AC0: usize = 1050;
140const JOINING_OFFSET_0X10B80: usize = 1098;
141const JOINING_OFFSET_0X10D00: usize = 1146;
142const JOINING_OFFSET_0X10EC2: usize = 1182;
143const JOINING_OFFSET_0X10F30: usize = 1185;
144const JOINING_OFFSET_0X110BD: usize = 1341;
145const JOINING_OFFSET_0X1E900: usize = 1358;
146
147pub fn joining_type(u: char) -> hb_arabic_joining_type_t {
148    let u = u as u32;
149    match u >> 12 {
150        0x0 => {
151            if (0x0600..=0x08E2).contains(&u) {
152                return JOINING_TABLE[u as usize - 0x0600 + JOINING_OFFSET_0X0600];
153            }
154        }
155        0x1 => {
156            if (0x1806..=0x18AA).contains(&u) {
157                return JOINING_TABLE[u as usize - 0x1806 + JOINING_OFFSET_0X1806];
158            }
159        }
160        0x2 => {
161            if (0x200C..=0x2069).contains(&u) {
162                return JOINING_TABLE[u as usize - 0x200C + JOINING_OFFSET_0X200C];
163            }
164        }
165        0xA => {
166            if (0xA840..=0xA873).contains(&u) {
167                return JOINING_TABLE[u as usize - 0xA840 + JOINING_OFFSET_0XA840];
168            }
169        }
170        0x10 => {
171            if (0x10AC0..=0x10AEF).contains(&u) {
172                return JOINING_TABLE[u as usize - 0x10AC0 + JOINING_OFFSET_0X10AC0];
173            }
174            if (0x10B80..=0x10BAF).contains(&u) {
175                return JOINING_TABLE[u as usize - 0x10B80 + JOINING_OFFSET_0X10B80];
176            }
177            if (0x10D00..=0x10D23).contains(&u) {
178                return JOINING_TABLE[u as usize - 0x10D00 + JOINING_OFFSET_0X10D00];
179            }
180            if (0x10EC2..=0x10EC4).contains(&u) {
181                return JOINING_TABLE[u as usize - 0x10EC2 + JOINING_OFFSET_0X10EC2];
182            }
183            if (0x10F30..=0x10FCB).contains(&u) {
184                return JOINING_TABLE[u as usize - 0x10F30 + JOINING_OFFSET_0X10F30];
185            }
186        }
187        0x11 => {
188            if (0x110BD..=0x110CD).contains(&u) {
189                return JOINING_TABLE[u as usize - 0x110BD + JOINING_OFFSET_0X110BD];
190            }
191        }
192        0x1E => {
193            if (0x1E900..=0x1E94B).contains(&u) {
194                return JOINING_TABLE[u as usize - 0x1E900 + JOINING_OFFSET_0X1E900];
195            }
196        }
197        _ => {}
198    }
199
200    X
201}