1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- import sets, hashes
- type
- Fruit* = ref object
- id*: int
- # Generic implementation. This doesn't work
- EntGroup*[T] = ref object
- freed*: HashSet[T]
- proc hash*(self: Fruit): Hash = hash(self.id)
- ##
- ## VVV The Generic implementation. This doesn't work VVV
- ##
- proc initEntGroup*[T: Fruit](): EntGroup[T] =
- result = EntGroup[T]()
- result.freed = initHashSet[Fruit]()
- var apple = Fruit(id: 20)
- result.freed.incl(apple)
- proc get*[T: Fruit](fg: EntGroup[T]): T =
- if len(fg.freed) == 0: return
- # vvv It errors here
- # type mismatch: ([1] fg.freed: HashSet[grouptest.Fruit])
- for it in fg.freed:
- return it
- ##
- ## VVV The Non-Generic implementation works VVV
- ##
- type
- # Non-generic implementation. This works.
- FruitGroup* = ref object
- freed*: HashSet[Fruit]
- proc initFruitGroup*(): FruitGroup =
- result = FruitGroup()
- result.freed = initHashSet[Fruit]()
- var apple = Fruit(id: 20)
- result.freed.incl(apple)
- proc getNoGeneric*(fg: FruitGroup): Fruit =
- if len(fg.freed) == 0: return
- for it in fg.freed:
- return it
- proc `$`*(self: Fruit): string =
- # For echo
- if self == nil: return "Fruit()"
- return "Fruit(" & $(self.id) & ")"
|