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