switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / Socket / Protocols / INet / INet6Address.ih
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 //
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at 
9 // http://senf.berlios.de/license.html
10 //
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on, 
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
14 //
15 // Software distributed under the License is distributed on an "AS IS" basis, 
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
17 // for the specific language governing rights and limitations under the License.
18 //
19 // The Original Code is Fraunhofer FOKUS code.
20 //
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
24 //
25 // Contributor(s):
26 //   Stefan Bund <g0dil@berlios.de>
27
28 /** \file
29     \brief INet6Address internal header */
30
31 #ifndef IH_SENF_Socket_Protocols_INet_INet6Address_
32 #define IH_SENF_Socket_Protocols_INet_INet6Address_ 1
33
34 // Custom includes
35
36 //-/////////////////////////////////////////////////////////////////////////////////////////////////
37
38 namespace senf {
39
40     class INet6Address;
41
42 namespace detail {
43
44 #   ifndef DOXYGEN
45
46     template <unsigned a, unsigned bytes, unsigned restbits>
47     struct CheckINet6Network_impl5
48     {};
49
50     template <unsigned a>
51     struct CheckINet6Network_impl5<a,0,0>
52     {
53         static bool match(boost::uint8_t v0, boost::uint8_t v1);
54     };
55
56     template <unsigned a, unsigned restbits>
57     struct CheckINet6Network_impl5<a,0,restbits>
58     {
59         static bool match(boost::uint8_t v0, boost::uint8_t v1);
60     };
61
62     template <unsigned a>
63     struct CheckINet6Network_impl5<a,1,0>
64     {
65         static bool match(boost::uint8_t v0, boost::uint8_t v1);
66     };
67
68     template <unsigned a, unsigned restbits>
69     struct CheckINet6Network_impl5<a,1,restbits>
70     {
71         static bool match(boost::uint8_t v0, boost::uint8_t v1);
72     };
73
74     template <unsigned a, unsigned bits>
75     struct CheckINet6Network_impl4
76         : public CheckINet6Network_impl5<a,bits/8,bits%8>
77     {};
78
79     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
80               unsigned a5, unsigned a6, unsigned a7, unsigned words, unsigned restbits>
81     struct CheckINet6Network_impl3
82     {};
83
84     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
85               unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
86     struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,0,restbits>
87     {
88         static bool match(INet6Address const & addr);
89     };
90
91     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
92               unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
93     struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,1,restbits>
94     {
95         static bool match(INet6Address const & addr);
96     };
97
98     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
99               unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
100     struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,2,restbits>
101     {
102         static bool match(INet6Address const & addr);
103     };
104
105     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
106               unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
107     struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,3,restbits>
108     {
109         static bool match(INet6Address const & addr);
110     };
111
112     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
113               unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
114     struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,4,restbits>
115     {
116         static bool match(INet6Address const & addr);
117     };
118
119     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
120               unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
121     struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,5,restbits>
122     {
123         static bool match(INet6Address const & addr);
124     };
125
126     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
127               unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
128     struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,6,restbits>
129     {
130         static bool match(INet6Address const & addr);
131     };
132
133     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
134               unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
135     struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,7,restbits>
136     {
137         static bool match(INet6Address const & addr);
138     };
139
140     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
141               unsigned a5, unsigned a6, unsigned a7, unsigned bits>
142     struct CheckINet6Network_impl2
143         : public CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,bits/16,bits%16>
144     {};
145
146     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
147               unsigned a5, unsigned a6, unsigned a7, unsigned a8>
148     struct CheckINet6Network_impl
149         : public CheckINet6Network_impl2<a0,a1,a2,a3,a4,a5,a6,a7,a8>
150     {};
151
152     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
153               unsigned a5, unsigned a6, unsigned a7>
154     struct CheckINet6Network_impl<a0,a1,a2,a3,a4,a5,a6,a7,0>
155         : public CheckINet6Network_impl2<a0,a1,a2,a3,a4,a5,a6,0,a7>
156     {};
157
158     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
159               unsigned a5, unsigned a6>
160     struct CheckINet6Network_impl<a0,a1,a2,a3,a4,a5,a6,0,0>
161         : public CheckINet6Network_impl2<a0,a1,a2,a3,a4,a5,0,0,a6>
162     {};
163
164     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
165               unsigned a5>
166     struct CheckINet6Network_impl<a0,a1,a2,a3,a4,a5,0,0,0>
167         : public CheckINet6Network_impl2<a0,a1,a2,a3,a4,0,0,0,a5>
168     {};
169
170     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4>
171     struct CheckINet6Network_impl<a0,a1,a2,a3,a4,0,0,0,0>
172         : public CheckINet6Network_impl2<a0,a1,a2,a3,0,0,0,0,a4>
173     {};
174
175     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3>
176     struct CheckINet6Network_impl<a0,a1,a2,a3,0,0,0,0,0>
177         : public CheckINet6Network_impl2<a0,a1,a2,0,0,0,0,0,a3>
178     {};
179
180     template <unsigned a0, unsigned a1, unsigned a2>
181     struct CheckINet6Network_impl<a0,a1,a2,0,0,0,0,0,0>
182         : public CheckINet6Network_impl2<a0,a1,0,0,0,0,0,0,a2>
183     {};
184
185     template <unsigned a0, unsigned a1>
186     struct CheckINet6Network_impl<a0,a1,0,0,0,0,0,0,0>
187         : public CheckINet6Network_impl2<a0,0,0,0,0,0,0,0,a1>
188     {};
189
190 #   endif
191
192     boost::uint8_t low_bits_mask(unsigned bits);
193
194     template <class ForwardIterator, class Function>
195     void apply_mask(unsigned bits, ForwardIterator b, ForwardIterator e, Function fn);
196
197     template <class ForwardIterator1, class ForwardIterator2, class Function>
198     ForwardIterator1 find_if_mask(unsigned bits,
199                                   ForwardIterator1 b1, ForwardIterator1 e1, ForwardIterator2 b2,
200                                   Function fn);
201
202 }}
203
204 //-/////////////////////////////////////////////////////////////////////////////////////////////////
205 #endif
206
207 \f
208 // Local Variables:
209 // mode: c++
210 // fill-column: 100
211 // comment-column: 40
212 // c-file-style: "senf"
213 // indent-tabs-mode: nil
214 // ispell-local-dictionary: "american"
215 // compile-command: "scons -u test"
216 // End: