INet6Address.ih

Go to the documentation of this file.
00001 // $Id: INet6Address.ih 1742 2010-11-04 14:51:56Z g0dil $
00002 //
00003 // Copyright (C) 2007
00004 // Fraunhofer (FOKUS)
00005 // Competence Center NETwork research (NET), St. Augustin, GERMANY
00006 //     Stefan Bund <g0dil@berlios.de>
00007 //
00008 // This program is free software; you can redistribute it and/or modify
00009 // it under the terms of the GNU General Public License as published by
00010 // the Free Software Foundation; either version 2 of the License, or
00011 // (at your option) any later version.
00012 //
00013 // This program is distributed in the hope that it will be useful,
00014 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 // GNU General Public License for more details.
00017 //
00018 // You should have received a copy of the GNU General Public License
00019 // along with this program; if not, write to the
00020 // Free Software Foundation, Inc.,
00021 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00022 
00026 #ifndef IH_SENF_Socket_Protocols_INet_INet6Address_
00027 #define IH_SENF_Socket_Protocols_INet_INet6Address_ 1
00028 
00029 // Custom includes
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 // Local Variables:
00204 // mode: c++
00205 // fill-column: 100
00206 // comment-column: 40
00207 // c-file-style: "senf"
00208 // indent-tabs-mode: nil
00209 // ispell-local-dictionary: "american"
00210 // compile-command: "scons -u test"
00211 // End: