summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2019-02-11 11:41:26 +0100
committerRenato Westphal <renato@opensourcerouting.org>2019-02-11 18:49:49 +0100
commitbe566e4e45aed586716958a1c4adeb00cc352bc0 (patch)
treed02f0f1ebdb8a4ca1385fa8a09364ab647ec9b44
parentlib: revert table.h change for C++ (diff)
downloadfrr-be566e4e45aed586716958a1c4adeb00cc352bc0.tar.xz
frr-be566e4e45aed586716958a1c4adeb00cc352bc0.zip
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 <equinox@diac24.net>
-rw-r--r--lib/prefix.h29
1 files changed, 19 insertions, 10 deletions
diff --git a/lib/prefix.h b/lib/prefix.h
index aaffb1e0c..231a407cc 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