Correct way to map C #define to version

Mike Wey mike-wey at example.com
Mon Oct 29 12:32:02 PDT 2012


On 10/29/2012 03:14 PM, Regan Heath wrote:
> On Mon, 29 Oct 2012 13:47:46 -0000, Sumit Raja <sumitraja at gmail.com> wrote:
>> On Monday, 29 October 2012 at 12:31:56 UTC, Regan Heath wrote:
>>> On Mon, 29 Oct 2012 11:31:33 -0000, Sumit Raja <sumitraja at gmail.com>
>>> wrote:
>>>> Thanks both this works great for structs. Anything similar I can do
>>>> for enums?
>>>
>>> Example?  (The C/C++ code you're trying to convert..)
>>
>> Yeah that might help... One example here (though it seems slightly
>> inconsistent as the enum following the second if seems to be padded
>> for the values inside the ifdef):
>>
>> enum PixelFormat {
>>      PIX_FMT_NONE= -1,
>> .
>> .
>> .
>> #ifdef AV_PIX_FMT_ABI_GIT_MASTER
>>      PIX_FMT_RGBA64BE,  ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G,
>> 16B, 16A, the 2-byte value for each R/G/B/A component is stored as
>> big-endian
>>      PIX_FMT_RGBA64LE,  ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G,
>> 16B, 16A, the 2-byte value for each R/G/B/A component is stored as
>> little-endian
>>      PIX_FMT_BGRA64BE,  ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G,
>> 16R, 16A, the 2-byte value for each R/G/B/A component is stored as
>> big-endian
>>      PIX_FMT_BGRA64LE,  ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G,
>> 16R, 16A, the 2-byte value for each R/G/B/A component is stored as
>> little-endian
>> #endif
>>      PIX_FMT_GBRP,      ///< planar GBR 4:4:4 24bpp
>> .
>> .
>> .
>>      PIX_FMT_GBRP16LE,  ///< planar GBR 4:4:4 48bpp, little endian
>>
>> #ifndef AV_PIX_FMT_ABI_GIT_MASTER
>>      PIX_FMT_RGBA64BE=0x123,  ///< packed RGBA 16:16:16:16, 64bpp,
>> 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is
>> stored as big-endian
>>      PIX_FMT_RGBA64LE,  ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G,
>> 16B, 16A, the 2-byte value for each R/G/B/A component is stored as
>> little-endian
>>      PIX_FMT_BGRA64BE,  ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G,
>> 16R, 16A, the 2-byte value for each R/G/B/A component is stored as
>> big-endian
>>      PIX_FMT_BGRA64LE,  ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G,
>> 16R, 16A, the 2-byte value for each R/G/B/A component is stored as
>> little-endian
>> #endif
>>      PIX_FMT_0RGB=0x123+4,      ///< packed RGB 8:8:8, 32bpp, 0RGB0RGB...
>> .
>> .
>> .
>> };
>
> Well, I can't see a way to do that in D without duplicating most of the
> enum.  :(
>
> If no-one else can think of a way, I reckon we want an enhancement
> request to allow "version" or "static if" or perhaps "mixin" inside
> enums...
>
> http://d.puremagic.com/issues/
>
> R
>

You could mixin the entire enum, like this:
https://github.com/MikeWey/DMagick/blob/master/dmagick/c/distort.d#L239

-- 
Mike Wey


More information about the Digitalmars-d-learn mailing list