--- /dev/null
+"use strict";\r
+module.exports = pool;\r
+\r
+/**\r
+ * An allocator as used by {@link util.pool}.\r
+ * @typedef PoolAllocator\r
+ * @type {function}\r
+ * @param {number} size Buffer size\r
+ * @returns {Uint8Array} Buffer\r
+ */\r
+\r
+/**\r
+ * A slicer as used by {@link util.pool}.\r
+ * @typedef PoolSlicer\r
+ * @type {function}\r
+ * @param {number} start Start offset\r
+ * @param {number} end End offset\r
+ * @returns {Uint8Array} Buffer slice\r
+ * @this {Uint8Array}\r
+ */\r
+\r
+/**\r
+ * A general purpose buffer pool.\r
+ * @memberof util\r
+ * @function\r
+ * @param {PoolAllocator} alloc Allocator\r
+ * @param {PoolSlicer} slice Slicer\r
+ * @param {number} [size=8192] Slab size\r
+ * @returns {PoolAllocator} Pooled allocator\r
+ */\r
+function pool(alloc, slice, size) {\r
+ var SIZE = size || 8192;\r
+ var MAX = SIZE >>> 1;\r
+ var slab = null;\r
+ var offset = SIZE;\r
+ return function pool_alloc(size) {\r
+ if (size < 1 || size > MAX)\r
+ return alloc(size);\r
+ if (offset + size > SIZE) {\r
+ slab = alloc(SIZE);\r
+ offset = 0;\r
+ }\r
+ var buf = slice.call(slab, offset, offset += size);\r
+ if (offset & 7) // align to 32 bit\r
+ offset = (offset | 7) + 1;\r
+ return buf;\r
+ };\r
+}\r