@@ -332,6 +332,9 @@ namespace pcpp
332
332
std::string printPacketInfo (bool timeAsLocalTime) const ;
333
333
334
334
Layer* createFirstLayer (LinkLayerType linkType);
335
+
336
+ template <typename TLayer, typename NextLayerFn>
337
+ static TLayer* searchLayerStackForType (Layer* startLayer, NextLayerFn nextLayerFn, bool skipFirst);
335
338
}; // class Packet
336
339
337
340
// implementation of inline methods
@@ -340,45 +343,45 @@ namespace pcpp
340
343
{
341
344
if (!reverse)
342
345
{
343
- if (dynamic_cast <TLayer*>(getFirstLayer ()) != nullptr )
344
- return dynamic_cast <TLayer*>(getFirstLayer ());
345
-
346
- return getNextLayerOfType<TLayer>(getFirstLayer ());
346
+ return searchLayerStackForType<TLayer>(
347
+ m_FirstLayer, [](Layer* layer) { return layer->getNextLayer (); }, false );
347
348
}
348
349
349
350
// lookup in reverse order
350
- if (dynamic_cast <TLayer*>(getLastLayer ()) != nullptr )
351
- return dynamic_cast <TLayer*>(getLastLayer ());
352
-
353
- return getPrevLayerOfType<TLayer>(getLastLayer ());
351
+ return searchLayerStackForType<TLayer>(m_LastLayer, [](Layer* layer) { return layer->getPrevLayer (); }, false );
354
352
}
355
353
356
354
template <class TLayer > TLayer* Packet::getNextLayerOfType (Layer* curLayer) const
357
355
{
358
- if (curLayer == nullptr )
359
- return nullptr ;
360
-
361
- curLayer = curLayer->getNextLayer ();
362
- while ((curLayer != nullptr ) && (dynamic_cast <TLayer*>(curLayer) == nullptr ))
363
- {
364
- curLayer = curLayer->getNextLayer ();
365
- }
366
-
367
- return dynamic_cast <TLayer*>(curLayer);
356
+ return searchLayerStackForType<TLayer>(curLayer, [](Layer* layer) { return layer->getNextLayer (); }, true );
368
357
}
369
358
370
359
template <class TLayer > TLayer* Packet::getPrevLayerOfType (Layer* curLayer) const
360
+ {
361
+ return searchLayerStackForType<TLayer>(curLayer, [](Layer* layer) { return layer->getPrevLayer (); }, true );
362
+ }
363
+
364
+ template <typename TLayer, typename NextLayerFn>
365
+ TLayer* Packet::searchLayerStackForType (Layer* curLayer, NextLayerFn nextLayerFn, bool skipFirst)
371
366
{
372
367
if (curLayer == nullptr )
373
368
return nullptr ;
374
369
375
- curLayer = curLayer->getPrevLayer ();
376
- while (curLayer != nullptr && dynamic_cast <TLayer*>(curLayer) == nullptr )
370
+ if (skipFirst)
377
371
{
378
- curLayer = curLayer->getPrevLayer ();
372
+ curLayer = nextLayerFn (curLayer);
373
+ }
374
+
375
+ while (curLayer != nullptr )
376
+ {
377
+ auto * curLayerCasted = dynamic_cast <TLayer*>(curLayer);
378
+ if (curLayerCasted != nullptr )
379
+ return curLayerCasted;
380
+
381
+ curLayer = nextLayerFn (curLayer);
379
382
}
380
383
381
- return dynamic_cast <TLayer*>(curLayer) ;
384
+ return nullptr ;
382
385
}
383
386
384
387
inline std::ostream& operator <<(std::ostream& os, const pcpp::Packet& packet)
0 commit comments