ktdm

UniDataArray.lua -- advanced binary array in lua

Sep 18th, 2017
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.59 KB | None | 0 0
  1. local numtr = require("num_transform")
  2. local supportedBases = {
  3.     [2]  = true, [4]   = true, [8]   = true, [16]  = true, [32]   = true,
  4.     [64] = true, [128] = true, [256] = true, [512] = true, [1024] = true
  5. }
  6. return require("class")({
  7.     __init__ = function(_, len, base, block_len)
  8.         local bk = math.log(base) / math.log(2) + 1
  9.         assert(supportedBases[base], "Usupported base: supported bases are"
  10.                ..": 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024")
  11.         _.data = {}
  12.         -- 64 bit per num
  13.         _.block_len = math.floor(64 / bk)
  14.  
  15.         _.block_len = math.min(block_len or 100000, _.block_len)
  16.        
  17.         _.base = base
  18.         _.length = math.ceil(len / _.block_len)
  19.         _.cache = {}; for i = 1, _.block_len do _.cache[i] = 0 end
  20.         _.fill(0)
  21.     end
  22.    ,internal = {
  23.         updateBlock = function(_, pos, vals)
  24.             assert(not(pos > _.length or pos < 1),
  25.                 tostring(pos).." - bad argument #1 (value out of range)")
  26.             _.data[pos] = numtr.digitsToNum(vals, _.base)
  27.         end
  28.        ,getBlock = function(_, pos)
  29.             assert(not(pos > _.length or pos < 1),
  30.                 tostring(pos).." - bad argument #1 (value out of range)")
  31.             return numtr.toBase(_.data[pos], _.base, _.block_len)
  32.         end
  33.     }
  34.    ,write = function(_, pos, vals)
  35.         local bl, vl = _.block_len, #vals
  36.         local bpos, offset = math.floor(pos / bl), pos % bl
  37.         local ch = _.cache;--[[clear the cache]]for i = 1, bl do ch[i] = 0 end
  38.         local ii = bl - offset
  39.        
  40.         for i = 1, bl - offset do ch[offset + i] = vals[i] end
  41.         _.internal.updateBlock(bpos + 1, ch)
  42.         bpos = bpos + 1
  43.        
  44.         while ii < vl do
  45.             for i = 1, bl do ch[i] = vals[ii + i] or 0 end
  46.             _.internal.updateBlock(bpos + 1, ch)
  47.             ii, bpos = ii + bl, bpos + 1
  48.         end
  49.         return pos + vl
  50.     end
  51.    ,read = function(_, pos, vl)
  52.         local bl = _.block_len
  53.         local bpos, offset = math.floor(pos / bl), pos % bl
  54.         local arr, cb = {}, {}
  55.         local ii = bl - offset
  56.        
  57.         for i = 1, bl - offset do
  58.             cb = _.internal.getBlock(bpos + 1)
  59.             arr[i] = cb[offset + i]
  60.         end
  61.         bpos = bpos + 1
  62.        
  63.         while ii < vl do
  64.             cb = _.internal.getBlock(bpos + 1)
  65.             for i = 1, math.min(bl, vl - ii) do arr[ii + i] = cb[i] or 0 end
  66.             ii, bpos = ii + bl, bpos + 1
  67.         end
  68.         return arr, pos + vl
  69.     end
  70.    ,fill = function(_, d) for i = 1, _.length do _.data[i] = d end end
  71. })
Add Comment
Please, Sign In to add comment