// Generated by CoffeeScript 1.7.1 (function() { var Struct, VersionedStruct, __hasProp = {}.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; Struct = require('./Struct'); VersionedStruct = (function(_super) { __extends(VersionedStruct, _super); function VersionedStruct(type, versions) { this.type = type; this.versions = versions != null ? versions : {}; if (typeof this.type === 'string') { this.versionGetter = new Function('parent', "return parent." + this.type); this.versionSetter = new Function('parent', 'version', "return parent." + this.type + " = version"); } } VersionedStruct.prototype.decode = function(stream, parent, length) { var fields, res, _ref; if (length == null) { length = 0; } res = this._setup(stream, parent, length); if (typeof this.type === 'string') { res.version = this.versionGetter(parent); } else { res.version = this.type.decode(stream); } if (this.versions.header) { this._parseFields(stream, res, this.versions.header); } fields = this.versions[res.version]; if (fields == null) { throw new Error("Unknown version " + res.version); } if (fields instanceof VersionedStruct) { return fields.decode(stream, parent); } this._parseFields(stream, res, fields); if ((_ref = this.process) != null) { _ref.call(res, stream); } return res; }; VersionedStruct.prototype.size = function(val, parent, includePointers) { var ctx, fields, key, size, type, _ref; if (includePointers == null) { includePointers = true; } if (!val) { throw new Error('Not a fixed size'); } ctx = { parent: parent, val: val, pointerSize: 0 }; size = 0; if (typeof this.type !== 'string') { size += this.type.size(val.version, ctx); } if (this.versions.header) { _ref = this.versions.header; for (key in _ref) { type = _ref[key]; if (type.size != null) { size += type.size(val[key], ctx); } } } fields = this.versions[val.version]; if (fields == null) { throw new Error("Unknown version " + val.version); } for (key in fields) { type = fields[key]; if (type.size != null) { size += type.size(val[key], ctx); } } if (includePointers) { size += ctx.pointerSize; } return size; }; VersionedStruct.prototype.encode = function(stream, val, parent) { var ctx, fields, 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); if (typeof this.type !== 'string') { this.type.encode(stream, val.version); } if (this.versions.header) { _ref1 = this.versions.header; for (key in _ref1) { type = _ref1[key]; if (type.encode != null) { type.encode(stream, val[key], ctx); } } } fields = this.versions[val.version]; for (key in fields) { type = fields[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 VersionedStruct; })(Struct); module.exports = VersionedStruct; }).call(this);