1
1
//! Convertion of DICOM objects into tokens.
2
2
use crate :: mem:: { InMemDicomObject } ;
3
- use dicom_core:: value:: { PrimitiveValue } ;
4
- use dicom_core:: { DataElement , Length } ;
3
+ use dicom_core:: { DataElement } ;
5
4
use dicom_parser:: dataset:: { DataToken , IntoTokens } ;
6
5
use std:: collections:: VecDeque ;
7
6
@@ -11,8 +10,6 @@ pub struct InMemObjectTokens<E> {
11
10
tokens_pending : VecDeque < DataToken > ,
12
11
/// the iterator of data elements in order.
13
12
elem_iter : E ,
14
- /// whenever a primitive data element is yet to be processed
15
- elem_pending : Option < PrimitiveValue > ,
16
13
/// whether the tokens are done
17
14
fused : bool ,
18
15
}
@@ -28,18 +25,24 @@ where
28
25
InMemObjectTokens {
29
26
tokens_pending : Default :: default ( ) ,
30
27
elem_iter : obj. into_iter ( ) ,
31
- elem_pending : None ,
32
28
fused : false ,
33
29
}
34
30
}
35
31
}
36
32
37
- impl < E > InMemObjectTokens < E >
33
+ impl < E , I > Iterator for InMemObjectTokens < E >
38
34
where
39
- E : Iterator ,
35
+ E : Iterator < Item = DataElement < I > > ,
40
36
E :: Item : IntoTokens ,
41
37
{
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
43
46
if let Some ( token) = self . tokens_pending . pop_front ( ) {
44
47
return Some ( token) ;
45
48
}
@@ -49,37 +52,12 @@ where
49
52
// TODO eventually optimize this to be less eager
50
53
self . tokens_pending = elem. into_tokens ( ) . collect ( ) ;
51
54
52
- self . next_token ( )
55
+ self . next ( )
53
56
} else {
54
57
// no more elements
55
58
None
56
59
}
57
60
}
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
- }
83
61
84
62
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
85
63
// make a slightly better estimation for the minimum
@@ -97,3 +75,15 @@ impl<D> IntoTokens for InMemDicomObject<D> {
97
75
}
98
76
}
99
77
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