From 7c61ddf3f9a23539eb3ace7770a4a48a30b984e7 Mon Sep 17 00:00:00 2001 From: KAMADA Ken'ichi Date: Sat, 17 Jun 2017 21:47:27 +0900 Subject: [PATCH] Add Value::get_uint() to handle BYTE, SHORT, and LONG transparently. --- src/value.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/value.rs b/src/value.rs index df9989b..57baf85 100644 --- a/src/value.rs +++ b/src/value.rs @@ -76,6 +76,18 @@ impl<'a> Value<'a> { pub fn display_as(&self, tag: ::tag_priv::Tag) -> Display { ::tag_priv::display_value_as(self, tag) } + + /// Returns the unsigned integer at the given position. + /// None is returned if the value type is not unsigned integer + /// (BYTE, SHORT, or LONG) or the position is out of bounds. + pub fn get_uint(&self, index: usize) -> Option { + match *self { + Value::Byte(ref v) if v.len() > index => Some(v[index] as u32), + Value::Short(ref v) if v.len() > index => Some(v[index] as u32), + Value::Long(ref v) if v.len() > index => Some(v[index]), + _ => None, + } + } } /// Helper struct for printing a value in a tag-specific format. @@ -596,6 +608,26 @@ mod tests { assert_eq!(unitlen, 0); } + #[test] + fn get_uint() { + let v = Value::Byte(vec![1, 2]); + assert_eq!(v.get_uint(0), Some(1)); + assert_eq!(v.get_uint(1), Some(2)); + assert_eq!(v.get_uint(2), None); + let v = Value::Short(vec![1, 2]); + assert_eq!(v.get_uint(0), Some(1)); + assert_eq!(v.get_uint(1), Some(2)); + assert_eq!(v.get_uint(2), None); + let v = Value::Long(vec![1, 2]); + assert_eq!(v.get_uint(0), Some(1)); + assert_eq!(v.get_uint(1), Some(2)); + assert_eq!(v.get_uint(2), None); + let v = Value::SLong(vec![1, 2]); + assert_eq!(v.get_uint(0), None); + assert_eq!(v.get_uint(1), None); + assert_eq!(v.get_uint(2), None); + } + #[test] fn rational_fmt_display() { let r = Rational { num: u32::max_value(), denom: u32::max_value() };