Lines Matching full:level
2 // COPYRIGHT file at the top-level directory of this distribution.
10 //! Bidi Embedding Level
12 //! See [`Level`](struct.Level.html) for more details.
22 /// Embedding Level
27 /// This struct maintains a *valid* status for level numbers, meaning that creating a new level, or
28 /// mutating an existing level, with the value smaller than `0` (before conversion to `u8`) or
34 pub struct Level(u8); struct
36 pub const LTR_LEVEL: Level = Level(0);
37 pub const RTL_LEVEL: Level = Level(1);
40 /// During explicit level resolution, embedding level can go as high as `max_depth`.
42 /// During implicit level resolution, embedding level can go as high as `max_depth + 1`.
45 /// Errors that can occur on Level creation or mutation
48 /// Out-of-range (invalid) embedding level number.
52 impl Level { implementation
53 /// New LTR level with smallest number value (0).
55 pub fn ltr() -> Level { in ltr()
59 /// New RTL level with smallest number value (1).
61 pub fn rtl() -> Level { in rtl()
77 /// Create new level, fail if number is larger than `max_depth + 1`.
79 pub fn new(number: u8) -> Result<Level, Error> { in new() argument
81 Ok(Level(number)) in new()
87 /// Create new level, fail if number is larger than `max_depth`.
89 pub fn new_explicit(number: u8) -> Result<Level, Error> { in new_explicit() argument
91 Ok(Level(number)) in new_explicit()
99 /// The level number.
105 /// If this level is left-to-right.
111 /// If this level is right-to-left.
119 /// Raise level by `amount`, fail if number is larger than `max_depth + 1`.
135 /// Raise level by `amount`, fail if number is larger than `max_depth`.
151 /// Lower level by `amount`, fail if number goes below zero.
165 /// The next LTR (even) level greater than this, or fail if number is larger than `max_depth`.
167 pub fn new_explicit_next_ltr(&self) -> Result<Level, Error> { in new_explicit_next_ltr() argument
168 Level::new_explicit((self.0 + 2) & !1) in new_explicit_next_ltr()
171 /// The next RTL (odd) level greater than this, or fail if number is larger than `max_depth`.
173 pub fn new_explicit_next_rtl(&self) -> Result<Level, Error> { in new_explicit_next_rtl() argument
174 Level::new_explicit((self.0 + 1) | 1) in new_explicit_next_rtl()
177 /// The lowest RTL (odd) level greater than or equal to this, or fail if number is larger than
180 pub fn new_lowest_ge_rtl(&self) -> Result<Level, Error> { in new_lowest_ge_rtl() argument
181 Level::new(self.0 | 1) in new_lowest_ge_rtl()
184 /// Generate a character type based on a level (as specified in steps X10 and N2).
194 pub fn vec(v: &[u8]) -> Vec<Level> { in vec() argument
199 /// If levels has any RTL (odd) level
201 /// This information is usually used to skip re-ordering of text when no RTL level is present
203 pub fn has_rtl(levels: &[Level]) -> bool { in has_rtl()
207 impl Into<u8> for Level { implementation
208 /// Convert to the level number
215 impl From<u8> for Level { implementation
216 /// Create level by number
218 fn from(number: u8) -> Level { in from() argument
219 Level::new(number).expect("Level number error") in from()
224 impl<'a> PartialEq<&'a str> for Level { implementation
232 impl<'a> PartialEq<String> for Level { implementation
245 assert_eq!(Level::new(0), Ok(Level(0))); in test_new()
246 assert_eq!(Level::new(1), Ok(Level(1))); in test_new()
247 assert_eq!(Level::new(10), Ok(Level(10))); in test_new()
248 assert_eq!(Level::new(125), Ok(Level(125))); in test_new()
249 assert_eq!(Level::new(126), Ok(Level(126))); in test_new()
250 assert_eq!(Level::new(127), Err(Error::OutOfRangeNumber)); in test_new()
251 assert_eq!(Level::new(255), Err(Error::OutOfRangeNumber)); in test_new()
256 assert_eq!(Level::new_explicit(0), Ok(Level(0))); in test_new_explicit()
257 assert_eq!(Level::new_explicit(1), Ok(Level(1))); in test_new_explicit()
258 assert_eq!(Level::new_explicit(10), Ok(Level(10))); in test_new_explicit()
259 assert_eq!(Level::new_explicit(125), Ok(Level(125))); in test_new_explicit()
260 assert_eq!(Level::new_explicit(126), Err(Error::OutOfRangeNumber)); in test_new_explicit()
261 assert_eq!(Level::new_explicit(255), Err(Error::OutOfRangeNumber)); in test_new_explicit()
266 assert_eq!(Level(0).is_ltr(), true); in test_is_ltr()
267 assert_eq!(Level(1).is_ltr(), false); in test_is_ltr()
268 assert_eq!(Level(10).is_ltr(), true); in test_is_ltr()
269 assert_eq!(Level(11).is_ltr(), false); in test_is_ltr()
270 assert_eq!(Level(124).is_ltr(), true); in test_is_ltr()
271 assert_eq!(Level(125).is_ltr(), false); in test_is_ltr()
276 assert_eq!(Level(0).is_rtl(), false); in test_is_rtl()
277 assert_eq!(Level(1).is_rtl(), true); in test_is_rtl()
278 assert_eq!(Level(10).is_rtl(), false); in test_is_rtl()
279 assert_eq!(Level(11).is_rtl(), true); in test_is_rtl()
280 assert_eq!(Level(124).is_rtl(), false); in test_is_rtl()
281 assert_eq!(Level(125).is_rtl(), true); in test_is_rtl()
286 let mut level = Level::ltr(); in test_raise() localVariable
287 assert_eq!(level.number(), 0); in test_raise()
288 assert!(level.raise(100).is_ok()); in test_raise()
289 assert_eq!(level.number(), 100); in test_raise()
290 assert!(level.raise(26).is_ok()); in test_raise()
291 assert_eq!(level.number(), 126); in test_raise()
292 assert!(level.raise(1).is_err()); // invalid! in test_raise()
293 assert!(level.raise(250).is_err()); // overflow! in test_raise()
294 assert_eq!(level.number(), 126); in test_raise()
299 let mut level = Level::ltr(); in test_raise_explicit() localVariable
300 assert_eq!(level.number(), 0); in test_raise_explicit()
301 assert!(level.raise_explicit(100).is_ok()); in test_raise_explicit()
302 assert_eq!(level.number(), 100); in test_raise_explicit()
303 assert!(level.raise_explicit(25).is_ok()); in test_raise_explicit()
304 assert_eq!(level.number(), 125); in test_raise_explicit()
305 assert!(level.raise_explicit(1).is_err()); // invalid! in test_raise_explicit()
306 assert!(level.raise_explicit(250).is_err()); // overflow! in test_raise_explicit()
307 assert_eq!(level.number(), 125); in test_raise_explicit()
312 let mut level = Level::rtl(); in test_lower() localVariable
313 assert_eq!(level.number(), 1); in test_lower()
314 assert!(level.lower(1).is_ok()); in test_lower()
315 assert_eq!(level.number(), 0); in test_lower()
316 assert!(level.lower(1).is_err()); // underflow! in test_lower()
317 assert!(level.lower(250).is_err()); // underflow! in test_lower()
318 assert_eq!(level.number(), 0); in test_lower()
323 assert_eq!(has_rtl(&Level::vec(&[0, 0, 0])), false); in test_has_rtl()
324 assert_eq!(has_rtl(&Level::vec(&[0, 1, 0])), true); in test_has_rtl()
325 assert_eq!(has_rtl(&Level::vec(&[0, 2, 0])), false); in test_has_rtl()
326 assert_eq!(has_rtl(&Level::vec(&[0, 125, 0])), true); in test_has_rtl()
327 assert_eq!(has_rtl(&Level::vec(&[0, 126, 0])), false); in test_has_rtl()
332 let level = Level::rtl(); in test_into() localVariable
333 let number: u8 = level.into(); in test_into()
340 Level::vec(&[0, 1, 125]), in test_vec()
341 vec![Level(0), Level(1), Level(125)] in test_vec()
347 assert_eq!(Level::vec(&[0, 1, 4, 125]), vec!["0", "1", "x", "125"]); in test_str_eq()
348 assert_ne!(Level::vec(&[0, 1, 4, 125]), vec!["0", "1", "5", "125"]); in test_str_eq()
354 Level::vec(&[0, 1, 4, 125]), in test_string_eq()
368 &Level::ltr(), in test_statics()
369 &[Token::NewtypeStruct { name: "Level" }, Token::U8(0)], in test_statics()
372 &Level::rtl(), in test_statics()
373 &[Token::NewtypeStruct { name: "Level" }, Token::U8(1)], in test_statics()
379 let level = Level::new(42).unwrap(); in test_new() localVariable
381 &level, in test_new()
382 &[Token::NewtypeStruct { name: "Level" }, Token::U8(42)], in test_new()