Add Buffer.concat method
authorisaacs <i@izs.me>
Mon, 11 Jun 2012 22:24:38 +0000 (15:24 -0700)
committerisaacs <i@izs.me>
Mon, 11 Jun 2012 22:51:23 +0000 (15:51 -0700)
We write out this loop a lot of places throughout node.
It clearly needs to be an API method.

doc/api/buffer.markdown
lib/buffer.js
test/simple/test-buffer-concat.js [new file with mode: 0644]

index 82a36eedc6fc06db639ad8af7b02d8b9827cd095..ff95304ed6f5cc1532c11889acb1a460b638b1e5 100644 (file)
@@ -148,6 +148,26 @@ Example:
 
     // ½ + ¼ = ¾: 9 characters, 12 bytes
 
+### Class Method: Buffer.concat(list, [totalLength])
+
+* `list` {Array} List of Buffer objects to concat
+* `totalLength` {Number} Total length of the buffers when concatenated
+
+Returns a buffer which is the result of concatenating all the buffers in
+the list together.
+
+If the list has no items, or if the totalLength is 0, then it returns a
+zero-length buffer.
+
+If the list has exactly one item, then the first item of the list is
+returned.
+
+If the list has more than one item, then a new Buffer is created.
+
+If totalLength is not provided, it is read from the buffers in the list.
+However, this adds an additional loop to the function, so it is faster
+to provide the length explicitly.
+
 ### buf.length
 
 * Number
index 7a65fa13c79edc334c1a650478175c2471c440d9..ee81eac8016c46a3711dc3294ad0586542ab3446 100644 (file)
@@ -469,6 +469,38 @@ Buffer.prototype.fill = function fill(value, start, end) {
 };
 
 
+Buffer.concat = function(list, length) {
+  if (!Array.isArray(list)) {
+    throw new Error('Usage: Buffer.concat(list, [length])');
+  }
+
+  if (list.length === 0) {
+    return new Buffer(0);
+  } else if (list.length === 1) {
+    return list[0];
+  }
+
+  if (typeof length !== 'number') {
+    length = 0;
+    for (var i = 0; i < list.length; i++) {
+      var buf = list[i];
+      length += buf.length;
+    }
+  }
+
+  var buffer = new Buffer(length);
+  var pos = 0;
+  for (var i = 0; i < list.length; i++) {
+    var buf = list[i];
+    buf.copy(buffer, pos);
+    pos += buf.length;
+  }
+  return buffer;
+};
+
+
+
+
 // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
 Buffer.prototype.copy = function(target, target_start, start, end) {
   var source = this;
diff --git a/test/simple/test-buffer-concat.js b/test/simple/test-buffer-concat.js
new file mode 100644 (file)
index 0000000..858d692
--- /dev/null
@@ -0,0 +1,41 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+
+var zero = [];
+var one  = [ new Buffer('asdf') ];
+var long = [];
+for (var i = 0; i < 10; i++) long.push(new Buffer('asdf'));
+
+var flatZero = Buffer.concat(zero);
+var flatOne = Buffer.concat(one);
+var flatLong = Buffer.concat(long);
+var flatLongLen = Buffer.concat(long, 40);
+
+assert(flatZero.length === 0);
+assert(flatOne.toString() === 'asdf');
+assert(flatOne === one[0]);
+assert(flatLong.toString() === (new Array(10+1).join('asdf')));
+assert(flatLongLen.toString() === (new Array(10+1).join('asdf')));
+
+console.log("ok");