Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- type
- sharedStringObj = object
- len: int
- sptr: pointer
- sharedString* = ptr sharedStringObj
- var
- aCount = 0
- aDataCount = 0
- checkEnabled = false
- proc checkOnExit() {.noconv.} =
- doAssert aCount == 0, "All sharedString instances not freed"
- doAssert aDataCount == 0, "All sharedString data instances not freed"
- proc freeSharedStringData(ss: var sharedString) =
- if not ss.isNil:
- if not ss.sptr.isNil and ss.len != 0:
- aDataCount -= 1
- ss.sptr.deallocShared()
- ss.len = 0
- ss.sptr = nil
- proc freeSharedString*(ss: var sharedString) =
- if not ss.isNil:
- ss.freeSharedStringData()
- aCount -= 1
- ss.deallocShared()
- ss = nil
- proc setSharedStringData(ss: var sharedString, s: cstring) =
- if not ss.isNil:
- if not ss.sptr.isNil and ss.len != 0:
- ss.freeSharedStringData()
- if s.len != 0:
- ss.len = s.len
- aDataCount += 1
- ss.sptr = allocShared0(s.len)
- var
- ssc = cast[cstring](ss.sptr)
- for i in 0 .. s.len-1:
- ssc[i] = s[i]
- proc newSharedString*(s: cstring = nil): sharedString =
- if not checkEnabled:
- addQuitProc(checkOnExit)
- checkEnabled = true
- aCount += 1
- result = cast[sharedString](allocShared0(sizeof(sharedStringObj)))
- result.setSharedStringData(s)
- proc `$`*(ss: sharedString): string =
- result = $(cast[cstring](ss.sptr))
- proc `&`*(ss: sharedString, c: char|string|cstring|sharedString): string =
- $ss & $c
- proc `&=`*(ss: var sharedString, c: char|string|cstring|sharedString) =
- ss.setSharedStringData($ss & $c)
- proc set*(ss: var sharedString, c: char|string|cstring|sharedString) =
- ss.setSharedStringData($c)
- proc clear*(ss: var sharedString) =
- ss.freeSharedStringData()
- proc `[]`*(ss: var sharedString, i: int): char =
- ($ss)[i]
- proc test() =
- var
- a = newSharedString()
- b = newSharedString("abc")
- c = newSharedString("def".cstring)
- defer:
- a.freeSharedString()
- b.freeSharedString()
- c.freeSharedString()
- echo a
- echo b
- echo c
- echo b & 'c'
- echo b & "d"
- echo b & "e".cstring
- echo b & c
- b &= 'c'
- echo b
- c.set("ghi")
- echo c
- c.clear()
- echo b[0]
- try:
- echo b[5]
- except IndexError:
- echo "IndexError"
- when isMainModule:
- test()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement