1dc03ff18f2ee6abbe9032571abf726392ba83f1
[senf.git] / Socket / Protocols / INet / INet6Address.ih
1 // Copyright (C) 2007 
2 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
3 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
4 //     Stefan Bund <g0dil@berlios.de>
5 //
6 // This program is free software; you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation; either version 2 of the License, or
9 // (at your option) any later version.
10 //
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the
18 // Free Software Foundation, Inc.,
19 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20
21 /** \file
22     \brief INet6Address internal header */
23
24 #ifndef IH_INet6Address_
25 #define IH_INet6Address_ 1
26
27 // Custom includes
28
29 ///////////////////////////////ih.p////////////////////////////////////////
30
31 namespace senf {
32
33     class INet6Address;
34
35 namespace detail {
36
37 #   ifndef DOXYGEN
38
39     template <unsigned a, unsigned bytes, unsigned restbits>
40     struct CheckINet6Network_impl5
41     {};
42
43     template <unsigned a>
44     struct CheckINet6Network_impl5<a,0,0>
45     {
46         static bool match(boost::uint8_t v0, boost::uint8_t v1);
47     };
48
49     template <unsigned a, unsigned restbits>
50     struct CheckINet6Network_impl5<a,0,restbits>
51     {
52         static bool match(boost::uint8_t v0, boost::uint8_t v1);
53     };
54
55     template <unsigned a>
56     struct CheckINet6Network_impl5<a,1,0>
57     {
58         static bool match(boost::uint8_t v0, boost::uint8_t v1);
59     };
60
61     template <unsigned a, unsigned restbits>
62     struct CheckINet6Network_impl5<a,1,restbits>
63     {
64         static bool match(boost::uint8_t v0, boost::uint8_t v1);
65     };
66
67     template <unsigned a, unsigned bits>
68     struct CheckINet6Network_impl4
69         : public CheckINet6Network_impl5<a,bits/8,bits%8>
70     {};
71     
72     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
73               unsigned a5, unsigned a6, unsigned a7, unsigned words, unsigned restbits>
74     struct CheckINet6Network_impl3
75     {};
76
77     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
78               unsigned a5, unsigned a6, unsigned a7, unsigned restbits>
79     struct CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,0,restbits>
80     {
81         static bool match(INet6Address const & addr);
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,1,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,2,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,3,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,4,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,5,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,6,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,7,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 bits>
135     struct CheckINet6Network_impl2
136         : public CheckINet6Network_impl3<a0,a1,a2,a3,a4,a5,a6,a7,bits/16,bits%16>
137     {};
138
139     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
140               unsigned a5, unsigned a6, unsigned a7, unsigned a8>
141     struct CheckINet6Network_impl
142         : public CheckINet6Network_impl2<a0,a1,a2,a3,a4,a5,a6,a7,a8>
143     {};
144
145     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
146               unsigned a5, unsigned a6, unsigned a7>
147     struct CheckINet6Network_impl<a0,a1,a2,a3,a4,a5,a6,a7,0>
148         : public CheckINet6Network_impl2<a0,a1,a2,a3,a4,a5,a6,0,a7>
149     {};
150
151     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
152               unsigned a5, unsigned a6>
153     struct CheckINet6Network_impl<a0,a1,a2,a3,a4,a5,a6,0,0>
154         : public CheckINet6Network_impl2<a0,a1,a2,a3,a4,a5,0,0,a6>
155     {};
156
157     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4,
158               unsigned a5>
159     struct CheckINet6Network_impl<a0,a1,a2,a3,a4,a5,0,0,0>
160         : public CheckINet6Network_impl2<a0,a1,a2,a3,a4,0,0,0,a5>
161     {};
162
163     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3, unsigned a4>
164     struct CheckINet6Network_impl<a0,a1,a2,a3,a4,0,0,0,0>
165         : public CheckINet6Network_impl2<a0,a1,a2,a3,0,0,0,0,a4>
166     {};
167
168     template <unsigned a0, unsigned a1, unsigned a2, unsigned a3>
169     struct CheckINet6Network_impl<a0,a1,a2,a3,0,0,0,0,0>
170         : public CheckINet6Network_impl2<a0,a1,a2,0,0,0,0,0,a3>
171     {};
172
173     template <unsigned a0, unsigned a1, unsigned a2>
174     struct CheckINet6Network_impl<a0,a1,a2,0,0,0,0,0,0>
175         : public CheckINet6Network_impl2<a0,a1,0,0,0,0,0,0,a2>
176     {};
177
178     template <unsigned a0, unsigned a1>
179     struct CheckINet6Network_impl<a0,a1,0,0,0,0,0,0,0>
180         : public CheckINet6Network_impl2<a0,0,0,0,0,0,0,0,a1>
181     {};
182
183     template <boost::uint64_t net, boost::uint64_t id, unsigned bits, unsigned bytes>
184     struct IsINet6Network_impl
185     {};
186
187 #   endif
188
189 }}
190
191 ///////////////////////////////ih.e////////////////////////////////////////
192 #endif
193
194 \f
195 // Local Variables:
196 // mode: c++
197 // fill-column: 100
198 // comment-column: 40
199 // c-file-style: "senf"
200 // indent-tabs-mode: nil
201 // ispell-local-dictionary: "american"
202 // compile-command: "scons -u test"
203 // End: