00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #ifndef IH_SENF_Socket_Protocols_INet_INet6Address_
00027 #define IH_SENF_Socket_Protocols_INet_INet6Address_ 1
00028
00029
00030
00031
00032
00033 namespace senf {
00034
00035 class INet6Address;
00036
00037 namespace detail {
00038
00039 # ifndef DOXYGEN
00040
00041 template <unsigned a, unsigned bytes, unsigned restbits>
00042 struct CheckINet6Network_impl5
00043 {};
00044
00045 template <unsigned a>
00046 struct CheckINet6Network_impl5<a,0,0>
00047 {
00048 static bool match(boost::uint8_t v0, boost::uint8_t v1);
00049 };
00050
00051 template <unsigned a, unsigned restbits>
00052 struct CheckINet6Network_impl5<a,0,restbits>
00053 {
00054 static bool match(boost::uint8_t v0, boost::uint8_t v1);
00055 };
00056
00057 template <unsigned a>
00058 struct CheckINet6Network_impl5<a,1,0>
00059 {
00060 static bool match(boost::uint8_t v0, boost::uint8_t v1);
00061 };
00062
00063 template <unsigned a, unsigned restbits>
00064 struct CheckINet6Network_impl5<a,1,restbits>
00065 {
00066 static bool match(boost::uint8_t v0, boost::uint8_t v1);
00067 };
00068
00069 template <unsigned a, unsigned bits>
00070 struct CheckINet6Network_impl4
00071 : public CheckINet6Network_impl5<a,bits/8,bits%8>
00072 {};
00073
00074 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
00075 unsigned a5, unsigned a6, unsigned a7, unsigned words, unsigned restbits>
00076 struct CheckINet6Network_impl3
00077 {};
00078
00079 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
00080 unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
00081 struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,0,restbits>
00082 {
00083 static bool match(INet6Address const & addr);
00084 };
00085
00086 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
00087 unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
00088 struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,1,restbits>
00089 {
00090 static bool match(INet6Address const & addr);
00091 };
00092
00093 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
00094 unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
00095 struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,2,restbits>
00096 {
00097 static bool match(INet6Address const & addr);
00098 };
00099
00100 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
00101 unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
00102 struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,3,restbits>
00103 {
00104 static bool match(INet6Address const & addr);
00105 };
00106
00107 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
00108 unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
00109 struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,4,restbits>
00110 {
00111 static bool match(INet6Address const & addr);
00112 };
00113
00114 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
00115 unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
00116 struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,5,restbits>
00117 {
00118 static bool match(INet6Address const & addr);
00119 };
00120
00121 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
00122 unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
00123 struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,6,restbits>
00124 {
00125 static bool match(INet6Address const & addr);
00126 };
00127
00128 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
00129 unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
00130 struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,7,restbits>
00131 {
00132 static bool match(INet6Address const & addr);
00133 };
00134
00135 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
00136 unsigned a5, unsigned a6, unsigned a7, unsigned bits>
00137 struct CheckINet6Network_impl2
00138 : public CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,bits/16,bits%16>
00139 {};
00140
00141 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
00142 unsigned a5, unsigned a6, unsigned a7, unsigned a8>
00143 struct CheckINet6Network_impl
00144 : public CheckINet6Network_impl2<a0,a1,a2,a3,a4,a5,a6,a7,a8>
00145 {};
00146
00147 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
00148 unsigned a5, unsigned a6, unsigned a7>
00149 struct CheckINet6Network_impl<a0,a1,a2,a3,a4,a5,a6,a7,0>
00150 : public CheckINet6Network_impl2<a0,a1,a2,a3,a4,a5,a6,0,a7>
00151 {};
00152
00153 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
00154 unsigned a5, unsigned a6>
00155 struct CheckINet6Network_impl<a0,a1,a2,a3,a4,a5,a6,0,0>
00156 : public CheckINet6Network_impl2<a0,a1,a2,a3,a4,a5,0,0,a6>
00157 {};
00158
00159 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
00160 unsigned a5>
00161 struct CheckINet6Network_impl<a0,a1,a2,a3,a4,a5,0,0,0>
00162 : public CheckINet6Network_impl2<a0,a1,a2,a3,a4,0,0,0,a5>
00163 {};
00164
00165 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4>
00166 struct CheckINet6Network_impl<a0,a1,a2,a3,a4,0,0,0,0>
00167 : public CheckINet6Network_impl2<a0,a1,a2,a3,0,0,0,0,a4>
00168 {};
00169
00170 template <unsigned a0, unsigned a1, unsigned a2, unsigned a3>
00171 struct CheckINet6Network_impl<a0,a1,a2,a3,0,0,0,0,0>
00172 : public CheckINet6Network_impl2<a0,a1,a2,0,0,0,0,0,a3>
00173 {};
00174
00175 template <unsigned a0, unsigned a1, unsigned a2>
00176 struct CheckINet6Network_impl<a0,a1,a2,0,0,0,0,0,0>
00177 : public CheckINet6Network_impl2<a0,a1,0,0,0,0,0,0,a2>
00178 {};
00179
00180 template <unsigned a0, unsigned a1>
00181 struct CheckINet6Network_impl<a0,a1,0,0,0,0,0,0,0>
00182 : public CheckINet6Network_impl2<a0,0,0,0,0,0,0,0,a1>
00183 {};
00184
00185 # endif
00186
00187 boost::uint8_t low_bits_mask(unsigned bits);
00188
00189 template <class ForwardIterator, class Function>
00190 void apply_mask(unsigned bits, ForwardIterator b, ForwardIterator e, Function fn);
00191
00192 template <class ForwardIterator1, class ForwardIterator2, class Function>
00193 ForwardIterator1 find_if_mask(unsigned bits,
00194 ForwardIterator1 b1, ForwardIterator1 e1, ForwardIterator2 b2,
00195 Function fn);
00196
00197 }}
00198
00199
00200 #endif
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211