<?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);
 
    }
 
 
}
 
 
 
?>
 
 |