Skip to content

Need to think how to bind C enums with aliases #38

@ian-ross

Description

@ian-ross

Bug imported from C2HS Trac

Trac ticket created: 2011-08-26T02:01:18-0700


Consider this C enum:

typedef enum
{
  GTK_ANCHOR_CENTER,
  GTK_ANCHOR_NORTH,
  GTK_ANCHOR_NORTH_WEST,
  GTK_ANCHOR_NORTH_EAST,
  GTK_ANCHOR_SOUTH,
  GTK_ANCHOR_SOUTH_WEST,
  GTK_ANCHOR_SOUTH_EAST,
  GTK_ANCHOR_WEST,
  GTK_ANCHOR_EAST,
  GTK_ANCHOR_N          = GTK_ANCHOR_NORTH,
  GTK_ANCHOR_NW         = GTK_ANCHOR_NORTH_WEST,
  GTK_ANCHOR_NE         = GTK_ANCHOR_NORTH_EAST,
  GTK_ANCHOR_S          = GTK_ANCHOR_SOUTH,
  GTK_ANCHOR_SW         = GTK_ANCHOR_SOUTH_WEST,
  GTK_ANCHOR_SE         = GTK_ANCHOR_SOUTH_EAST,
  GTK_ANCHOR_W          = GTK_ANCHOR_WEST,
  GTK_ANCHOR_E          = GTK_ANCHOR_EAST
} GtkAnchorType;

Of course in C, enums are really ints, so it's ok to have aliases. It is the case that GTK_ANCHOR_E = GTK_ANCHOR_EAST since both enum names have the int value 9.

Currently c2hs binds this as:

data GtkAnchorType = GtkAnchorCenter
                   | GtkAnchorNorth
                   | GtkAnchorNorthWest
                   | GtkAnchorNorthEast
                   | GtkAnchorSouth
                   | GtkAnchorSouthWest
                   | GtkAnchorSouthEast
                   | GtkAnchorWest
                   | GtkAnchorEast
                   | GtkAnchorN
                   | GtkAnchorNw
                   | GtkAnchorNe
                   | GtkAnchorS
                   | GtkAnchorSw
                   | GtkAnchorSe
                   | GtkAnchorW
                   | GtkAnchorE
                   deriving (Eq,Show)

instance Enum GtkAnchorType where
  fromEnum GtkAnchorCenter = 0
  fromEnum GtkAnchorNorth = 1
  fromEnum GtkAnchorNorthWest = 2
  fromEnum GtkAnchorNorthEast = 3
  fromEnum GtkAnchorSouth = 4
  fromEnum GtkAnchorSouthWest = 5
  fromEnum GtkAnchorSouthEast = 6
  fromEnum GtkAnchorWest = 7
  fromEnum GtkAnchorEast = 8
  fromEnum GtkAnchorN = 1
  fromEnum GtkAnchorNw = 2
  fromEnum GtkAnchorNe = 3
  fromEnum GtkAnchorS = 4
  fromEnum GtkAnchorSw = 5
  fromEnum GtkAnchorSe = 6
  fromEnum GtkAnchorW = 7
  fromEnum GtkAnchorE = 8

  toEnum 0 = GtkAnchorCenter
  toEnum 1 = GtkAnchorNorth
  toEnum 2 = GtkAnchorNorthWest
  toEnum 3 = GtkAnchorNorthEast
  toEnum 4 = GtkAnchorSouth
  toEnum 5 = GtkAnchorSouthWest
  toEnum 6 = GtkAnchorSouthEast
  toEnum 7 = GtkAnchorWest
  toEnum 8 = GtkAnchorEast
  toEnum 1 = GtkAnchorN
  toEnum 2 = GtkAnchorNw
  toEnum 3 = GtkAnchorNe
  toEnum 4 = GtkAnchorS
  toEnum 5 = GtkAnchorSw
  toEnum 6 = GtkAnchorSe
  toEnum 7 = GtkAnchorW
  toEnum 8 = GtkAnchorE
  toEnum unmatched = error ("GtkAnchorType.toEnum: Cannot match " ++ show unmatched)

Note in particular that the toEnum has overlaps. It's also obviously not the case in Haskell that GtkAnchorE = GtkAnchorEast. Perhaps we should ignore aliases, that is pretend that the enum values GTK_ANCHOR_E etc are simply not present.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions