capnp-js
Version:
Capnproto run-time decoding and encoding for Node
58 lines (53 loc) • 1.89 kB
JavaScript
var type = require('../../type');
var statics = require('./statics');
var methods = require('./methods');
module.exports = function(decoder, ct, hash) {
var t = new type.Terminal();
var Primitives = function(arena, depth, isOrphan, layout) {
this._arena = arena;
this._depth = depth;
this._isOrphan = isOrphan;
this._segment = layout.segment;
this._begin = layout.begin;
this._length = layout.length;
this._dataBytes = layout.dataBytes;
this._pointersBytes = layout.pointersBytes;
this._stride = layout.dataBytes + layout.pointersBytes;
arena.limiter.read(layout.segment, layout.begin, layout.dataBytes * layout.length);
};
Primitives._TYPE = t;
Primitives._CT = ct;
Primitives._FIELD = {};
Primitives._HASH = hash;
switch (ct.layout) {
case 2:
Primitives._B64_NULL = "AQAAAAIAAAA=";
break;
case 3:
Primitives._B64_NULL = "AQAAAAMAAAA=";
break;
case 4:
Primitives._B64_NULL = "AQAAAAQAAAA=";
break;
case 5:
Primitives._B64_NULL = "AQAAAAUAAAA=";
break;
default:
throw new Error("Unexpected primitive layout");
}
statics.install(Primitives);
Primitives.prototype = {
_TYPE: t,
_CT: ct,
_rt: methods.rt,
_layout: methods.layout
};
Primitives.prototype.get = function(index) {
if (index < 0 || this._length <= index) {
throw new RangeError();
}
return decoder(this._segment, this._begin + index * this._stride);
};
methods.install(Primitives.prototype);
return Primitives;
};