00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef FILTER_NON_NOISY_PRISM_HXX_
00023 # define FILTER_NON_NOISY_PRISM_HXX_
00024
00025 # include "non_noisy_prism.hh"
00026
00027 # include <wipal/phy/prism_header.hh>
00028
00029 namespace wpl
00030 {
00031
00032 namespace filter
00033 {
00034
00035 namespace internals
00036 {
00037
00038 template <class I, class B, class Bottom>
00039 non_noisy_prism_iterator<I, B, Bottom>::
00040 non_noisy_prism_iterator(const iterable_type& i, bool end):
00041 iterable_ (&i),
00042 current_ (end ? i.end_ : i.begin_)
00043 {
00044 skip_noisy();
00045 }
00046
00047 template <class I, class B, class Bottom>
00048 bool
00049 non_noisy_prism_iterator<I, B, Bottom>::
00050 equal(const non_noisy_prism_iterator& rhs) const
00051 {
00052 return current_ == rhs.current_;
00053 }
00054
00055
00056 template <class I, class B, class Bottom>
00057 void
00058 non_noisy_prism_iterator<I, B, Bottom>::increment()
00059 {
00060 ++current_;
00061 skip_noisy();
00062 }
00063
00064 template <class I, class B, class Bottom>
00065 const typename non_noisy_prism_iterator<I, B, Bottom>::value_type&
00066 non_noisy_prism_iterator<I, B, Bottom>::get() const
00067 {
00068 return current_.get();
00069 }
00070
00071 template <class I, class B, class Bottom>
00072 typename non_noisy_prism_iterator<I, B, Bottom>::value_type&
00073 non_noisy_prism_iterator<I, B, Bottom>::get()
00074 {
00075 return current_.get();
00076 }
00077
00078 template <class I, class B, class Bottom>
00079 const typename non_noisy_prism_iterator<I, B, Bottom>::value_type*
00080 non_noisy_prism_iterator<I, B, Bottom>::get_ptr() const
00081 {
00082 return current_.get_ptr();
00083 }
00084
00085 template <class I, class B, class Bottom>
00086 typename non_noisy_prism_iterator<I, B, Bottom>::value_type*
00087 non_noisy_prism_iterator<I, B, Bottom>::get_ptr()
00088 {
00089 return current_.get_ptr();
00090 }
00091
00092 template <class I, class B, class Bottom>
00093 bool
00094 non_noisy_prism_iterator<I, B, Bottom>::noisy(const void* frame,
00095 size_t caplen)
00096 {
00097
00098
00099
00100
00101
00102
00103
00104 if (caplen < sizeof (prism::header))
00105 return true;
00106
00107 const prism::header* const h =
00108 static_cast<const prism::header*> (frame);
00109
00110 return h->noise.get(false);
00111 }
00112
00113 template <class I, class B, class Bottom>
00114 void
00115 non_noisy_prism_iterator<I, B, Bottom>::skip_noisy()
00116 {
00117 while (current_ != iterable_->end_ and
00118 noisy(current_->bytes(), current_->meta().caplen))
00119 ++current_;
00120 }
00121
00122 }
00123
00124
00125 template <class InputIterator, class Bottom>
00126 non_noisy_prism<InputIterator, Bottom>::
00127 non_noisy_prism(const InputIterator& begin, const InputIterator& end):
00128 begin_ (begin),
00129 end_ (end)
00130 {
00131 }
00132
00133 template <class InputIterator, class Bottom>
00134 template <class Iterable>
00135 non_noisy_prism<InputIterator, Bottom>::
00136 non_noisy_prism(const Iterable& i):
00137 begin_ (i.begin()),
00138 end_ (i.end())
00139 {
00140 }
00141
00142 }
00143
00144 }
00145
00146 #endif // ! FILTER_NON_NOISY_PRISM_HXX_