Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 1.13 KB | None | 0 0
  1. type
  2.   sharedStringObj = object
  3.     len: int
  4.     sptr: pointer
  5.  
  6.   sharedString* = ptr sharedStringObj
  7.  
  8. proc newSharedString*(s: cstring = nil): sharedString =
  9.   result = cast[sharedString](allocShared0(sizeof(sharedStringObj)))
  10.   if s.len != 0:
  11.     result.len = s.len
  12.     result.sptr = allocShared0(s.len)
  13.  
  14.     var
  15.       ssc = cast[cstring](result.sptr)
  16.     for i in 0 .. s.len-1:
  17.       ssc[i] = s[i]
  18.  
  19. proc freeSharedString*(ss: var sharedString) =
  20.   if not ss.isNil:
  21.     if not ss.sptr.isNil and ss.len != 0:
  22.       ss.sptr.deallocShared()
  23.       ss.len = 0
  24.       ss.sptr = nil
  25.     ss.deallocShared()
  26.     ss = nil
  27.  
  28. proc `$`*(ss: sharedString): string =
  29.   result = $(cast[cstring](ss.sptr))
  30.  
  31. proc `&`*(ss: sharedString, c: char|string|cstring|sharedString): string =
  32.   $ss & $c
  33.  
  34. proc test() =
  35.   var
  36.     a = newSharedString()
  37.     b = newSharedString("abc")
  38.     c = newSharedString("def".cstring)
  39.  
  40.   defer:
  41.     a.freeSharedString()
  42.     b.freeSharedString()
  43.     c.freeSharedString()
  44.  
  45.   echo a
  46.   echo b
  47.   echo c
  48.  
  49.   echo b & 'c'
  50.   echo b & "d"
  51.   echo b & "e".cstring
  52.   echo b & c
  53.  
  54. when isMainModule:
  55.   test()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement