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_HH_
00023 # define FILTER_NON_NOISY_PRISM_HH_
00024
00025 # include <wipal/tool/iterator.hh>
00026 # include <wipal/tool/iterable.hh>
00027
00028
00029
00030
00031
00032 namespace wpl
00033 {
00034 namespace filter
00035 {
00036 namespace internals
00037 {
00038 template <class, class, class>
00039 struct non_noisy_prism_iterator;
00040 }
00041
00042 template <class, class>
00043 struct non_noisy_prism;
00044 }
00045 }
00046
00047
00048
00049
00050
00051
00052 namespace wpl
00053 {
00054 namespace tool
00055 {
00056
00063 template <class I, class B1, class B2>
00064 struct types< wpl::filter::internals::non_noisy_prism_iterator<I, B1, B2> >
00065 {
00066 typedef wpl::filter::non_noisy_prism<I, B1> iterable_type;
00067 typedef typename I::value_type value_type;
00068 };
00069
00075 template <class I, class B>
00076 struct types< wpl::filter::non_noisy_prism<I, B> >
00077 {
00078 typedef
00079 wpl::filter::internals::non_noisy_prism_iterator<I, B, bottom>
00080 iterator;
00081 };
00082
00083 }
00084 }
00085
00086
00087
00088
00089
00090
00091 namespace wpl
00092 {
00093
00094 namespace filter
00095 {
00096
00097 namespace internals
00098 {
00099
00101 template <class I, class B, class Bottom>
00102 struct non_noisy_prism_iterator:
00103 WP_INHERIT(public tool::iterator,
00104 non_noisy_prism_iterator<I, B, Bottom>)
00105 {
00106
00108
00109 typedef WP_GET_EXACT(Bottom, non_noisy_prism_iterator<I, B, Bottom>)
00110 exact_type;
00111 typedef tool::iterator<exact_type> super_type;
00112 typedef WP_TYPE(value_type, exact_type) value_type;
00113 typedef WP_TYPE(iterable_type, exact_type) iterable_type;
00115
00117 non_noisy_prism_iterator(const iterable_type& i, bool end);
00118
00120
00121 bool equal(const non_noisy_prism_iterator& rhs) const;
00122 void increment();
00123
00124 const value_type& get() const;
00125 value_type& get();
00126
00127 const value_type* get_ptr() const;
00128 value_type* get_ptr();
00130
00131 private:
00133 static bool noisy(const void* frame, size_t caplen);
00134
00136 void skip_noisy();
00137
00138 const iterable_type* iterable_;
00139 I current_;
00140 };
00141
00142 }
00143
00144
00146 template <class InputIterator, class Bottom = tool::bottom>
00147 struct non_noisy_prism: WP_INHERIT(public tool::iterable,
00148 non_noisy_prism<InputIterator, Bottom>)
00149 {
00151 non_noisy_prism(const InputIterator& begin, const InputIterator& end);
00152
00154 template <class Iterable>
00155 non_noisy_prism(const Iterable& i);
00156
00157 private:
00158 InputIterator begin_;
00159 InputIterator end_;
00160
00161 friend class internals::non_noisy_prism_iterator<InputIterator,
00162 Bottom, tool::bottom>;
00163 };
00164
00165 }
00166
00167 }
00168
00169 # include "non_noisy_prism.hxx"
00170
00171 #endif // ! FILTER_NON_NOISY_PRISM_HH_