Skip to content

Commit 4a0dbbe

Browse files
committed
refactor with c++ style
1 parent ac2aaab commit 4a0dbbe

File tree

1 file changed

+21
-26
lines changed

1 file changed

+21
-26
lines changed

src/Functions/isIPAddressContainedIn.cpp

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -72,35 +72,30 @@ struct IPTrait<IPKind::String>
7272
class IPAddressVariant
7373
{
7474
public:
75+
explicit IPAddressVariant(UInt32 addr_): addr(addr_)
76+
{
77+
}
7578

76-
template<IPKind kind>
77-
static IPAddressVariant create(IPTrait<kind>::ElementType address)
79+
explicit IPAddressVariant(UInt128 addr_)
7880
{
79-
IPAddressVariant ip;
80-
if constexpr (kind == IPKind::IPv4)
81-
ip.addr = address;
82-
else if constexpr (kind == IPKind::IPv6)
83-
{
84-
ip.addr = IPv6AddrType();
85-
auto * dst = std::get<IPv6AddrType>(ip.addr).data();
86-
const char * src = reinterpret_cast<const char *>(&address.items);
87-
memcpy(dst, src, IPV6_BINARY_LENGTH);
88-
}
81+
addr = IPv6AddrType();
82+
auto * dst = std::get<IPv6AddrType>(addr).data();
83+
const char * src = reinterpret_cast<const char *>(&addr_.items);
84+
memcpy(dst, src, IPV6_BINARY_LENGTH);
85+
}
86+
87+
explicit IPAddressVariant(std::string_view addr_)
88+
{
89+
UInt32 v4;
90+
if (DB::parseIPv4whole(addr_.data(), addr_.data() + addr_.size(), reinterpret_cast<unsigned char *>(&v4)))
91+
addr = v4;
8992
else
9093
{
91-
UInt32 v4;
92-
if (DB::parseIPv4whole(address.data(), address.data() + address.size(), reinterpret_cast<unsigned char *>(&v4)))
93-
ip.addr = v4;
94-
else
95-
{
96-
ip.addr = IPv6AddrType();
97-
bool success = DB::parseIPv6whole(address.data(), address.data() + address.size(), std::get<IPv6AddrType>(ip.addr).data());
98-
if (!success)
99-
throw DB::Exception(DB::ErrorCodes::CANNOT_PARSE_TEXT, "Neither IPv4 nor IPv6 address: '{}'", address);
100-
}
94+
addr = IPv6AddrType();
95+
bool success = DB::parseIPv6whole(addr_.data(), addr_.data() + addr_.size(), std::get<IPv6AddrType>(addr).data());
96+
if (!success)
97+
throw DB::Exception(DB::ErrorCodes::CANNOT_PARSE_TEXT, "Neither IPv4 nor IPv6 address: '{}'", addr_);
10198
}
102-
103-
return ip;
10499
}
105100

106101
UInt32 asV4() const
@@ -140,7 +135,7 @@ IPAddressCIDR parseIPWithCIDR(std::string_view cidr_str)
140135
throw DB::Exception(DB::ErrorCodes::CANNOT_PARSE_TEXT, "The text does not contain '/': {}", std::string(cidr_str));
141136

142137
std::string_view addr_str = cidr_str.substr(0, pos_slash);
143-
auto addr = IPAddressVariant::create<IPKind::String>(addr_str);
138+
auto addr = IPAddressVariant(addr_str);
144139

145140
uint8_t prefix = 0;
146141
auto prefix_str = cidr_str.substr(pos_slash+1);
@@ -185,7 +180,7 @@ namespace DB
185180
template <IPKind kind>
186181
static inline IPAddressVariant parseIP(const IPTrait<kind>::ColumnType * col_addr, size_t n)
187182
{
188-
return IPAddressVariant::create<kind>(IPTrait<kind>::getElement(col_addr, n));
183+
return IPAddressVariant(IPTrait<kind>::getElement(col_addr, n));
189184
}
190185

191186
static std::optional<IPAddressVariant> parseConstantIP(const ColumnConst & col_addr)

0 commit comments

Comments
 (0)