<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>