UNPKG

capnp-js

Version:

Capnproto run-time decoding and encoding for Node

118 lines (117 loc) 4.16 kB
var reader = require('../reader/layout/list'); var Reader = require('../reader/Text'); var listField = require('./list/field/index'); var copy = require('./copy/pointer'); 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 Text = function(arena, isOrphan, layout) { this._arena = arena; this._isOrphan = isOrphan; this._segment = layout.segment; this._begin = layout.begin; this._length = layout.length; this._dataBytes = 1; this._pointersBytes = 0; }; Text._READER = Reader; Text._TYPE = t; Text._CT = ct; Text._FIELD = {}; Text._HASH = Reader._HASH; var stringSet = function(arena, pointer, str) { str = new Buffer(str, "utf8"); var target = Text._init(arena, pointer, str.length); str.copy(target._segment, target._begin); }; statics.deref(Text); Text._init = function(arena, pointer, length) { length = length + 1; var blob = arena._preallocate(pointer.segment, length); arena._zero(blob, length); layout.preallocated(pointer, blob, ct, length); return new Text(arena, false, reader.unsafe(arena, pointer)); }; Text._initOrphan = function(arena, length) { length = length + 1; var blob = arena._allocate(length); arena._zero(blob, length); return new Text(arena, true, { segment: blob.segment, begin: blob.position, length: length, dataBytes: 1, pointersBytes: 0 }); }; Text._set = function(arena, pointer, value) { if (typeof value === "string") stringSet(arena, pointer, value); else if (value._TYPE.equiv(t)) copy.setListPointer(value._arena, value._layout(), arena, pointer); else throw new TypeError(); }; listField.adopt(Text); listField.disown(Text); listField.get(Text); listField.has(Text); var init = fields.list.init(Text); Text._FIELD.init = function(offset) { return function(length) { return init(this, offset, length); }; }; Text._FIELD.unionInit = function(discr, offset) { return function(length) { this._setWhich(discr); return init(this, offset, length); }; }; var objectSet = fields.list.set(Text); Text._FIELD.set = function(offset) { return function(value) { if (typeof value === "string") { var pointer = { segment: this._segment, position: this._pointersSection + offset }; stringSet(this._arena, pointer, value); } else if (value._TYPE.equiv(t)) { objectSet(this, offset, value); } else { throw new TypeError(); } }; }; Text._FIELD.unionSet = function(discr, offset) { return function(value) { if (typeof value === "string") { this._setWhich(discr); var pointer = { segment: this._segment, position: this._pointersSection + offset }; stringSet(this._arena, pointer, value); } else if (value._TYPE.equiv(t)) { this._setWhich(discr); objectSet(this, offset, value); } else { throw new TypeError(); } }; }; Text.prototype = { _TYPE: t, _CT: ct, _rt: methods.rt, _layout: methods.layout }; Text.prototype.asBytesNull = function() { return this._segment.slice(this._begin, this._begin + this._length); }; Text.prototype.asBytes = function() { return this._segment.slice(this._begin, this._begin + this._length - 1); }; Text.prototype.toString = function() { return this._segment.toString("utf8", this._begin, this._begin + this._length - 1); }; module.exports = Text;