// Generated by CoffeeScript 1.7.1 (function() { var ArrayT, NumberT, utils; NumberT = require('./Number').Number; utils = require('./utils'); ArrayT = (function() { function ArrayT(type, length, lengthType) { this.type = type; this.length = length; this.lengthType = lengthType != null ? lengthType : 'count'; } ArrayT.prototype.decode = function(stream, parent) { var ctx, i, length, pos, res, target, _i; pos = stream.pos; res = []; ctx = parent; if (this.length != null) { length = utils.resolveLength(this.length, stream, parent); } if (this.length instanceof NumberT) { Object.defineProperties(res, { parent: { value: parent }, _startOffset: { value: pos }, _currentOffset: { value: 0, writable: true }, _length: { value: length } }); ctx = res; } if ((length == null) || this.lengthType === 'bytes') { target = length != null ? stream.pos + length : (parent != null ? parent._length : void 0) ? parent._startOffset + parent._length : stream.length; while (stream.pos < target) { res.push(this.type.decode(stream, ctx)); } } else { for (i = _i = 0; _i < length; i = _i += 1) { res.push(this.type.decode(stream, ctx)); } } return res; }; ArrayT.prototype.size = function(array, ctx) { var item, size, _i, _len; if (!array) { return this.type.size(null, ctx) * utils.resolveLength(this.length, null, ctx); } size = 0; if (this.length instanceof NumberT) { size += this.length.size(); ctx = { parent: ctx }; } for (_i = 0, _len = array.length; _i < _len; _i++) { item = array[_i]; size += this.type.size(item, ctx); } return size; }; ArrayT.prototype.encode = function(stream, array, parent) { var ctx, i, item, ptr, _i, _len; ctx = parent; if (this.length instanceof NumberT) { ctx = { pointers: [], startOffset: stream.pos, parent: parent }; ctx.pointerOffset = stream.pos + this.size(array, ctx); this.length.encode(stream, array.length); } for (_i = 0, _len = array.length; _i < _len; _i++) { item = array[_i]; this.type.encode(stream, item, ctx); } if (this.length instanceof NumberT) { i = 0; while (i < ctx.pointers.length) { ptr = ctx.pointers[i++]; ptr.type.encode(stream, ptr.val); } } }; return ArrayT; })(); module.exports = ArrayT; }).call(this);