UNPKG

capnp-js

Version:

Capnproto run-time decoding and encoding for Node

73 lines (72 loc) 2.65 kB
var Reader = require('../reader/Data'); var listField = require('./list/field/index'); var statics = require('./list/statics'); var methods = require('./list/methods'); var layout = require('./layout/list'); var fields = require('./fields'); var t = Reader._TYPE; var ct = Reader._CT; var Data = function(arena, isOrphan, listLayout) { this._arena = arena; this._isOrphan = isOrphan; this._segment = listLayout.segment; this._begin = listLayout.begin; this._length = listLayout.length; this._dataBytes = 1; this._pointersBytes = 0; }; Data._READER = Reader; Data._TYPE = t; Data._CT = ct; Data._FIELD = {}; Data._HASH = Reader._HASH; statics.deref(Data); statics.init(Data); statics.initOrphan(Data); var rawSet = function(arena, pointer, raw) { var target = Data._init(arena, pointer, raw.length); raw.copy(target._segment, target._begin); }; Data._set = function(arena, pointer, value) { if (value instanceof Buffer) rawSet(arena, pointer, value); else if (value._TYPE.equiv(t)) copy.setListPointer(value._arena, value._layout(), arena, pointer); else throw new TypeError(); }; listField.adopt(Data); listField.disown(Data); listField.get(Data); listField.has(Data); listField.init(Data); var objectSet = fields.list.set(Data); Data._FIELD.set = function(offset) { return function(value) { var pointer = { segment: this._segment, position: this._pointersSection + offset }; if (value instanceof Buffer) rawSet(this._arena, pointer, value); else if (value._TYPE.equiv(t)) objectSet(this, offset, value); else throw new TypeError(); }; }; Data._FIELD.unionSet = function(discr, offset) { return function(value) { var setter; if (value instanceof Buffer) setter = rawSet; else if (value._TYPE.equiv(t)) setter = objectSet; else throw new TypeError(); this._setWhich(discr); setter(this, offset, value); }; }; Data.prototype = { _CT: ct, _TYPE: t, _rt: methods.rt, _layout: methods.layout }; Data.prototype.get = function(index) { if (index < 0 || this._length <= index) { throw new RangeError(); } return this._segment[this._begin + index]; }; Data.prototype.raw = function() { return this._segment.slice(this._begin, this._begin + this._length); }; methods.install(Data.prototype); module.exports = Data;