Re: customized ERL_NIF_TERM type support
Daniel Goertzen <[email protected]> Fri, 7 Feb 2014 13:21:27 -0600
| Newsgroups | gmane.comp.lang.erlang.patches |
|---|---|
| Message-ID | <CAJCf5Ry3+hX__nz3d96-00OJnfUq014yasDcA=JhKf7zvtnFtQ@mail.gmail.com> |
Thank you for your feedback. Maybe the "hook" approach I suggested is too generic. My original patch from nifpp actually looks like this... #ifdef CPP11_UNIQUE_TERM_TYPE enum class ERL_NIF_TERM : ERL_NIF_UINT; #else typedef ERL_NIF_UINT ERL_NIF_TERM; #endif ...and then to use the typed enum in your c++ nif you write... #define CPP11_UNIQUE_TERM_TYPE #include <erl_nif.h> In the future ERL_NIF_TERM can be changed to a struct and the CPP11_UNIQUE_TERM_TYPE option can just be ignored. What do you think? Cheers, Dan. On Fri, Feb 7, 2014 at 12:46 PM, Sverker Eriksson < [email protected]> wrote: > Thanks for the patch. > > I got one objection/question though. My C++ knowledge is a bit rusty but > as I understand it > the "enum class" construct demands that Type is an integer type. > > This is currently true for ERL_NIF_TERM but it might not be in the future. > I earlier tried to define ERL_NIF_TERM as > > typedef struct { int x; } ERL_NIF_TERM; > > to get stronger type checking even for C. I reverted that due to bad > performance > as gcc has different calling conventions for int and struct {int}. > However, future compilers > might be better at passing struct{int} by value in which case we might > want to change > the definition of ERL_NIF_TERM. > > What then? Do we ignore CUSTOM_NIF_TERM_TYPE in such a scenario? > > > /Sverker, Erlang/OTP > > > > On 02/07/2014 06:34 PM, Daniel Goertzen wrote: > > 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. > > > > > _______________________________________________ > erlang-patches mailing [email protected]://erlang.org/mailman/listinfo/erlang-patches > > > _______________________________________________ erlang-patches mailing list [email protected] http://erlang.org/mailman/listinfo/erlang-patches