NAME
Tie::Array::PackedC - Tie a Perl array to a C-style array (packed; elements of a single, simple data type)
SYNOPSIS
use Tie::Array::PackedC qw(packed_array packed_array_string);
my $ref=packed_array(1,2,3,4);
my $ref2=packed_array_string(my $s,1,2,3,4);
use Tie::Array::PackedC Double=>'d';
tie my @array,'Tie::Array::PackedC::Double',1..10;
$array[0]=1.141;
DESCRIPTION
Provides a perl array interface into a string containing a C style array. In other words the string is equivelent to the string that would be returned from the equivelent pack command (defaulting to pack type "l!") using a normal array of the same values. Eg:
my @foo=(1..10);
my $string=pack "l!*",@foo;
leaves $string in basically the same condition as
my (@foo,$string);
tie @foo,'Tie::Array::PackedC',$string,1..10;
Its only basically the same and not exactly the same because the tie version may be longer due to preallocation.
USAGE
The basic usage is
tie @array,'Tie::Array::PackedC',$string,@initialize;
This will tie @array to $string. So modifying the array will actually cause the string to change. If $string is undef then it will automatically be set to "", otherwise the initial contents of the string will be untouched. (It will however be extended according to the preallocation below.) Any values @initialize are treated as though an immediate
@array[0..$#initilize]=@initialize;
occured. This means that
my ($s,@a)=pack "l!*",1..5;
tie @a,'Tie::Array::PackedC',$s,reverse 1..4;
wil result in "@a" being "4 3 2 1 5".
If no $string is provided then an anonymous string is used to bind to. This string can be obtained by saying
print tied(@a)->string;
Note that the underlying object is a blessed reference to the string passed in. The difference between saying
${tied(@a)}
and the string method is that the former will return the string by copy and it will be exactly the size of the array, the latter could be signifigantly longer due to preallocation.
There is also a utility method to dump the string/array in hex that is invoked accordingly
tied(@a)->hex_dump;
this dumps the full underlying string in hex bytes grouped according to the size of the packed element, and is in the byte order as packed.
A NOTE ABOUT undef
A normal array returns undef when you access an element that has not been explicitly stored to. Arrays tied using this class do not behave in the same way. If an index is within the size of the array but has not been assigned to will return Tie::Array::PackedC::NULL a constant defined as the result of
pack PACK,"";
Any index that is outside of the array will return undef as expected.
PREALLOCATION
In order to avoid having to extend the string too often a preallocation strategy is used. This means that the underlying string is prefilled with a predetermined number of items worth of NULL each time a STORE accesses an element not currently mappable to the string. This allocation happens in terms of blocks which are of a size equal to a predetermined multiple of the size of each element. The number elements added each time the array is extended will be a multiple of the block size and will not be less than %20 of the current size.
NOTE I currently consider the preallocation mechanism to be less than it should be and will most likely figure out a better way to do it later. Please do not assume that the preallocation mechanism will stay the same.
CLASS FACTORY
The class uses a form of templating to provide a way to produce classes that are just as fast as the current version, but use different pack formats, or allocation block size. This is done at compile time by a special import mechanism. This mechanism works like this:
use Tie::Array::PackedC %Name% => %PackType%;
Where %Name% must match /[A-Z]/ and %PackType% is one of the pack formats. (The behaviour of the class is only well defined for types that are of fixed size that are byte aligned.)
If the module is used as follows
use Tie::Array::PackedC Double => 'd';
then a new class called Tie::Array::PackedC::Double
is created that produces a tied array of packed doubles. Thus the default implementation and usage
use Tie::Array::PackedC;
is almost exactly equivelent to
use Tie::Array::PackedC NativeLong => 'l!';
with the exceptions being its name and its import behaviour, the later of which is different in that it does not support the class factory import.
METHODs
- string()
-
Returns the string represnting the array. This is not necessarily the same as the string passed into the array, which may be longer.
- hex_dump()
-
Prints to STDOUT a hex dump of the underlying string.
- trim()
-
Frees up any preallocated but unused memory. This is useful if you know you will not be performing any more store operations on the string.
PACKAGE CONSTANTS
The base package and each of the children it produces in factory mode have the following constants defined, (adjust name accordingly)
- Tie::Array::PackedC::PACK
-
Returns the pack format used by the class. This will always have a * at the end, regardless as to what was provided by the user.
- Tie::Array::PackedC::SIZE
-
The number of bytes that a single element of PACK takes up.
- Tie::Array::PackedC::ALLOC
-
Used by the preallocation system to determine chunk size of preallocation. Currently the underlying string will always satisfy
length($string) % Tie::Array::PackedC::ALLOC == 0
These are not exportable, but they can be accessed by fully qualified name.
EXPORT
Normally Tie::Array::PackedC and its produced classes do not export. However two utility subroutines are provided which can be exported on request using the conventional syntax.
Note that the class factory approach can not be mixed with the export approach in the same use statement. However this means that you can do this:
use Tie::Array::PackedC Double => 'd';
use Tie::Array::PackedC::Double qw(packed_array);
and have the generated class export its utility subs.
- packed_array(LIST)
-
Returns a reference to an array tied to an anonymous string. The LIST is used to initialize the array.
- packed_array_string(STR, LIST)
-
Returns a reference to an array tied to a string provided. The LIST is used to initialize the array.
AUTHOR
demerphq, (yves at cpan dot org).
SEE ALSO
perl, perltie, and Tie::Array
LICENCE
Released under the same terms as perl itself.