[erlang-patches] customized ERL_NIF_TERM type support
Daniel Goertzen
daniel.goertzen@REDACTED
Fri Feb 7 18:34:14 CET 2014
When writing NIFs in C++, it is impossible to employ C++ function
overloading because the underlying type of ERL_NIF_TERM is "unsigned int".
For example:
// won't compile :(
#include <erl_nif.h>
void my_func(ERL_NIF_TERM a) {...}
void my_func(unsigned int a) {...}
This patch allows NIF authors to mutate the type of ERL_NIF_TERM by
defining the macro CUSTOM_NIF_TERM_TYPE(). In the example below, the
underlying unsigned integer type gets wrapped as a C++11 typed
enumeration. The type of ERL_NIF_TERM is now unique and can be used in
overloaded functions.
// compiles! :)
#define CUSTOM_NIF_TERM_TYPE(Type) enum class ERL_NIF_TERM : Type {};
#include <erl_nif.h>
void my_func(ERL_NIF_TERM a) {...}
void my_func(unsigned int a) {...}
The patch has no impact on erl_nif.h if CUSTOM_NIF_TERM_TYPE is not defined
(other than flipping the definition order of ERL_NIF_TERM and ERL_NIF_UINT).
A similar approach has been used on my C++11 NIF wrapper (
https://github.com/goertzenator/nifpp). The wrapper requires manual
installation of a similar patch, and I would love to remove that
requirement.
Regards,
Dan.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-patches/attachments/20140207/4dbb28c9/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: custom_erl_nif_term.patch
Type: text/x-patch
Size: 889 bytes
Desc: not available
URL: <http://erlang.org/pipermail/erlang-patches/attachments/20140207/4dbb28c9/attachment.bin>
More information about the erlang-patches
mailing list