Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: lib/typedObjects/references.js

Issue 4827963358969856: Issue 147 - [Typed objects] Implement object types (Closed)
Patch Set: Created April 4, 2014, 10:28 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: lib/typedObjects/references.js
===================================================================
new file mode 100644
--- /dev/null
+++ b/lib/typedObjects/references.js
@@ -0,0 +1,103 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+"use strict";
+
+let {ceilLog2, defineProperties} = require("typedObjects/utils");
+let {uint16, int16, uint32} = require("typedObjects/primitiveTypes");
+let {fixedPropertyDescriptor} = require("typedObjects/utils");
+
+function calculateSize(propList)
+{
+ let result = 0;
+ for (let i = 0, l = propList.length | 0; i < l; i++)
+ result += propList[i][1].referenceLength;
+ return ceilLog2(result);
+}
+
+function getViewTypes(propList)
+{
+ let result = [];
+ for (let i = 0, l = propList.length | 0; i < l; i++)
+ {
+ let requiredViews = propList[i][1].viewTypes;
+ for (let j = 0, ll = requiredViews.length | 0; j < ll; j++)
+ if (result.indexOf(requiredViews[j]) < 0)
+ result.push(requiredViews[j]);
+ }
+ return result;
+}
+
+let TypedReference_properties = [
+ ["targetBufferIndex", int16],
+ ["targetByteOffset", uint32]
+];
+
+let Reference_properties = [
+ ["typeId", int16]
+].concat(TypedReference_properties);
+
+/**
+ * Helper class to read/write properties referencing other objects. bufferIndex
+ * and byteOffset properties of the reference need to be set in order to use it.
+ *
+ * @param types list of registered object types used to resolve typeId
+ * @param views list of views corresponding to Reference.viewTypes
+ */
+function Reference(types, views)
+{
+ let result = Object.create(Reference.prototype, {
+ types: fixedPropertyDescriptor(types)
+ });
+ defineProperties(result, Reference_properties, Reference.viewTypes, views, 0);
+ return result;
+}
+Reference.prototype = {
+ get typeInfo()
+ {
+ let typeId = this.typeId | 0;
+ if (this.typeId >= 0)
+ return this.types[this.typeId];
+ else
+ return null;
+ },
+ bufferIndex: -1,
+ byteOffset: 0
+}
+Reference.byteLength = calculateSize(Reference_properties);
+Reference.viewTypes = Object.freeze(getViewTypes(Reference_properties));
+exports.Reference = Reference;
+
+/**
+ * Helper class to read/write references to a fixed type, this is useful for
+ * references to free buffer elements. bufferIndex and byteOffset properites
+ * of the reference need to be set in order to use it.
+ *
+ * @param typeInfo metadata of the type that this reference should be used for
+ * @param views list of views corresponding to TypedReference.viewTypes
+ */
+function TypedReference(typeInfo, views)
+{
+ let result = Object.create(Reference.prototype, {
+ typeInfo: fixedPropertyDescriptor(typeInfo),
+ });
+ defineProperties(result, TypedReference_properties, TypedReference.viewTypes, views, 0);
+ return result;
+}
+TypedReference.byteLength = calculateSize(TypedReference_properties);
+TypedReference.viewTypes = Object.freeze(getViewTypes(TypedReference_properties));
+exports.TypedReference = TypedReference;

Powered by Google App Engine
This is Rietveld