From e668ce72f6fd78fda1e59c0dbd4e0db1674ca097 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Tue, 28 Jul 2020 20:29:29 +0800 Subject: [PATCH] msg/msg_types.h: add pick_addr() for picking an addr from an entity_addrvec_t by given protocol type. so: - v2 => v2, any - v1 => v1, any - any => any, v1, v2 and add a helper of `addr_of_type()` to avoid repeatings. Signed-off-by: Kefu Chai --- src/msg/msg_types.h | 48 ++++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/src/msg/msg_types.h b/src/msg/msg_types.h index 837474ec239..207481a5095 100644 --- a/src/msg/msg_types.h +++ b/src/msg/msg_types.h @@ -570,12 +570,7 @@ struct entity_addrvec_t { bool empty() const { return v.empty(); } entity_addr_t legacy_addr() const { - for (auto& a : v) { - if (a.type == entity_addr_t::TYPE_LEGACY) { - return a; - } - } - return entity_addr_t(); + return addr_of_type(entity_addr_t::TYPE_LEGACY); } entity_addr_t as_legacy_addr() const { for (auto& a : v) { @@ -605,22 +600,14 @@ struct entity_addrvec_t { return a; } } - if (!v.empty()) { - return v.front(); - } - return entity_addr_t(); + return front(); } std::string get_legacy_str() const { return legacy_or_front_addr().get_legacy_str(); } entity_addr_t msgr2_addr() const { - for (auto &a : v) { - if (a.type == entity_addr_t::TYPE_MSGR2) { - return a; - } - } - return entity_addr_t(); + return addr_of_type(entity_addr_t::TYPE_MSGR2); } bool has_msgr2() const { for (auto& a : v) { @@ -631,6 +618,35 @@ struct entity_addrvec_t { return false; } + entity_addr_t pick_addr(uint32_t type) const { + entity_addr_t picked_addr; + switch (type) { + case entity_addr_t::TYPE_LEGACY: + [[fallthrough]]; + case entity_addr_t::TYPE_MSGR2: + picked_addr = addr_of_type(type); + break; + case entity_addr_t::TYPE_ANY: + return front(); + default: + return {}; + } + if (!picked_addr.is_blank_ip()) { + return picked_addr; + } else { + return addr_of_type(entity_addr_t::TYPE_ANY); + } + } + + entity_addr_t addr_of_type(uint32_t type) const { + for (auto &a : v) { + if (a.type == type) { + return a; + } + } + return entity_addr_t(); + } + bool parse(const char *s, const char **end = 0); void get_ports(std::set *ports) const { -- 2.39.5