Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 2.29 KB | None | 0 0
  1. type
  2.   sharedStringObj = object
  3.     len: int
  4.     sptr: pointer
  5.  
  6.   sharedString* = ptr sharedStringObj
  7.  
  8. var
  9.   aCount = 0
  10.   aDataCount = 0
  11.   checkEnabled = false
  12.  
  13. proc checkOnExit() {.noconv.} =
  14.   doAssert aCount == 0, "All sharedString instances not freed"
  15.   doAssert aDataCount == 0, "All sharedString data instances not freed"
  16.  
  17. proc freeSharedStringData(ss: var sharedString) =
  18.   if not ss.isNil:
  19.     if not ss.sptr.isNil and ss.len != 0:
  20.       aDataCount -= 1
  21.       ss.sptr.deallocShared()
  22.       ss.len = 0
  23.       ss.sptr = nil
  24.  
  25. proc freeSharedString*(ss: var sharedString) =
  26.   if not ss.isNil:
  27.     ss.freeSharedStringData()
  28.     aCount -= 1
  29.     ss.deallocShared()
  30.     ss = nil
  31.  
  32. proc setSharedStringData(ss: var sharedString, s: cstring) =
  33.   if not ss.isNil:
  34.     if not ss.sptr.isNil and ss.len != 0:
  35.       ss.freeSharedStringData()
  36.  
  37.     if s.len != 0:
  38.       ss.len = s.len
  39.       aDataCount += 1
  40.       ss.sptr = allocShared0(s.len)
  41.  
  42.       var
  43.         ssc = cast[cstring](ss.sptr)
  44.       for i in 0 .. s.len-1:
  45.         ssc[i] = s[i]
  46.  
  47. proc newSharedString*(s: cstring = nil): sharedString =
  48.   if not checkEnabled:
  49.     addQuitProc(checkOnExit)
  50.     checkEnabled = true
  51.   aCount += 1
  52.   result = cast[sharedString](allocShared0(sizeof(sharedStringObj)))
  53.   result.setSharedStringData(s)
  54.  
  55. proc `$`*(ss: sharedString): string =
  56.   result = $(cast[cstring](ss.sptr))
  57.  
  58. proc `&`*(ss: sharedString, c: char|string|cstring|sharedString): string =
  59.   $ss & $c
  60.  
  61. proc `&=`*(ss: var sharedString, c: char|string|cstring|sharedString) =
  62.   ss.setSharedStringData($ss & $c)
  63.  
  64. proc set*(ss: var sharedString, c: char|string|cstring|sharedString) =
  65.   ss.setSharedStringData($c)
  66.  
  67. proc clear*(ss: var sharedString) =
  68.   ss.freeSharedStringData()
  69.  
  70. proc `[]`*(ss: var sharedString, i: int): char =
  71.   ($ss)[i]
  72.  
  73. proc test() =
  74.   var
  75.     a = newSharedString()
  76.     b = newSharedString("abc")
  77.     c = newSharedString("def".cstring)
  78.  
  79.   defer:
  80.     a.freeSharedString()
  81.     b.freeSharedString()
  82.     c.freeSharedString()
  83.  
  84.   echo a
  85.   echo b
  86.   echo c
  87.  
  88.   echo b & 'c'
  89.   echo b & "d"
  90.   echo b & "e".cstring
  91.   echo b & c
  92.  
  93.   b &= 'c'
  94.   echo b
  95.  
  96.   c.set("ghi")
  97.   echo c
  98.  
  99.   c.clear()
  100.  
  101.   echo b[0]
  102.   try:
  103.     echo b[5]
  104.   except IndexError:
  105.     echo "IndexError"
  106.  
  107. when isMainModule:
  108.   test()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement