123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- discard """
- output: '''
- B
- B
- ABCDC
- foo
- first0second32third64
- my value A1my value Bconc2valueCabc4abc
- my value A0my value Bconc1valueCabc3abc
- '''
- """
- import macros
- block tenum1:
- type E = enum a, b, c, x, y, z
- var en: E
- en = a
- # Bug #4066
- macro genEnum(): untyped = newNimNode(nnkEnumTy).add(newEmptyNode(), newIdentNode("geItem1"))
- type GeneratedEnum = genEnum()
- doAssert(type(geItem1) is GeneratedEnum)
- block tenum2:
- type
- TEnumHole = enum
- eA = 0,
- eB = 4,
- eC = 5
- var
- e: TEnumHole = eB
- case e
- of eA: echo "A"
- of eB: echo "B"
- of eC: echo "C"
- block tenum3:
- type
- TEnumHole {.size: sizeof(int).} = enum
- eA = 0,
- eB = 4,
- eC = 5
- var
- e: TEnumHole = eB
- case e
- of eA: echo "A"
- of eB: echo "B"
- of eC: echo "C"
- block tbasic:
- type
- MyEnum = enum
- A,B,C,D
- # trick the optimizer with an seq:
- var x = @[A,B,C,D]
- echo x[0],x[1],x[2],x[3],MyEnum(2)
- block talias:
- # bug #5148
- type
- A = enum foo, bar
- B = A
- echo B.foo
- block thole:
- type Holed = enum
- hFirst = (0,"first")
- hSecond = (32,"second")
- hThird = (64,"third")
-
- var x = @[0,32,64] # This is just to avoid the compiler inlining the value of the enum
- echo Holed(x[0]),ord Holed(x[0]),Holed(x[1]),ord Holed(x[1]),Holed(x[2]),ord Holed(x[2])
- block toffset:
- const
- strValB = "my value B"
- type
- TMyEnum = enum
- valueA = (1, "my value A"),
- valueB = strValB & "conc",
- valueC,
- valueD = (4, "abc")
- proc getValue(i:int): TMyEnum = TMyEnum(i)
- # trick the optimizer with a variable:
- var x = getValue(4)
- echo getValue(1), ord(valueA), getValue(2), ord(valueB), getValue(3), getValue(4), ord(valueD), x
- block tnamedfields:
- const strValB = "my value B"
- type
- TMyEnum = enum
- valueA = (0, "my value A"),
- valueB = strValB & "conc",
- valueC,
- valueD = (3, "abc"),
- valueE = 4
- # trick the optimizer with a variable:
- var x = valueD
- echo valueA, ord(valueA), valueB, ord(valueB), valueC, valueD, ord(valueD), x
- doAssert $x == $valueD, $x
- doAssert $x == "abc", $x
- block tfakeOptions:
- type
- TFakeOption = enum
- fakeNone, fakeForceFullMake, fakeBoehmGC, fakeRefcGC, fakeRangeCheck,
- fakeBoundsCheck, fakeOverflowCheck, fakeNilCheck, fakeAssert, fakeLineDir,
- fakeWarns, fakeHints, fakeListCmd, fakeCompileOnly,
- fakeSafeCode, # only allow safe code
- fakeStyleCheck, fakeOptimizeSpeed, fakeOptimizeSize, fakeGenDynLib,
- fakeGenGuiApp, fakeStackTrace
- TFakeOptionset = set[TFakeOption]
- var
- gFakeOptions: TFakeOptionset = {fakeRefcGC, fakeRangeCheck, fakeBoundsCheck,
- fakeOverflowCheck, fakeAssert, fakeWarns, fakeHints, fakeLineDir, fakeStackTrace}
- compilerArgs: int
- gExitcode: int8
- block nonzero: # bug #6959
- type SomeEnum = enum
- A = 10
- B
- C
- let slice = SomeEnum.low..SomeEnum.high
- block size_one_byte: # bug #15752
- type
- Flag = enum
- Disabled = 0x00
- Enabled = 0xFF
- static:
- assert 1 == sizeof(Flag)
- block: # bug #12589
- when not defined(i386):
- type
- OGRwkbGeometryType {.size: sizeof(cuint).} = enum
- wkbPoint25D = 0x80000001.cuint, wkbLineString25D = 0x80000002,
- wkbPolygon25D = 0x80000003
- proc typ(): OGRwkbGeometryType =
- return wkbPoint25D
- when not defined(gcRefc):
- doAssert $typ() == "wkbPoint25D"
- block: # bug #21280
- type
- Test = enum
- B = 19
- A = int64.high()
- doAssert ord(A) == int64.high()
- import std/enumutils
- from std/sequtils import toSeq
- import std/macros
- block: # unordered enum
- block:
- type
- unordered_enum = enum
- a = 1
- b = 0
- doAssert (ord(a), ord(b)) == (1, 0)
- doAssert unordered_enum.toSeq == @[a, b]
- block:
- type
- unordered_enum = enum
- a = 1
- b = 0
- c
- doAssert (ord(a), ord(b), ord(c)) == (1, 0, 2)
- block:
- type
- unordered_enum = enum
- a = 100
- b
- c = 50
- d
- doAssert (ord(a), ord(b), ord(c), ord(d)) == (100, 101, 50, 51)
- block:
- type
- unordered_enum = enum
- a = 7
- b = 6
- c = 5
- d
- doAssert (ord(a), ord(b), ord(c), ord(d)) == (7, 6, 5, 8)
- doAssert unordered_enum.toSeq == @[a, b, c, d]
- block:
- type
- unordered_enum = enum
- a = 100
- b
- c = 500
- d
- e
- f = 50
- g
- h
- doAssert (ord(a), ord(b), ord(c), ord(d), ord(e), ord(f), ord(g), ord(h)) ==
- (100, 101, 500, 501, 502, 50, 51, 52)
- block:
- type
- unordered_enum = enum
- A
- B
- C = -1
- D
- E
- G = -999
- doAssert (ord(A), ord(B), ord(C), ord(D), ord(E), ord(G)) ==
- (0, 1, -1, 2, 3, -999)
- block:
- type
- SomeEnum = enum
- seA = 3
- seB = 2
- seC = "foo"
- doAssert (ord(seA), ord(seB), ord(seC)) == (3, 2, 4)
|