INet4Address.cci

Go to the documentation of this file.
00001 // $Id: INet4Address.cci 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 // Custom includes
00027 
00028 #define prefix_ inline
00029 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00030 
00031 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00032 // senf::INet4Address
00033 
00034 prefix_ senf::INet4Address::INet4Address()
00035 {
00036     std::fill(begin(), end(), 0u);
00037 }
00038 
00039 prefix_ senf::INet4Address::INet4Address(senf::NoInit_t)
00040 {}
00041 
00042 prefix_ senf::INet4Address senf::INet4Address::from_inaddr(inaddr_type v)
00043 {
00044     return INet4Address(v,IsInAddr);
00045 }
00046 
00047 prefix_ senf::INet4Address::inaddr_type & senf::INet4Address::iref()
00048 {
00049     return *static_cast<inaddr_type *>(static_cast<void *>((&(*this)[0])));
00050 }
00051 
00052 prefix_ senf::INet4Address::inaddr_type senf::INet4Address::iref()
00053     const
00054 {
00055     return *static_cast<inaddr_type const *>(static_cast<void const *>(&(*this)[0]));
00056 }
00057 
00058 prefix_ senf::INet4Address::inaddr_type senf::INet4Address::inaddr()
00059     const
00060 {
00061     return iref();
00062 }
00063 
00064 prefix_ senf::INet4Address::INet4Address(inaddr_type addr, InAddr_t)
00065 {
00066     iref() = addr;
00067 }
00068 
00069 prefix_ bool senf::INet4Address::broadcast()
00070     const
00071 {
00072     return inaddr() == 0xFFFFFFFFu;
00073 }
00074 
00075 prefix_ bool senf::INet4Address::boolean_test()
00076     const
00077 {
00078     return inaddr();
00079 }
00080 
00081 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00082 // senf::INet4Network
00083 
00084 prefix_ unsigned senf::INet4Network::prefix_len()
00085     const
00086 {
00087     return prefix_len_;
00088 }
00089 
00090 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00091 // private members
00092 
00093 prefix_ boost::uint32_t senf::INet4Network::mask()
00094     const
00095 {
00096     // This is correct as long as the system is using 2-complement arithmetic ...
00097     return (~((boost::uint32_t(1u)<<(32u-prefix_len()))-1u)) & 0xFFFFFFFFu;
00098 }
00099 
00100 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00101 // public members
00102 
00103 prefix_ senf::INet4Network::INet4Network()
00104     : prefix_len_(), address_()
00105 {}
00106 
00107 prefix_ senf::INet4Network::INet4Network(INet4Address const & address, unsigned prefix_len)
00108     : prefix_len_(prefix_len), address_(INet4Address(address.address() & mask()))
00109 {}
00110 
00111 prefix_ senf::INet4Address const & senf::INet4Network::address()
00112     const
00113 {
00114     return address_;
00115 }
00116 
00117 prefix_ bool senf::INet4Network::boolean_test()
00118     const
00119 {
00120     return address() || prefix_len();
00121 }
00122 
00123 prefix_ bool senf::INet4Network::operator==(INet4Network const & other)
00124     const
00125 {
00126     return address() == other.address() && prefix_len() == other.prefix_len();
00127 }
00128 
00129 prefix_ bool senf::INet4Network::match(INet4Address const & addr)
00130     const
00131 {
00132     return (addr.address() & mask()) == address_.address();
00133 }
00134 
00135 prefix_ bool senf::INet4Network::match(INet4Network const & net)
00136     const
00137 {
00138     return net.prefix_len() >= prefix_len() && match(net.address());
00139 }
00140 
00141 prefix_ senf::INet4Address senf::INet4Network::host(boost::uint32_t number)
00142 {
00143     return INet4Address(address_.address() | (number & ~mask()));
00144 }
00145 
00146 prefix_ senf::INet4Network senf::INet4Network::subnet(boost::uint32_t net, unsigned prefix_len)
00147 {
00148     return INet4Network(host(net << (32-prefix_len)),prefix_len);
00149 }
00150 
00151 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00152 // namespace members
00153 
00154 prefix_ std::ostream & senf::operator<<(std::ostream & os, INet4Network const & addr)
00155 {
00156     os << addr.address() << '/' << addr.prefix_len();
00157     return os;
00158 }
00159 
00160 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00161 #undef prefix_
00162 
00163 
00164 // Local Variables:
00165 // mode: c++
00166 // fill-column: 100
00167 // comment-column: 40
00168 // c-file-style: "senf"
00169 // indent-tabs-mode: nil
00170 // ispell-local-dictionary: "american"
00171 // compile-command: "scons -u test"
00172 // End: