From: David Lamparter Date: Mon, 11 Feb 2019 10:41:26 +0000 (+0100) Subject: lib: make union prefixptr C++-compatible X-Git-Tag: 7.1_pulled~248^2~8 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=be566e4e45aed586716958a1c4adeb00cc352bc0;p=matthieu%2Ffrr.git lib: make union prefixptr C++-compatible Add a no-op conversion constructor to tell C++ that union prefixptr accepts any of its member types. Signed-off-by: David Lamparter --- diff --git a/lib/prefix.h b/lib/prefix.h index aaffb1e0c5..231a407cc8 100644 --- a/lib/prefix.h +++ b/lib/prefix.h @@ -276,20 +276,29 @@ struct prefix_sg { * side, which strips type safety since the cast will accept any pointer * type.) */ +#ifndef __cplusplus +#define prefixtype(uname, typename, fieldname) \ + typename *fieldname; +#else +#define prefixtype(uname, typename, fieldname) \ + typename *fieldname; \ + uname(typename *x) { this->fieldname = x; } +#endif + union prefixptr { - struct prefix *p; - struct prefix_ipv4 *p4; - struct prefix_ipv6 *p6; - struct prefix_evpn *evp; - const struct prefix_fs *fs; + prefixtype(prefixptr, struct prefix, p) + prefixtype(prefixptr, struct prefix_ipv4, p4) + prefixtype(prefixptr, struct prefix_ipv6, p6) + prefixtype(prefixptr, struct prefix_evpn, evp) + prefixtype(prefixptr, struct prefix_fs, fs) } __attribute__((transparent_union)); union prefixconstptr { - const struct prefix *p; - const struct prefix_ipv4 *p4; - const struct prefix_ipv6 *p6; - const struct prefix_evpn *evp; - const struct prefix_fs *fs; + prefixtype(prefixconstptr, const struct prefix, p) + prefixtype(prefixconstptr, const struct prefix_ipv4, p4) + prefixtype(prefixconstptr, const struct prefix_ipv6, p6) + prefixtype(prefixconstptr, const struct prefix_evpn, evp) + prefixtype(prefixconstptr, const struct prefix_fs, fs) } __attribute__((transparent_union)); #ifndef INET_ADDRSTRLEN