]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: make union prefixptr C++-compatible
authorDavid Lamparter <equinox@opensourcerouting.org>
Mon, 11 Feb 2019 10:41:26 +0000 (11:41 +0100)
committerRenato Westphal <renato@opensourcerouting.org>
Mon, 11 Feb 2019 17:49:49 +0000 (15:49 -0200)
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>
lib/prefix.h

index aaffb1e0c5633e945da3495562ae555aa3418304..231a407cc8f0106ec775c0f5511bbe82e7b65bc8 100644 (file)
@@ -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