In a FLAC (as in Free Lossless Audio Codec) package for version 0.4 I used 
@enum to create a type to pass to calls to the C library libflac. 

"""
Metadata for a flac stream object.

Used in both encoding and decoding of a stream.
Each type of metadata object contains an indicator
of its `typ`, an indicator of whether this is the
last metadata block and its length, in bytes.
"""
abstract StreamMetaData

@enum(MetadataType,
      InfoType=UInt32(0),
      PaddingType,
      ApplicationType,
      SeektableType,
      VorbisCommentType,
      CueSheetType,
      PictureType)

Some of the constructors are boilerplate, differing only in the 
MetadataType.  Can I iterate over these values and create all the 
constructors in a macro call?  Alternatively, if I iterate over the range 
0:6, can I convert the integer to a MetadataType?

The boilerplate looks like

"""
A block containing information on the stream including
`samplerate`, `channels`, `bitspersample`, `totalsamples`,
and `mdsum`.
"""
type StreamInfoMetaData <: StreamMetaData
    typ::MetadataType
    is_last::Cint
    len::Int64
    minblocksize::Int32
    maxblocksize::Int32
    minframesize::Int32
    maxframesize::Int32
    samplerate::Int32
    channels::Int32
    bitspersample::Int32
    totalsamples::Int64
    md5sum::NTuple{16,UInt8}
end

"""
The zero-argument constructor uses storage allocated by libflac.
"""
function StreamInfoMetaData()
    md = unsafe_load(ccall((:FLAC__metadata_object_new,libflac),
                          
 Ptr{StreamInfoMetaData},(MetadataType,),InfoType))
    finalizer(md,x->ccall((:FLAC__metadata_object_delete,libflac),
                          Void,(Ptr{StreamInfoMetaData},),pointer(x)))
    md
end


Reply via email to