bool iface_info::check( const address_type & test ) const { bool res = false; if( sockaddr_.is_v4( ) && test.is_v4( ) ) { auto sa = sockaddr_.to_v4( ).to_ulong( ); auto ma = mask_.to_v4( ).to_ulong( ); auto ta = test.to_v4( ).to_ulong( ); res = ((sa & ma) == (ta & ma)); } else if( sockaddr_.is_v6( ) && test.is_v6( ) ) { #ifdef _WIN32 return true; // always valid. #else auto sa = sockaddr_.to_v6( ).to_bytes( ); auto ma = mask_.to_v6( ).to_bytes( ); auto ta = test.to_v6( ).to_bytes( ); /// something wrong! static_assert( sa.max_size( ) == 16, "bytes_type::max_size( ) != 16" ); res = (sa[0x0] & ma[0x0]) == (ta[0x0] & ma[0x0]) && (sa[0x1] & ma[0x1]) == (ta[0x1] & ma[0x1]) && (sa[0x2] & ma[0x2]) == (ta[0x2] & ma[0x2]) && (sa[0x3] & ma[0x3]) == (ta[0x3] & ma[0x3]) && (sa[0x4] & ma[0x4]) == (ta[0x4] & ma[0x4]) && (sa[0x5] & ma[0x5]) == (ta[0x5] & ma[0x5]) && (sa[0x6] & ma[0x6]) == (ta[0x6] & ma[0x6]) && (sa[0x7] & ma[0x7]) == (ta[0x7] & ma[0x7]) && (sa[0x8] & ma[0x8]) == (ta[0x8] & ma[0x8]) && (sa[0x9] & ma[0x9]) == (ta[0x9] & ma[0x9]) && (sa[0xA] & ma[0xA]) == (ta[0xA] & ma[0xA]) && (sa[0xB] & ma[0xB]) == (ta[0xB] & ma[0xB]) && (sa[0xC] & ma[0xC]) == (ta[0xC] & ma[0xC]) && (sa[0xD] & ma[0xD]) == (ta[0xD] & ma[0xD]) && (sa[0xE] & ma[0xE]) == (ta[0xE] & ma[0xE]) && (sa[0xF] & ma[0xF]) == (ta[0xF] & ma[0xF]) ; #endif } return res; }