@@ -77,8 +77,8 @@ func LayersDecoder(dl DecodingLayerContainer, first LayerType, df DecodeFeedback
7777 }
7878 }
7979
80- return func ( data [] byte , decoded * [] LayerType ) ( LayerType , error ) {
81- if len (data ) > 0 {
80+ if dlc , ok := dl .( DecodingLayerSparse ); ok {
81+ return func (data [] byte , decoded * [] LayerType ) ( LayerType , error ) {
8282 * decoded = (* decoded )[:0 ] // Truncated decoded layers.
8383 typ := first
8484 decoder := firstDec
@@ -91,10 +91,75 @@ func LayersDecoder(dl DecodingLayerContainer, first LayerType, df DecodeFeedback
9191 if data = decoder .LayerPayload (); len (data ) == 0 {
9292 break
9393 }
94- if decoder , ok = dl .Decoder (typ ); ! ok {
94+ if decoder , ok = dlc .Decoder (typ ); ! ok {
9595 return typ , nil
9696 }
9797 }
98+ return LayerTypeZero , nil
99+ }
100+ }
101+
102+ if dlc , ok := dl .(DecodingLayerMap ); ok {
103+ return func (data []byte , decoded * []LayerType ) (LayerType , error ) {
104+ * decoded = (* decoded )[:0 ] // Truncated decoded layers.
105+ typ := first
106+ decoder := firstDec
107+ for {
108+ if err := decoder .DecodeFromBytes (data , df ); err != nil {
109+ return LayerTypeZero , err
110+ }
111+ * decoded = append (* decoded , typ )
112+ typ = decoder .NextLayerType ()
113+ if data = decoder .LayerPayload (); len (data ) == 0 {
114+ break
115+ }
116+ if decoder , ok = dlc .Decoder (typ ); ! ok {
117+ return typ , nil
118+ }
119+ }
120+ return LayerTypeZero , nil
121+ }
122+ }
123+
124+ if dlc , ok := dl .(DecodingLayerArray ); ok {
125+ return func (data []byte , decoded * []LayerType ) (LayerType , error ) {
126+ * decoded = (* decoded )[:0 ] // Truncated decoded layers.
127+ typ := first
128+ decoder := firstDec
129+ for {
130+ if err := decoder .DecodeFromBytes (data , df ); err != nil {
131+ return LayerTypeZero , err
132+ }
133+ * decoded = append (* decoded , typ )
134+ typ = decoder .NextLayerType ()
135+ if data = decoder .LayerPayload (); len (data ) == 0 {
136+ break
137+ }
138+ if decoder , ok = dlc .Decoder (typ ); ! ok {
139+ return typ , nil
140+ }
141+ }
142+ return LayerTypeZero , nil
143+ }
144+ }
145+
146+ // fallback implementation
147+ return func (data []byte , decoded * []LayerType ) (LayerType , error ) {
148+ * decoded = (* decoded )[:0 ] // Truncated decoded layers.
149+ typ := first
150+ decoder := firstDec
151+ for {
152+ if err := decoder .DecodeFromBytes (data , df ); err != nil {
153+ return LayerTypeZero , err
154+ }
155+ * decoded = append (* decoded , typ )
156+ typ = decoder .NextLayerType ()
157+ if data = decoder .LayerPayload (); len (data ) == 0 {
158+ break
159+ }
160+ if decoder , ok = dl .Decoder (typ ); ! ok {
161+ return typ , nil
162+ }
98163 }
99164 return LayerTypeZero , nil
100165 }
@@ -128,34 +193,7 @@ func (dl DecodingLayerSparse) Put(d DecodingLayer) DecodingLayerContainer {
128193
129194// LayersDecoder implements DecodingLayerContainer interface.
130195func (dl DecodingLayerSparse ) LayersDecoder (first LayerType , df DecodeFeedback ) DecodingLayerFunc {
131- firstDec , ok := dl .Decoder (first )
132- if ! ok {
133- return func ([]byte , * []LayerType ) (LayerType , error ) {
134- return first , nil
135- }
136- }
137-
138- return func (data []byte , decoded * []LayerType ) (LayerType , error ) {
139- if len (data ) > 0 {
140- * decoded = (* decoded )[:0 ] // Truncated decoded layers.
141- typ := first
142- decoder := firstDec
143- for {
144- if err := decoder .DecodeFromBytes (data , df ); err != nil {
145- return LayerTypeZero , err
146- }
147- * decoded = append (* decoded , typ )
148- typ = decoder .NextLayerType ()
149- if data = decoder .LayerPayload (); len (data ) == 0 {
150- break
151- }
152- if decoder , ok = dl .Decoder (typ ); ! ok {
153- return typ , nil
154- }
155- }
156- }
157- return LayerTypeZero , nil
158- }
196+ return LayersDecoder (dl , first , df )
159197}
160198
161199// Decoder implements DecodingLayerContainer interface.
@@ -199,34 +237,7 @@ func (dl DecodingLayerArray) Decoder(typ LayerType) (DecodingLayer, bool) {
199237
200238// LayersDecoder implements DecodingLayerContainer interface.
201239func (dl DecodingLayerArray ) LayersDecoder (first LayerType , df DecodeFeedback ) DecodingLayerFunc {
202- firstDec , ok := dl .Decoder (first )
203- if ! ok {
204- return func ([]byte , * []LayerType ) (LayerType , error ) {
205- return first , nil
206- }
207- }
208-
209- return func (data []byte , decoded * []LayerType ) (LayerType , error ) {
210- if len (data ) > 0 {
211- * decoded = (* decoded )[:0 ] // Truncated decoded layers.
212- typ := first
213- decoder := firstDec
214- for {
215- if err := decoder .DecodeFromBytes (data , df ); err != nil {
216- return LayerTypeZero , err
217- }
218- * decoded = append (* decoded , typ )
219- typ = decoder .NextLayerType ()
220- if data = decoder .LayerPayload (); len (data ) == 0 {
221- break
222- }
223- if decoder , ok = dl .Decoder (typ ); ! ok {
224- return typ , nil
225- }
226- }
227- }
228- return LayerTypeZero , nil
229- }
240+ return LayersDecoder (dl , first , df )
230241}
231242
232243// DecodingLayerMap is an map-based implementation of
@@ -253,34 +264,7 @@ func (dl DecodingLayerMap) Decoder(typ LayerType) (DecodingLayer, bool) {
253264
254265// LayersDecoder implements DecodingLayerContainer interface.
255266func (dl DecodingLayerMap ) LayersDecoder (first LayerType , df DecodeFeedback ) DecodingLayerFunc {
256- firstDec , ok := dl .Decoder (first )
257- if ! ok {
258- return func ([]byte , * []LayerType ) (LayerType , error ) {
259- return first , nil
260- }
261- }
262-
263- return func (data []byte , decoded * []LayerType ) (LayerType , error ) {
264- if len (data ) > 0 {
265- * decoded = (* decoded )[:0 ] // Truncated decoded layers.
266- typ := first
267- decoder := firstDec
268- for {
269- if err := decoder .DecodeFromBytes (data , df ); err != nil {
270- return LayerTypeZero , err
271- }
272- * decoded = append (* decoded , typ )
273- typ = decoder .NextLayerType ()
274- if data = decoder .LayerPayload (); len (data ) == 0 {
275- break
276- }
277- if decoder , ok = dl .Decoder (typ ); ! ok {
278- return typ , nil
279- }
280- }
281- }
282- return LayerTypeZero , nil
283- }
267+ return LayersDecoder (dl , first , df )
284268}
285269
286270// Static code check.
0 commit comments