X-Git-Url: http://g0dil.de/git?p=senf.git;a=blobdiff_plain;f=senf%2FSocket%2FProtocols%2FINet%2FINet4Address.cci;fp=senf%2FSocket%2FProtocols%2FINet%2FINet4Address.cci;h=0232dd94e1b3d342a7c49947f2921b26fb03dda3;hp=40024ca1c8ba3e5c33bd53bc5a98c88abfbc24b6;hb=b2fff1b50e0010fdad28cb638987cbf88032e30e;hpb=c305d6b970e5952fe006270c7184b8bbb10ba2ee diff --git a/senf/Socket/Protocols/INet/INet4Address.cci b/senf/Socket/Protocols/INet/INet4Address.cci index 40024ca..0232dd9 100644 --- a/senf/Socket/Protocols/INet/INet4Address.cci +++ b/senf/Socket/Protocols/INet/INet4Address.cci @@ -29,6 +29,7 @@ \brief INet4Address inline non-template implementation */ // Custom includes +#include #define prefix_ inline //-///////////////////////////////////////////////////////////////////////////////////////////////// @@ -86,22 +87,6 @@ prefix_ bool senf::INet4Address::boolean_test() //-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::INet4Network -prefix_ unsigned senf::INet4Network::prefix_len() - const -{ - return prefix_len_; -} - -//-///////////////////////////////////////////////////////////////////////////////////////////////// -// private members - -prefix_ boost::uint32_t senf::INet4Network::mask() - const -{ - // This is correct as long as the system is using 2-complement arithmetic ... - return (~((boost::uint32_t(1u)<<(32u-prefix_len()))-1u)) & 0xFFFFFFFFu; -} - //-///////////////////////////////////////////////////////////////////////////////////////////////// // public members @@ -110,7 +95,8 @@ prefix_ senf::INet4Network::INet4Network() {} prefix_ senf::INet4Network::INet4Network(INet4Address const & address, unsigned prefix_len) - : prefix_len_(prefix_len), address_(INet4Address(address.address() & mask())) + : prefix_len_( prefix_len_checked(prefix_len)), + address_(INet4Address(address.address() & mask())) {} prefix_ senf::INet4Address const & senf::INet4Network::address() @@ -119,6 +105,12 @@ prefix_ senf::INet4Address const & senf::INet4Network::address() return address_; } +prefix_ unsigned senf::INet4Network::prefix_len() + const +{ + return prefix_len_; +} + prefix_ bool senf::INet4Network::boolean_test() const { @@ -154,6 +146,25 @@ prefix_ senf::INet4Network senf::INet4Network::subnet(boost::uint32_t net, unsig } //-///////////////////////////////////////////////////////////////////////////////////////////////// +// private members + +prefix_ unsigned senf::INet4Network::prefix_len_checked(unsigned prefix_len) + const +{ + if (prefix_len > 32) + throw AddressSyntaxException("invalid INet4 prefix length: " + + boost::lexical_cast(prefix_len)); + return prefix_len; +} + +prefix_ boost::uint32_t senf::INet4Network::mask() + const +{ + // This is correct as long as the system is using 2-complement arithmetic ... + return (~((boost::uint32_t(1u)<<(32u-prefix_len()))-1u)) & 0xFFFFFFFFu; +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // namespace members prefix_ std::ostream & senf::operator<<(std::ostream & os, INet4Network const & addr)