<?php
 
 
/**
 
 * Memory-efficient integer storage class.
 
 * Behaves like a normal array.
 
 *
 
 * This one uses: BINARY DATA
 
 * and stores: 16 BIT integer.
 
 *
 
 *
 
 * For example: 32768 entries use
 
 *  - 66520 bytes for HexArray
 
 *  - but 6817000 bytes for a PHP array()
 
 * So it takes less than 1% of the memory size of a normal array.
 
 *
 
 *
 
 */
 
class WordArray IMPLEMENTS ArrayAccess {
 
 
    var $data = "\0\0";
 
    var $len = 2;    // 2 bytes = 16 bit
 
    var $pack = "S";
 
 
    /**
 
     *   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", $this->len * $from);
 
        }
 
    }
 
 
    /**
 
     * Compare array index against data size.
 
     *
 
     */
 
    function offsetExists ( $offset ) {
 
        return (strlen($this->data) / $this->len) - 1 >= $offset;
 
    }
 
 
    /**
 
     * Retrieve value.
 
     *
 
     */
 
    function offsetGet ( $offset ) {
 
        return current(unpack($this->pack, substr($this->data, $offset * $this->len, $this->len)));
 
    }
 
 
    /**
 
     * Update value.
 
     *
 
     */
 
    function offsetSet ( $offset , $value ) {
 
 
        $bin = pack($this->pack, $value);# . "\0\0\0\0\0\0\0";
 
 
        for ($i=0; $i<$this->len; $i++) {
 
            $this->data[$offset * $this->len + $i] = $bin[$i];
 
        }
 
    }
 
 
    /**
 
     * Unsetting not supported.
 
     *
 
     */
 
    function offsetUnset ( $offset ) {
 
        assert(false);
 
    }
 
 
}
 
 
 
 
/**
 
 * stores: 32 BIT integer
 
 *
 
 *
 
 */
 
class DWordArray extends WordArray {
 
    var $len = 4;    // 4 bytes = 32 bit
 
    var $pack = "L";
 
}
 
 
 
/**
 
 * stores: 64 BIT integer
 
 *
 
 *
 
 */
 
class QWordArray extends WordArray {
 
    var $len = 8;    // 8 bytes = 64 bit
 
    var $pack = "L";   // Q not supported, workaround:
 
    function offsetGet ( $offset ) {
 
        return parent::offsetGet( $offset ) + parent::offsetGet( $offset + 0.5 ) << 32;
 
    }
 
    function offsetSet ( $offset, $value ) {
 
        parent::offsetSet( $offset, $value & 0xFFFFFFFF );
 
        parent::offsetSet( $offset + 0.5, $value >> 32 );
 
    }
 
    
 
}
 
 
 
?>
 
 |