00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef WIFI_FRAME_UNIQUE_ID_HXX_
00023 # define WIFI_FRAME_UNIQUE_ID_HXX_
00024
00025 # include "unique_id.hh"
00026
00027 # include <wipal/phy/prism_header.hh>
00028
00029 namespace wifi
00030 {
00031
00032 namespace frame
00033 {
00034
00035 namespace internals
00036 {
00037
00038 template <class Tag>
00039 bool
00040 empty<Tag>::operator < (const empty&) const
00041 {
00042 return false;
00043 }
00044
00045 template <class Tag>
00046 bool
00047 empty<Tag>::operator == (const empty&) const
00048 {
00049 return true;
00050 }
00051
00052 template <class Tag>
00053 bool
00054 empty<Tag>::operator != (const empty&) const
00055 {
00056 return false;
00057 }
00058
00059 template <class T, class Tag>
00060 adapter<T, Tag>::adapter(const T& v): v_ (v)
00061 {
00062 }
00063
00064 template <class T, class Tag>
00065 bool
00066 adapter<T, Tag>::operator < (const adapter& rhs) const
00067 {
00068 return v_ < rhs.v_;
00069 }
00070
00071 template <class T, class Tag>
00072 bool
00073 adapter<T, Tag>::operator == (const adapter& rhs) const
00074 {
00075 return v_ == rhs.v_;
00076 }
00077
00078 template <class T, class Tag>
00079 bool
00080 adapter<T, Tag>::operator != (const adapter& rhs) const
00081 {
00082 return not (*this == rhs);
00083 }
00084
00085 template <class T, class Tag>
00086 const T&
00087 adapter<T, Tag>::value() const
00088 {
00089 return v_;
00090 }
00091
00092 template <class T, class Tag>
00093 T&
00094 adapter<T, Tag>::value()
00095 {
00096 return v_;
00097 }
00098
00099 }
00100
00101
00102
00103
00104
00105 template <class Id1, class Id2, class Id3, class Id4>
00106 unique_id<Id1, Id2, Id3, Id4>::unique_id(unsigned frame_id,
00107 const Id1& id1,
00108 const Id2& id2,
00109 const Id3& id3,
00110 const Id4& id4):
00111 Id1 (id1),
00112 Id2 (id2),
00113 Id3 (id3),
00114 Id4 (id4),
00115 frame_id_ (frame_id)
00116 {
00117 }
00118
00119 template <class Id1, class Id2, class Id3, class Id4>
00120 bool
00121 unique_id<Id1, Id2, Id3, Id4>::operator < (const unique_id& rhs) const
00122 {
00123 const Id1& l1 = id1(), r1 = rhs.id1();
00124 const Id2& l2 = id2(), r2 = rhs.id2();
00125 const Id3& l3 = id3(), r3 = rhs.id3();
00126 const Id4& l4 = id4(), r4 = rhs.id4();
00127
00128 if (l1 != r1)
00129 return l1 < r1;
00130 if (l2 != r2)
00131 return l2 < r2;
00132 if (l3 != r3)
00133 return l3 < r3;
00134 return l4 < r4;
00135 }
00136
00137 template <class Id1, class Id2, class Id3, class Id4>
00138 bool
00139 unique_id<Id1, Id2, Id3, Id4>::operator == (const unique_id& rhs) const
00140 {
00141 return (id1() == rhs.id1() and id2() == rhs.id2() and
00142 id3() == rhs.id3() and id4() == rhs.id4());
00143 }
00144
00145 template <class Id1, class Id2, class Id3, class Id4>
00146 bool
00147 unique_id<Id1, Id2, Id3, Id4>::operator != (const unique_id& rhs) const
00148 {
00149 return not (*this == rhs);
00150 }
00151
00152 template <class Id1, class Id2, class Id3, class Id4>
00153 std::ostream&
00154 unique_id<Id1, Id2, Id3, Id4>::print(std::ostream& os) const
00155 {
00156 return os << frame_id_;
00157 }
00158
00159 template <class Id1, class Id2, class Id3, class Id4>
00160 unsigned
00161 unique_id<Id1, Id2, Id3, Id4>::frame_id() const
00162 {
00163 return frame_id_;
00164 }
00165
00166 template <class Id1, class Id2, class Id3, class Id4>
00167 const Id1&
00168 unique_id<Id1, Id2, Id3, Id4>::id1() const
00169 {
00170 return static_cast<const Id1&> (*this);
00171 }
00172
00173 template <class Id1, class Id2, class Id3, class Id4>
00174 const Id2&
00175 unique_id<Id1, Id2, Id3, Id4>::id2() const
00176 {
00177 return static_cast<const Id2&> (*this);
00178 }
00179
00180 template <class Id1, class Id2, class Id3, class Id4>
00181 const Id3&
00182 unique_id<Id1, Id2, Id3, Id4>::id3() const
00183 {
00184 return static_cast<const Id3&> (*this);
00185 }
00186
00187 template <class Id1, class Id2, class Id3, class Id4>
00188 const Id4&
00189 unique_id<Id1, Id2, Id3, Id4>::id4() const
00190 {
00191 return static_cast<const Id4&> (*this);
00192 }
00193
00194 template <class Id1, class Id2, class Id3, class Id4>
00195 std::ostream&
00196 operator << (std::ostream& os, const unique_id<Id1, Id2, Id3, Id4>& ui)
00197 {
00198 return ui.print(os);
00199 }
00200
00201 }
00202
00203 }
00204
00205 WP_HASH_NAMESPACE_BEGIN
00206
00207 template <class Tag>
00208 size_t
00209 hash< wifi::frame::internals::empty<Tag> >::
00210 operator () (const wifi::frame::internals::empty<Tag>&) const
00211 {
00212 return 0;
00213 }
00214
00215 template <class T, class Tag>
00216 size_t
00217 hash< wifi::frame::internals::adapter<T, Tag> >::
00218 operator () (const wifi::frame::internals::adapter<T, Tag>& a) const
00219 {
00220 return hash<T>::operator () (a.value());
00221 }
00222
00223 template <class Id1, class Id2, class Id3, class Id4>
00224 size_t
00225 hash< wifi::frame::unique_id<Id1, Id2, Id3, Id4> >::
00226 operator () (const wifi::frame::unique_id<Id1, Id2, Id3, Id4>& i) const
00227 {
00228 return (hash<Id1>::operator () (i.id1()) ^
00229 hash<Id2>::operator () (i.id2()) ^
00230 hash<Id3>::operator () (i.id3()) ^
00231 hash<Id4>::operator () (i.id4()));
00232 }
00233
00234 WP_HASH_NAMESPACE_END
00235
00236 #endif // ! WIFI_FRAME_UNIQUE_ID_HXX_