<?php
/**
* Memory-efficient integer storage class.
* Behaves like a normal array.
*
* This one uses: a HEX-STRING
* and stores: 16 BIT integer.
*
*
* For example: 32768 entries use
* - 132056 bytes for HexArray
* - but 6817000 bytes for a PHP array()
* - which is almost 50 times as much
*
*
*/
class HexArray IMPLEMENTS ArrayAccess {
var $data = "0000";
const LEN = 4; // 4 characters = 16 bit
/**
* Initialize data.
*
* @param integer/string create either a fixed size empty array,
* or use source data (hexstring)
*/
function __construct($from=NULL) {
if (is_string($from)) {
$this->data = $from;
}
elseif (is_int($from)) {
$this->data = str_repeat("0", self::LEN * $from);
}
}
/**
* Compare array index against data size.
*
*/
function offsetExists ( $offset ) {
return (strlen($this->data) / self::LEN) - 1 >= $offset;
}
/**
* Retrieve value.
*
*/
function offsetGet ( $offset ) {
return hexdec(substr($this->data, $offset * self::LEN, self::LEN));
}
/**
* Update value.
*
*/
function offsetSet ( $offset , $value ) {
$hex = dechex($value);
if ($fill = self::LEN - strlen($hex)) {
$hex = str_repeat("0", $fill) . $hex;
}
for ($i=0; $i<self::LEN; $i++) {
$this->data[$offset * self::LEN + $i] = $hex[$i];
}
}
/**
* Unsetting not supported.
*
*/
function offsetUnset ( $offset ) {
assert(false);
}
}
?>
|