Pot.ArrayBufferoid

{Pot.ArrayBufferoid} new Pot.ArrayBufferoid ([{Array|TypedArray|Pot.ArrayBufferoid|Number|*} ...args])

Pot.js で利用可能。 PotLite.js では利用できません。

Pot.ArrayBufferoid の新しいインスタンスを生成します。

引数に数値 (Number) を渡すと、その数の分の要素を持つインスタンスが返ります。
引数に配列 (Array) または TypedArray を渡すと、その要素を持つ Pot.ArrayBufferoid のインスタンスが返ります。
引数に Pot.ArrayBufferoid インスタンスを渡すと、そのコピーが返ります。
引数を省略すると、空の要素をもつインスタンスが返ります。

Pot.globalize() が適応されている場合、new Pot.ArrayBufferoid() が new ArrayBufferoid() で実行できます。

Pot.ArrayBufferoid の新しいインスタンスが返ります。

// Number
Pot.debug(new Pot.ArrayBufferoid(5));
// [undefined, undefined, undefined, undefined, undefined]

// Array
Pot.debug(new Pot.ArrayBufferoid([1, 2, 3, 4, 5]));
// [1, 2, 3, 4, 5]

// ArrayBufferoid
var buffer = new Pot.ArrayBufferoid([1, 2, 3]);
var buffer2 = new Pot.ArrayBufferoid(buffer);
Pot.debug(buffer);  // [1, 2, 3]
buffer[0] = 10;
Pot.debug(buffer);  // [10, 2, 3]
Pot.debug(buffer2); // [1, 2, 3]

// Typed Array
var uint8array = new Uint8Array([97, 98, 99]);
var buffer = new Pot.ArrayBufferoid(uint8array);
Pot.debug(buffer); // [97, 98, 99]

Pot.ArrayBufferoid は、TypedArray や DataView をクロスブラウザに扱う際に役立ちます。
Array.prototype 同様の機能を持っているため、
Array または TypedArray のように扱うことが可能です。
また、Pot.ArrayBufferoid は TypedArray へ変換する架け橋として利用でき、
ストリームで使用する際にも役立ちます。

var buffer = new Pot.ArrayBufferoid();
var i = 0;

// index指定によって値を埋める
buffer[i++] = 255;
buffer[i++] = 254;

// push (Array.prototype.push) を使って値を埋める
buffer.push(253);
buffer.push(252);

// DataView がない環境でも同じ機能が使えるようになります
Pot.debug(buffer.getUint16(0, true)); // 65279

// length は size() を使います
Pot.debug('buffer.length = ' + buffer.size()); // 4

// Typed Array に変換 (ない環境は Array になる)
var arrayBuffer = buffer.toArrayBuffer();
var uint8Array = buffer.toUint8Array();

// ストリームな使い方
buffer.seek(0);
var data1 = buffer.read(1);
Pot.debug(data1[0]); // 255
Pot.debug(buffer.tell()); // 1
var data2 = buffer.read(2);
Pot.debug(data2); // [254, 253]
buffer.seek(0);
buffer.write([100, 101]);
Pot.debug(buffer); // [100, 101, 253, 252]

Pot.ArrayBufferoid は、変換やコピーを扱う関数を持っています。

// Uint8Arrayに変換
var uint8array = Pot.ArrayBufferoid.toUint8Array([0x61, 0x62, 0x63]);

// TypedArrayをコピー
var copy = Pot.ArrayBufferoid.copyBuffer(uint8array);

// 文字列に変換
var binary = Pot.ArrayBufferoid.bufferToBinary(copy);
Pot.debug(binary); // 'abc'

// 巨大な配列を
var view = new Pot.ArrrayBufferoid(1000000).toUint8Array();
for (var i = 0; i < 1000000; i++) {
  view[i] = 0x61;
}
// 非同期で負荷をかけずに変換
Pot.ArrayBufferoid.bufferToBinary.deferred(view).then(function(res) {
  Pot.debug(res); // 'aaaaaaaaaaa...'
});

// UTF-16 文字列から UTF-8 Buffer に変換と逆変換
var s = 'hogeほげ';
var buffer = Pot.ArrayBufferoid.stringToBuffer(s);
var string = Pot.ArrayBufferoid.bufferToString(buffer);
Pot.debug(buffer);
// buffer:
//   [104, 111, 103, 101, 227, 129, 187, 227, 129, 146]
Pot.debug(s === string); // true