Current File : //home/tradevaly/www/node_modules/restructure/src/Array.coffee |
{Number:NumberT} = require './Number'
utils = require './utils'
class ArrayT
constructor: (@type, @length, @lengthType = 'count') ->
decode: (stream, parent) ->
pos = stream.pos
res = []
ctx = parent
if @length?
length = utils.resolveLength @length, stream, parent
if @length instanceof NumberT
# define hidden properties
Object.defineProperties res,
parent: { value: parent }
_startOffset: { value: pos }
_currentOffset: { value: 0, writable: true }
_length: { value: length }
ctx = res
if not length? or @lengthType == 'bytes'
target = if length?
stream.pos + length
else if parent?._length
parent._startOffset + parent._length
else
stream.length
while stream.pos < target
res.push @type.decode(stream, ctx)
else
for i in [0...length] by 1
res.push @type.decode(stream, ctx)
return res
size: (array, ctx) ->
unless array
return @type.size(null, ctx) * utils.resolveLength(@length, null, ctx)
size = 0
if @length instanceof NumberT
size += @length.size()
ctx = parent: ctx
for item in array
size += @type.size(item, ctx)
return size
encode: (stream, array, parent) ->
ctx = parent
if @length instanceof NumberT
ctx =
pointers: []
startOffset: stream.pos
parent: parent
ctx.pointerOffset = stream.pos + @size(array, ctx)
@length.encode(stream, array.length)
for item in array
@type.encode(stream, item, ctx)
if @length instanceof NumberT
i = 0
while i < ctx.pointers.length
ptr = ctx.pointers[i++]
ptr.type.encode(stream, ptr.val)
return
module.exports = ArrayT