capnp-js
Version:
Capnproto run-time decoding and encoding for Node
118 lines (117 loc) • 4.16 kB
JavaScript
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;