// Generated by CoffeeScript 1.7.1 (function() { var Struct, utils; utils = require('./utils'); Struct = (function() { function Struct(fields) { this.fields = fields != null ? fields : {}; } Struct.prototype.decode = function(stream, parent, length) { var res, _ref; if (length == null) { length = 0; } res = this._setup(stream, parent, length); this._parseFields(stream, res, this.fields); if ((_ref = this.process) != null) { _ref.call(res, stream); } return res; }; Struct.prototype._setup = function(stream, parent, length) { var res; res = {}; Object.defineProperties(res, { parent: { value: parent }, _startOffset: { value: stream.pos }, _currentOffset: { value: 0, writable: true }, _length: { value: length } }); return res; }; Struct.prototype._parseFields = function(stream, res, fields) { var key, type, val; for (key in fields) { type = fields[key]; if (typeof type === 'function') { val = type.call(res, res); } else { val = type.decode(stream, res); } if (val !== void 0) { if (val instanceof utils.PropertyDescriptor) { Object.defineProperty(res, key, val); } else { res[key] = val; } } res._currentOffset = stream.pos - res._startOffset; } }; Struct.prototype.size = function(val, parent, includePointers) { var ctx, key, size, type, _ref; if (val == null) { val = {}; } if (includePointers == null) { includePointers = true; } ctx = { parent: parent, val: val, pointerSize: 0 }; size = 0; _ref = this.fields; for (key in _ref) { type = _ref[key]; if (type.size != null) { size += type.size(val[key], ctx); } } if (includePointers) { size += ctx.pointerSize; } return size; }; Struct.prototype.encode = function(stream, val, parent) { var ctx, i, key, ptr, type, _ref, _ref1; if ((_ref = this.preEncode) != null) { _ref.call(val, stream); } ctx = { pointers: [], startOffset: stream.pos, parent: parent, val: val, pointerSize: 0 }; ctx.pointerOffset = stream.pos + this.size(val, ctx, false); _ref1 = this.fields; for (key in _ref1) { type = _ref1[key]; if (type.encode != null) { type.encode(stream, val[key], ctx); } } i = 0; while (i < ctx.pointers.length) { ptr = ctx.pointers[i++]; ptr.type.encode(stream, ptr.val, ptr.parent); } }; return Struct; })(); module.exports = Struct; }).call(this);