00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef PCAP_FIND_HXX_
00023 # define PCAP_FIND_HXX_
00024
00025 # include "find.hh"
00026
00027 # include <cassert>
00028 # include <algorithm>
00029
00030 namespace wpl
00031 {
00032
00033 namespace pkt
00034 {
00035
00036 inline
00037 match::match(const vector_of_bytes& bytes, size_t first, size_t last):
00038 bytes_ (bytes),
00039 first_ (first),
00040 last_ (last)
00041 {
00042 assert(first_ < last_);
00043 assert(bytes_.size() <= last_ - first_);
00044 }
00045
00046 template <class S>
00047 bool
00048 match::operator == (const packet<S>& rhs) const
00049 {
00050 const size_t caplen = rhs.meta().caplen;
00051
00052 if (first_ > caplen)
00053 return false;
00054
00055 const uint8_t* const bytes = static_cast<const uint8_t*> (rhs.bytes());
00056 const uint8_t* const first = bytes + first_;
00057 const uint8_t* const last = bytes + std::min(caplen, last_);
00058
00059 return std::search(first, last, bytes_.begin(), bytes_.end()) != last;
00060 }
00061
00062 template <class S>
00063 bool
00064 operator == (const packet<S>& rhs, const match& lhs)
00065 {
00066 return lhs == rhs;
00067 }
00068
00069
00070 }
00071
00072 }
00073
00074 #endif // ! PCAP_FIND_HH_