• Home
  • Raw
  • Download

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.
23 /// Embedding Level
28 /// This struct maintains a *valid* status for level numbers, meaning that creating a new level, or
29 /// mutating an existing level, with the value smaller than `0` (before conversion to `u8`) or
36 pub struct Level(u8); struct
38 pub const LTR_LEVEL: Level = Level(0);
39 pub const RTL_LEVEL: Level = Level(1);
42 /// During explicit level resolution, embedding level can go as high as `max_depth`.
44 /// During implicit level resolution, embedding level can go as high as `max_depth + 1`.
47 /// Errors that can occur on Level creation or mutation
50 /// Out-of-range (invalid) embedding level number.
54 impl Level { implementation
55 /// New LTR level with smallest number value (0).
57 pub fn ltr() -> Level { in ltr()
61 /// New RTL level with smallest number value (1).
63 pub fn rtl() -> Level { in rtl()
79 /// Create new level, fail if number is larger than `max_depth + 1`.
81 pub fn new(number: u8) -> Result<Level, Error> { in new() argument
83 Ok(Level(number)) in new()
89 /// Create new level, fail if number is larger than `max_depth`.
91 pub fn new_explicit(number: u8) -> Result<Level, Error> { in new_explicit() argument
93 Ok(Level(number)) in new_explicit()
101 /// The level number.
107 /// If this level is left-to-right.
113 /// If this level is right-to-left.
121 /// Raise level by `amount`, fail if number is larger than `max_depth + 1`.
137 /// Raise level by `amount`, fail if number is larger than `max_depth`.
153 /// Lower level by `amount`, fail if number goes below zero.
167 /// The next LTR (even) level greater than this, or fail if number is larger than `max_depth`.
169 pub fn new_explicit_next_ltr(&self) -> Result<Level, Error> { in new_explicit_next_ltr() argument
170 Level::new_explicit((self.0 + 2) & !1) in new_explicit_next_ltr()
173 /// The next RTL (odd) level greater than this, or fail if number is larger than `max_depth`.
175 pub fn new_explicit_next_rtl(&self) -> Result<Level, Error> { in new_explicit_next_rtl() argument
176 Level::new_explicit((self.0 + 1) | 1) in new_explicit_next_rtl()
179 /// The lowest RTL (odd) level greater than or equal to this, or fail if number is larger than
182 pub fn new_lowest_ge_rtl(&self) -> Result<Level, Error> { in new_lowest_ge_rtl() argument
183 Level::new(self.0 | 1) in new_lowest_ge_rtl()
186 /// Generate a character type based on a level (as specified in steps X10 and N2).
196 pub fn vec(v: &[u8]) -> Vec<Level> { in vec() argument
202 /// Does _not_ check if each level is within bounds (`<=` [`MAX_IMPLICIT_DEPTH`]),
204 pub fn from_slice_unchecked(v: &[u8]) -> &[Level] { in from_slice_unchecked() argument
205 debug_assert_eq!(core::mem::size_of::<u8>(), core::mem::size_of::<Level>()); in from_slice_unchecked()
208 // Level is `repr(transparent)` over `u8` in from_slice_unchecked()
209 slice::from_raw_parts(v as *const [u8] as *const u8 as *const Level, v.len()) in from_slice_unchecked() constant
214 /// If levels has any RTL (odd) level
216 /// This information is usually used to skip re-ordering of text when no RTL level is present
218 pub fn has_rtl(levels: &[Level]) -> bool { in has_rtl()
222 impl Into<u8> for Level { implementation
223 /// Convert to the level number
230 impl From<u8> for Level { implementation
231 /// Create level by number
233 fn from(number: u8) -> Level { in from() argument
234 Level::new(number).expect("Level number error") in from()
239 impl<'a> PartialEq<&'a str> for Level { implementation
247 impl<'a> PartialEq<String> for Level { implementation
260 assert_eq!(Level::new(0), Ok(Level(0))); in test_new()
261 assert_eq!(Level::new(1), Ok(Level(1))); in test_new()
262 assert_eq!(Level::new(10), Ok(Level(10))); in test_new()
263 assert_eq!(Level::new(125), Ok(Level(125))); in test_new()
264 assert_eq!(Level::new(126), Ok(Level(126))); in test_new()
265 assert_eq!(Level::new(127), Err(Error::OutOfRangeNumber)); in test_new()
266 assert_eq!(Level::new(255), Err(Error::OutOfRangeNumber)); in test_new()
271 assert_eq!(Level::new_explicit(0), Ok(Level(0))); in test_new_explicit()
272 assert_eq!(Level::new_explicit(1), Ok(Level(1))); in test_new_explicit()
273 assert_eq!(Level::new_explicit(10), Ok(Level(10))); in test_new_explicit()
274 assert_eq!(Level::new_explicit(125), Ok(Level(125))); in test_new_explicit()
275 assert_eq!(Level::new_explicit(126), Err(Error::OutOfRangeNumber)); in test_new_explicit()
276 assert_eq!(Level::new_explicit(255), Err(Error::OutOfRangeNumber)); in test_new_explicit()
281 assert_eq!(Level(0).is_ltr(), true); in test_is_ltr()
282 assert_eq!(Level(1).is_ltr(), false); in test_is_ltr()
283 assert_eq!(Level(10).is_ltr(), true); in test_is_ltr()
284 assert_eq!(Level(11).is_ltr(), false); in test_is_ltr()
285 assert_eq!(Level(124).is_ltr(), true); in test_is_ltr()
286 assert_eq!(Level(125).is_ltr(), false); in test_is_ltr()
291 assert_eq!(Level(0).is_rtl(), false); in test_is_rtl()
292 assert_eq!(Level(1).is_rtl(), true); in test_is_rtl()
293 assert_eq!(Level(10).is_rtl(), false); in test_is_rtl()
294 assert_eq!(Level(11).is_rtl(), true); in test_is_rtl()
295 assert_eq!(Level(124).is_rtl(), false); in test_is_rtl()
296 assert_eq!(Level(125).is_rtl(), true); in test_is_rtl()
301 let mut level = Level::ltr(); in test_raise() localVariable
302 assert_eq!(level.number(), 0); in test_raise()
303 assert!(level.raise(100).is_ok()); in test_raise()
304 assert_eq!(level.number(), 100); in test_raise()
305 assert!(level.raise(26).is_ok()); in test_raise()
306 assert_eq!(level.number(), 126); in test_raise()
307 assert!(level.raise(1).is_err()); // invalid! in test_raise()
308 assert!(level.raise(250).is_err()); // overflow! in test_raise()
309 assert_eq!(level.number(), 126); in test_raise()
314 let mut level = Level::ltr(); in test_raise_explicit() localVariable
315 assert_eq!(level.number(), 0); in test_raise_explicit()
316 assert!(level.raise_explicit(100).is_ok()); in test_raise_explicit()
317 assert_eq!(level.number(), 100); in test_raise_explicit()
318 assert!(level.raise_explicit(25).is_ok()); in test_raise_explicit()
319 assert_eq!(level.number(), 125); in test_raise_explicit()
320 assert!(level.raise_explicit(1).is_err()); // invalid! in test_raise_explicit()
321 assert!(level.raise_explicit(250).is_err()); // overflow! in test_raise_explicit()
322 assert_eq!(level.number(), 125); in test_raise_explicit()
327 let mut level = Level::rtl(); in test_lower() localVariable
328 assert_eq!(level.number(), 1); in test_lower()
329 assert!(level.lower(1).is_ok()); in test_lower()
330 assert_eq!(level.number(), 0); in test_lower()
331 assert!(level.lower(1).is_err()); // underflow! in test_lower()
332 assert!(level.lower(250).is_err()); // underflow! in test_lower()
333 assert_eq!(level.number(), 0); in test_lower()
338 assert_eq!(has_rtl(&Level::vec(&[0, 0, 0])), false); in test_has_rtl()
339 assert_eq!(has_rtl(&Level::vec(&[0, 1, 0])), true); in test_has_rtl()
340 assert_eq!(has_rtl(&Level::vec(&[0, 2, 0])), false); in test_has_rtl()
341 assert_eq!(has_rtl(&Level::vec(&[0, 125, 0])), true); in test_has_rtl()
342 assert_eq!(has_rtl(&Level::vec(&[0, 126, 0])), false); in test_has_rtl()
347 let level = Level::rtl(); in test_into() localVariable
348 let number: u8 = level.into(); in test_into()
355 Level::vec(&[0, 1, 125]), in test_vec()
356 vec![Level(0), Level(1), Level(125)] in test_vec()
362 assert_eq!(Level::vec(&[0, 1, 4, 125]), vec!["0", "1", "x", "125"]); in test_str_eq()
363 assert_ne!(Level::vec(&[0, 1, 4, 125]), vec!["0", "1", "5", "125"]); in test_str_eq()
369 Level::vec(&[0, 1, 4, 125]), in test_string_eq()
383 &Level::ltr(), in test_statics()
384 &[Token::NewtypeStruct { name: "Level" }, Token::U8(0)], in test_statics()
387 &Level::rtl(), in test_statics()
388 &[Token::NewtypeStruct { name: "Level" }, Token::U8(1)], in test_statics()
394 let level = Level::new(42).unwrap(); in test_new() localVariable
396 &level, in test_new()
397 &[Token::NewtypeStruct { name: "Level" }, Token::U8(42)], in test_new()