You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Fredrik Ekre db0d1f2655 Fix print order bug 4 years ago
.github Add CI configuration. 4 years ago
src Fix print order bug 4 years ago
test Fix overflow bug with unsigned integer types. 4 years ago
.gitignore Add package skeleton. 4 years ago
LICENSE Add package skeleton. 4 years ago
Project.toml Add package content. 4 years ago
README.md Update README.md. 4 years ago

README.md

EnumX.jl

This is what I wish Base.@enum was.

Usage

EnumX exports the macro @enumx, which works similarly to Base.@enum, but with some improvements.

The main drawback of Base.@enum is that the names for instances are not scoped. This means, for example, that it is inconvenient to use "common" names for enum instances, and it is impossible to have multiple enums with the same instance names.

EnumX.@enumx solves these limitations by putting everything behind a module scope such that instances are hidden and instead accessed using dot-syntax:

julia> using EnumX

julia> @enumx Fruit Apple Banana

julia> Fruit.Apple
Fruit.Apple = 0

julia> Fruit.Banana
Fruit.Banana = 1

Fruit is a module -- the actual enum type is defined as Fruit.Type:

julia> Fruit.Type
Enum type Fruit.Type <: Enum{Int32} with 2 instances:
 Fruit.Apple  = 0
 Fruit.Banana = 1

julia> Fruit.Type <: Base.Enum
true

Since the only reserved name in the example above is the module Fruit we can create another enum with overlapping instance names (this would not be possible with Base.@enum):

julia> @enumx YellowFruits Banana Lemon

julia> YellowFruits.Banana
YellowFruits.Banana = 0

@enumx also allows for duplicate values:

julia> Fruit.Type
Enum type Fruit.Type <: Enum{Int32} with 2 instances:
 Fruit.Apple  = 1
 Fruit.Banana = 1

julia> Fruit.Apple
Fruit.Apple = Fruit.Banana = 1

julia> Fruit.Banana
Fruit.Apple = Fruit.Banana = 1

@enumx also lets you use previous enum names for value initialization:

julia> @enumx Fruit Apple Banana Orange=Apple

julia> Fruit.Type
Enum type Fruit.Type <: Enum{Int32} with 3 instances:
 Fruit.Apple  = 0
 Fruit.Banana = 1
 Fruit.Orange = 0

Other than that, functionality should be comparable to Base.@enum:

  • Base type specification (defaults to Int32):

    julia> @enumx Fruit::UInt8 Apple Banana
    
    julia> typeof(Integer(Fruit.Apple))
    UInt8
    
  • Specifying values (if not specified, defaults to the value of the previous instance + 1):

    julia> @enumx Fruit Apple=4 Banana=(1 + 5) Orange
    
    julia> Fruit.Type
    Enum type Fruit.Type <: Enum{Int32} with 3 instances:
     Fruit.Apple  = 4
     Fruit.Banana = 6
     Fruit.Orange = 7
    
  • Definition with begin/end block:

    julia> @enumx Fruit begin
               Apple
               Banana
               Orange
           end
    

See also

Community discussions

Related packages

  • CEnum.jl: C-compatible Enums.
  • SuperEnum.jl: Similar approach as EnumX, but doesn't give you Base.Enums.