www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Emulate C's (polymorphic) NULL type

reply ParticlePeter <ParticlePeter gmx.de> writes:
In C NULL can be used as integer as well as null pointer.
Is there a way to create such a type in D?

The type should have only one value which is obviously (0/null).
A extern( C ) function should be able to take it as either one.

Overloaded enum pops into my mind as example:
enum NULL = 0;
enum NULL = null;


Is this possible somehow?
Jun 06 2016
next sibling parent reply Anonymouse <asdf asdf.com> writes:
On Monday, 6 June 2016 at 09:43:23 UTC, ParticlePeter wrote:
 In C NULL can be used as integer as well as null pointer.
 Is there a way to create such a type in D?

 The type should have only one value which is obviously (0/null).
 A extern( C ) function should be able to take it as either one.

 Overloaded enum pops into my mind as example:
 enum NULL = 0;
 enum NULL = null;


 Is this possible somehow?
If you want it for use in logical expressions then implicit boolean conversion will treat them as the same. https://dpaste.dzfl.pl/d82f60657c37
Jun 06 2016
parent reply ParticlePeter <ParticlePeter gmx.de> writes:
On Monday, 6 June 2016 at 11:40:11 UTC, Anonymouse wrote:
 On Monday, 6 June 2016 at 09:43:23 UTC, ParticlePeter wrote:
 In C NULL can be used as integer as well as null pointer.
 Is there a way to create such a type in D?

 The type should have only one value which is obviously 
 (0/null).
 A extern( C ) function should be able to take it as either one.

 Overloaded enum pops into my mind as example:
 enum NULL = 0;
 enum NULL = null;


 Is this possible somehow?
If you want it for use in logical expressions then implicit boolean conversion will treat them as the same. https://dpaste.dzfl.pl/d82f60657c37
I don't see the connection here, you introduced two symbols with two different types. I want one symbol which can pose as two different (constant) types.
Jun 06 2016
parent Anonymouse <asdf asdf.net> writes:
On Monday, 6 June 2016 at 12:09:33 UTC, ParticlePeter wrote:
 I don't see the connection here, you introduced two symbols 
 with two different types. I want one symbol which can pose as 
 two different (constant) types.
Ah, my apologies, I misunderstood the question.
Jun 06 2016
prev sibling next sibling parent Anonymouse <asdf asdf.com> writes:
On Monday, 6 June 2016 at 09:43:23 UTC, ParticlePeter wrote:
 A extern( C ) function should be able to take it as either one.
Missed this bit. Not sure about that one.
Jun 06 2016
prev sibling parent reply Alex Parrill <initrd.gz gmail.com> writes:
On Monday, 6 June 2016 at 09:43:23 UTC, ParticlePeter wrote:
 In C NULL can be used as integer as well as null pointer.
 Is there a way to create such a type in D?

 The type should have only one value which is obviously (0/null).
 A extern( C ) function should be able to take it as either one.

 Overloaded enum pops into my mind as example:
 enum NULL = 0;
 enum NULL = null;


 Is this possible somehow?
I already asked about this: https://forum.dlang.org/post/bnkqevhyxwdjjxscteus forum.dlang.org Tldr; doesn't seem to be possible without multiple alias this or using ABI hacks.
Jun 06 2016
parent reply ParticlePeter <ParticlePeter gmx.de> writes:
On Monday, 6 June 2016 at 16:19:02 UTC, Alex Parrill wrote:
 On Monday, 6 June 2016 at 09:43:23 UTC, ParticlePeter wrote:
 In C NULL can be used as integer as well as null pointer.
 Is there a way to create such a type in D?

 The type should have only one value which is obviously 
 (0/null).
 A extern( C ) function should be able to take it as either one.

 Overloaded enum pops into my mind as example:
 enum NULL = 0;
 enum NULL = null;


 Is this possible somehow?
I already asked about this: https://forum.dlang.org/post/bnkqevhyxwdjjxscteus forum.dlang.org Tldr; doesn't seem to be possible without multiple alias this or using ABI hacks.
O.k., my web search didn't find that topic. The last reply looks promising, wouldn't that work?
Jun 06 2016
next sibling parent ParticlePeter <ParticlePeter gmx.de> writes:
On Monday, 6 June 2016 at 18:33:36 UTC, ParticlePeter wrote:
 On Monday, 6 June 2016 at 16:19:02 UTC, Alex Parrill wrote:
 On Monday, 6 June 2016 at 09:43:23 UTC, ParticlePeter wrote:
 In C NULL can be used as integer as well as null pointer.
 Is there a way to create such a type in D?

 The type should have only one value which is obviously 
 (0/null).
 A extern( C ) function should be able to take it as either 
 one.

 Overloaded enum pops into my mind as example:
 enum NULL = 0;
 enum NULL = null;


 Is this possible somehow?
I already asked about this: https://forum.dlang.org/post/bnkqevhyxwdjjxscteus forum.dlang.org Tldr; doesn't seem to be possible without multiple alias this or using ABI hacks.
O.k., my web search didn't find that topic. The last reply looks promising, wouldn't that work?
Lets bump it and discuss there.
Jun 06 2016
prev sibling parent Alex Parrill <initrd.gz gmail.com> writes:
On Monday, 6 June 2016 at 18:33:36 UTC, ParticlePeter wrote:
 On Monday, 6 June 2016 at 16:19:02 UTC, Alex Parrill wrote:
 On Monday, 6 June 2016 at 09:43:23 UTC, ParticlePeter wrote:
 In C NULL can be used as integer as well as null pointer.
 Is there a way to create such a type in D?

 The type should have only one value which is obviously 
 (0/null).
 A extern( C ) function should be able to take it as either 
 one.

 Overloaded enum pops into my mind as example:
 enum NULL = 0;
 enum NULL = null;


 Is this possible somehow?
I already asked about this: https://forum.dlang.org/post/bnkqevhyxwdjjxscteus forum.dlang.org Tldr; doesn't seem to be possible without multiple alias this or using ABI hacks.
O.k., my web search didn't find that topic. The last reply looks promising, wouldn't that work?
That's the ABI hack I mentioned. It abuses the fact that on most hardware and compiled, a pointer and a structure containing a single pointer have the same binary representation. It will likely work, but it isn't guarenteed.
Jun 06 2016