<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">Thanks for the patch.<br>
<br>
I got one objection/question though. My C++ knowledge is a bit
rusty but as I understand it<br>
the "enum class" construct demands that Type is an integer type.<br>
<br>
This is currently true for ERL_NIF_TERM but it might not be in the
future.<br>
I earlier tried to define ERL_NIF_TERM as<br>
<br>
typedef struct { int x; } ERL_NIF_TERM;<br>
<br>
to get stronger type checking even for C. I reverted that due to
bad performance<br>
as gcc has different calling conventions for int and struct {int}.
However, future compilers<br>
might be better at passing struct{int} by value in which case we
might want to change<br>
the definition of ERL_NIF_TERM.<br>
<br>
What then? Do we ignore CUSTOM_NIF_TERM_TYPE in such a scenario?<br>
<br>
<br>
/Sverker, Erlang/OTP<br>
<br>
<br>
On 02/07/2014 06:34 PM, Daniel Goertzen wrote:<br>
</div>
<blockquote
cite="mid:CAJCf5RxSjiO4jRKngbToPWyyWwXQz2Vbu5niqQquDda1Wd-FgA@mail.gmail.com"
type="cite">
<pre wrap="">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 (
<a class="moz-txt-link-freetext" href="https://github.com/goertzenator/nifpp">https://github.com/goertzenator/nifpp</a>). The wrapper requires manual
installation of a similar patch, and I would love to remove that
requirement.
Regards,
Dan.
</pre>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
erlang-patches mailing list
<a class="moz-txt-link-abbreviated" href="mailto:erlang-patches@erlang.org">erlang-patches@erlang.org</a>
<a class="moz-txt-link-freetext" href="http://erlang.org/mailman/listinfo/erlang-patches">http://erlang.org/mailman/listinfo/erlang-patches</a>
</pre>
</blockquote>
<br>
</body>
</html>