summary refs log blame commit diff stats
path: root/tests/stdlib/tdecls.nim
blob: 3567639e05e9611503e515daf541b94169b7dee8 (plain) (tree)
1
                




































































                                                           
import std/decls

block:
  var s = @[10,11,12]
  var a {.byaddr.} = s[0]
  a+=100
  doAssert s == @[110,11,12]
  doAssert a is int
  var b {.byaddr.}: int = s[0]
  doAssert a.addr == b.addr

  doAssert not compiles(block:
    # redeclaration not allowed
    var foo = 0
    var foo {.byaddr.} = s[0])

  doAssert not compiles(block:
    # ditto
    var foo {.byaddr.} = s[0]
    var foo {.byaddr.} = s[0])

  block:
    var b {.byaddr.} = s[1] # redeclaration ok in sub scope
    b = 123

  doAssert s == @[110,123,12]

  b = b * 10
  doAssert s == @[1100,123,12]

  doAssert not compiles(block:
    var b2 {.byaddr.}: float = s[2])

  doAssert compiles(block:
    var b2 {.byaddr.}: int = s[2])

## We can define custom pragmas in user code
template byUnsafeAddr(lhs, typ, expr) =
  when typ is type(nil):
    let tmp = unsafeAddr(expr)
  else:
    let tmp: ptr typ = unsafeAddr(expr)
  template lhs: untyped = tmp[]

block:
  let s = @["foo", "bar"]
  let a {.byUnsafeAddr.} = s[0]
  doAssert a == "foo"
  doAssert a[0].unsafeAddr == s[0][0].unsafeAddr

block: # nkAccQuoted
  # shows using a keyword, which requires nkAccQuoted
  template `cast`(lhs, typ, expr) =
    when typ is type(nil):
      let tmp = unsafeAddr(expr)
    else:
      let tmp: ptr typ = unsafeAddr(expr)
    template lhs: untyped = tmp[]

  block:
    let s = @["foo", "bar"]
    let a {.`byUnsafeAddr`.} = s[0]
    doAssert a == "foo"
    doAssert a[0].unsafeAddr == s[0][0].unsafeAddr

  block:
    let s = @["foo", "bar"]
    let a {.`cast`.} = s[0]
    doAssert a == "foo"
    doAssert a[0].unsafeAddr == s[0][0].unsafeAddr
his02939is39an22example111", re"\d+"): accum.add(word) doAssert(accum == @["", "this", "is", "an", "example", ""]) accum = @[] for word in split("00232this02939is39an22example111", re"\d+", maxsplit=2): accum.add(word) doAssert(accum == @["", "this", "is39an22example111"]) accum = @[] for word in split("AAA : : BBB", re"\s*:\s*"): accum.add(word) doAssert(accum == @["AAA", "", "BBB"]) doAssert(split("abc", re"") == @["a", "b", "c"]) doAssert(split("", re"") == @[]) doAssert(split("a;b;c", re";") == @["a", "b", "c"]) doAssert(split(";a;b;c", re";") == @["", "a", "b", "c"]) doAssert(split(";a;b;c;", re";") == @["", "a", "b", "c", ""]) doAssert(split("a;b;c;", re";") == @["a", "b", "c", ""]) doAssert(split("00232this02939is39an22example111", re"\d+", maxsplit=2) == @["", "this", "is39an22example111"]) for x in findAll("abcdef", re"^{.}", 3): doAssert x == "d" accum = @[] for x in findAll("abcdef", re".", 3): accum.add(x) doAssert(accum == @["d", "e", "f"]) doAssert("XYZ".find(re"^\d*") == 0) doAssert("XYZ".match(re"^\d*") == true) block: var matches: array[16, string] if match("abcdefghijklmnop", re"(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)", matches): for i in 0..matches.high: doAssert matches[i] == $chr(i + 'a'.ord) else: doAssert false block: # Buffer based RE var cs: cstring = "_____abc_______" doAssert(cs.find(re"abc", bufSize=15) == 5) doAssert(cs.matchLen(re"_*abc", bufSize=15) == 8) doAssert(cs.matchLen(re"abc", start=5, bufSize=15) == 3) doAssert(cs.matchLen(re"abc", start=5, bufSize=7) == -1) doAssert(cs.matchLen(re"abc_*", start=5, bufSize=10) == 5) var accum: seq[string] = @[] for x in cs.findAll(re"[a-z]", start=3, bufSize=15): accum.add($x) doAssert(accum == @["a","b","c"]) block: # bug #9306 doAssert replace("bar", re"^", "foo") == "foobar" doAssert replace("foo", re"$", "bar") == "foobar" block: # bug #9437 doAssert replace("foo", re"", "-") == "-f-o-o-" doAssert replace("ooo", re"o", "-") == "---" testAll()