Glad hear it's working for you!

On Friday, 6 January 2017 at 10:25:26 UTC, Claude wrote:

So I had a stream of:

version (Win32)
  enum bool WindowsSupported = true;
else
  enum bool WindowsSupported = false;

version (Win64)
  enum bool WindowsSupported = true; //Ooops
else
  enum bool WindowsSupported = false; //Ooops


These can be condensed to:

version(Win32)
    enum bool WindowsSupported = true;
else version(Win64)
    enum bool WindowsSupported = true;
else
    enum bool WindowsSupported = false;

Or even better, since it doesn't appear you need to distinguish between 32-bit & 64-bit:

version(Windows)
    enum bool WindowsSupported = true;
else
    enum bool WindowsSupported = false;


It turned out to be not so readable (even when using a "string mixin" to make the code tighter), and I cannot define twice an enum without using "static if", which was a deal-breaker. Also the conciseness of the versions for the D compilers (only 4: DMD, GDC, LDC and SDC), as well as the different OS versions made the code a lot tighter than the C version.

For me, the readability is no issue. I would put that block above in a single module (which I like to call config.d) and then import it where I need it. This actually is a lot cleaner for the corner cases where version breaks down (see below).



So I just dropped the enum definition thing and just used "version" as it was designed to be used:

version (Win32)
  version = WindowsSupported;
else version (Win64)
  version = WindowsSupported;
else etc...

version(Windows) { }


That little experience showed that using version as it is designed currently is enough to elegantly cover my needs. And it seemed to scale well. Also I think it may force developers to handle all version specific stuff into one specific module and define your own version identifiers to list features from compiler, OS, target architecture version identifiers; which is a good coding practice anyway.


Yes, it works quite well for most use cases and should generally be preferred. I disagree that it scales, though. At some point (a point that is highly project-dependent), it breaks down, requiring either very large modules or duplicated versions across multiple modules.

My position is that I will always choose version blocks first, but if I find myself in a situation where I have to choose between duplicating version statements (e.g. version(A) {version=AorB; version=AorC;}) across multiple modules and restructuring my code to accommodate versioning, I much prefer to use the enum alternative as an escape hatch.


Reply via email to