Skip to content

Commit 269384a

Browse files
committed
[object] More IntoTokens
- impl IntoTokens for &InMemDicomObject - refactor current implementation
1 parent fdc5935 commit 269384a

File tree

1 file changed

+24
-34
lines changed

1 file changed

+24
-34
lines changed

object/src/tokens.rs

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//! Convertion of DICOM objects into tokens.
22
use crate::mem::{InMemDicomObject};
3-
use dicom_core::value::{PrimitiveValue};
4-
use dicom_core::{DataElement, Length};
3+
use dicom_core::{DataElement};
54
use dicom_parser::dataset::{DataToken, IntoTokens};
65
use std::collections::VecDeque;
76

@@ -11,8 +10,6 @@ pub struct InMemObjectTokens<E> {
1110
tokens_pending: VecDeque<DataToken>,
1211
/// the iterator of data elements in order.
1312
elem_iter: E,
14-
/// whenever a primitive data element is yet to be processed
15-
elem_pending: Option<PrimitiveValue>,
1613
/// whether the tokens are done
1714
fused: bool,
1815
}
@@ -28,18 +25,24 @@ where
2825
InMemObjectTokens {
2926
tokens_pending: Default::default(),
3027
elem_iter: obj.into_iter(),
31-
elem_pending: None,
3228
fused: false,
3329
}
3430
}
3531
}
3632

37-
impl<E> InMemObjectTokens<E>
33+
impl<E, I> Iterator for InMemObjectTokens<E>
3834
where
39-
E: Iterator,
35+
E: Iterator<Item = DataElement<I>>,
4036
E::Item: IntoTokens,
4137
{
42-
fn next_token(&mut self) -> Option<DataToken> {
38+
type Item = DataToken;
39+
40+
fn next(&mut self) -> Option<Self::Item> {
41+
if self.fused {
42+
return None;
43+
}
44+
45+
// otherwise, consume pending tokens
4346
if let Some(token) = self.tokens_pending.pop_front() {
4447
return Some(token);
4548
}
@@ -49,37 +52,12 @@ where
4952
// TODO eventually optimize this to be less eager
5053
self.tokens_pending = elem.into_tokens().collect();
5154

52-
self.next_token()
55+
self.next()
5356
} else {
5457
// no more elements
5558
None
5659
}
5760
}
58-
}
59-
60-
impl<E, I> Iterator for InMemObjectTokens<E>
61-
where
62-
E: Iterator<Item = DataElement<I>>,
63-
E::Item: IntoTokens,
64-
{
65-
type Item = DataToken;
66-
67-
fn next(&mut self) -> Option<Self::Item> {
68-
if self.fused {
69-
return None;
70-
}
71-
// if a data element is pending, return a value token
72-
if let Some(val) = self.elem_pending.take() {
73-
return Some(DataToken::PrimitiveValue(val));
74-
}
75-
76-
// otherwise, consume pending tokens
77-
if let Some(token) = self.next_token() {
78-
return Some(token);
79-
};
80-
81-
None
82-
}
8361

8462
fn size_hint(&self) -> (usize, Option<usize>) {
8563
// make a slightly better estimation for the minimum
@@ -97,3 +75,15 @@ impl<D> IntoTokens for InMemDicomObject<D> {
9775
}
9876
}
9977

78+
79+
impl<'a, D> IntoTokens for &'a InMemDicomObject<D>
80+
where
81+
D: Clone,
82+
{
83+
type Iter =
84+
InMemObjectTokens<std::iter::Cloned<<&'a InMemDicomObject<D> as IntoIterator>::IntoIter>>;
85+
86+
fn into_tokens(self) -> Self::Iter {
87+
InMemObjectTokens::new(self.into_iter().cloned())
88+
}
89+
}

0 commit comments

Comments
 (0)