NAME
   Scalar::Vec::Util - Utility routines for vec strings.

VERSION
   Version 0.08

SYNOPSIS
       use Scalar::Vec::Util qw<vfill vcopy veq>;

       my $s;
       vfill $s, 0, 100, 1; # Fill with 100 bits 1 starting at 0.
       my $t;
       vcopy $s, 20, $t, 10, 30; # Copy 30 bits from $s, starting at 20,
                                 #                to $t, starting at 10.
       vcopy $t, 10, $t, 20, 30; # Overlapping areas DWIM.
       if (veq $t, 10, $t, 20, 30) { ... } # Yes, they are equal now.

DESCRIPTION
   This module provides a set of utility routines that efficiently
   manipulate bits in vec strings. Highly optimized XS functions are used
   whenever possible, but straightforward pure Perl replacements are also
   available for platforms without a C compiler.

   Note that this module does not aim at reimplementing bit vectors : all
   its functions can be used on any Perl string, just like "vec" in
   perlfunc.

CONSTANTS
 "SVU_PP"
   True when pure Perl fallbacks are used instead of XS functions.

 "SVU_SIZE"
   The size (in bits) of the unit used for bit operations. The higher this
   value is, the faster the XS functions are. It is usually "CHAR_BIT *
   $Config{alignbytes}", except on non-little-endian architectures where it
   currently falls back to "CHAR_BIT" (e.g. SPARC).

FUNCTIONS
 "vfill"
       vfill $vec, $start, $length, $bit;

   Starting at $start in $vec, fills $length bits with ones if $bit is true
   and with zeros if $bit is false.

   $vec is upgraded to a string and extended if necessary. Bits that are
   outside of the specified area are left untouched.

 "vcopy"
       vcopy $from => $from_start, $to => $to_start, $length;

   Copies $length bits starting at $from_start in $from to $to_start in
   $to.

   $from and $to are allowed to be the same scalar, and the given areas can
   rightfully overlap.

   $from is upgraded to a string if it isn't one already. If "$from_start +
   $length" goes out of the bounds of $from, then the extra bits are
   treated as zeros. $to is upgraded to a string and extended if necessary.
   The content of $from is not modified, except when it is equal to $to.
   Bits that are outside of the specified area are left untouched.

   This function does not need to allocate any extra memory.

 "vshift"
       vshift $v, $start, $length => $bits, $insert;

   In the area starting at $start and of length $length in $v, shift bits
   "abs $bits" positions left if "$bits > 0" and right otherwise.

   When $insert is defined, the resulting gap is also filled with ones if
   $insert is true and with zeros if $insert is false.

   $v is upgraded to a string if it isn't one already. If "$start +
   $length" goes out of the bounds of $v, then the extra bits are treated
   as zeros. Bits that are outside of the specified area are left
   untouched.

   This function does not need to allocate any extra memory.

 "vrot"
       vrot $v, $start, $length, $bits;

   In the area starting at $start and of length $length in $v, rotates bits
   "abs $bits" positions left if "$bits > 0" and right otherwise.

   $v is upgraded to a string if it isn't one already. If "$start +
   $length" goes out of the bounds of $v, then the extra bits are treated
   as zeros. Bits that are outside of the specified area are left
   untouched.

   This function currently allocates an extra buffer of size "O($bits)".

 "veq"
       veq $v1 => $v1_start, $v2 => $v2_start, $length;

   Returns true if the $length bits starting at $v1_start in $v1 and
   $v2_start in $v2 are equal, and false otherwise.

   $v1 and $v2 are upgraded to strings if they aren't already, but their
   contents are never modified. If "$v1_start + $length" (respectively
   "$v2_start + $length") goes out of the bounds of $v1 (respectively $v2),
   then the extra bits are treated as zeros.

   This function does not need to allocate any extra memory.

EXPORT
   The functions "vfill", "vcopy", "vshift", "vrot" and "veq" are only
   exported on request. All of them are exported by the tags ':funcs' and
   ':all'.

   The constants "SVU_PP" and "SVU_SIZE" are also only exported on request.
   They are all exported by the tags ':consts' and ':all'.

BENCHMARKS
   The following timings were obtained by running the "samples/bench.pl"
   script. The "_pp" entries are the pure Perl versions, whereas "_bv" are
   Bit::Vector versions.

   *   This is for perl 5.8.8 on a Core 2 Duo 2.66GHz machine (unit is 64
       bits).

           Filling bits at a given position :
                         Rate vfill_pp vfill_bv    vfill
           vfill_pp    80.3/s       --    -100%    -100%
           vfill_bv 1053399/s 1312401%       --     -11%
           vfill    1180792/s 1471129%      12%       --

           Copying bits from a bit vector to a different one :
                        Rate vcopy_pp vcopy_bv    vcopy
           vcopy_pp    112/s       --    -100%    -100%
           vcopy_bv  62599/s   55622%       --     -89%
           vcopy    558491/s  497036%     792%       --

           Moving bits in the same bit vector from a given position
           to a different one :
                        Rate vmove_pp vmove_bv    vmove
           vmove_pp   64.8/s       --    -100%    -100%
           vmove_bv  64742/s   99751%       --     -88%
           vmove    547980/s  845043%     746%       --

           Testing bit equality from different positions of different
           bit vectors :
                      Rate  veq_pp  veq_bv     veq
           veq_pp   92.7/s      --   -100%   -100%
           veq_bv  32777/s  35241%      --    -94%
           veq    505828/s 545300%   1443%      --

   *   This is for perl 5.10.0 on a Pentium 4 3.0GHz (unit is 32 bits).

                        Rate vfill_pp vfill_bv    vfill
           vfill_pp    185/s       --    -100%    -100%
           vfill_bv 407979/s  220068%       --     -16%
           vfill    486022/s  262184%      19%       --

                        Rate vcopy_pp vcopy_bv    vcopy
           vcopy_pp   61.5/s       --    -100%    -100%
           vcopy_bv  32548/s   52853%       --     -83%
           vcopy    187360/s  304724%     476%       --

                        Rate vmove_pp vmove_bv    vmove
           vmove_pp   63.1/s       --    -100%    -100%
           vmove_bv  32829/s   51933%       --     -83%
           vmove    188572/s  298787%     474%       --

                      Rate  veq_pp  veq_bv     veq
           veq_pp   34.2/s      --   -100%   -100%
           veq_bv  17518/s  51190%      --    -91%
           veq    192181/s 562591%    997%      --

   *   This is for perl 5.10.0 on an UltraSPARC-IIi (unit is 8 bits).

                       Rate vfill_pp    vfill vfill_bv
           vfill_pp  4.23/s       --    -100%    -100%
           vfill    30039/s  709283%       --     -17%
           vfill_bv 36022/s  850568%      20%       --

                       Rate vcopy_pp vcopy_bv    vcopy
           vcopy_pp  2.74/s       --    -100%    -100%
           vcopy_bv  8146/s  297694%       --     -60%
           vcopy    20266/s  740740%     149%       --

                       Rate vmove_pp vmove_bv    vmove
           vmove_pp  2.66/s       --    -100%    -100%
           vmove_bv  8274/s  311196%       --     -59%
           vmove    20287/s  763190%     145%       --

                     Rate  veq_pp  veq_bv     veq
           veq_pp  7.33/s      --   -100%   -100%
           veq_bv  2499/s  33978%      --    -87%
           veq    19675/s 268193%    687%      --

CAVEATS
   Please report architectures where we can't use the alignment as the move
   unit. I'll add exceptions for them.

DEPENDENCIES
   perl 5.6.

   A C compiler. This module may happen to build with a C++ compiler as
   well, but don't rely on it, as no guarantee is made in this regard.

   Carp, Exporter (core modules since perl 5), XSLoader (since perl 5.6.0).

SEE ALSO
   Bit::Vector gives a complete reimplementation of bit vectors.

AUTHOR
   Vincent Pit, "<perl at profvince.com>", <http://www.profvince.com>.

   You can contact me by mail or on "irc.perl.org" (vincent).

BUGS
   Please report any bugs or feature requests to "bug-scalar-vec-util at
   rt.cpan.org", or through the web interface at
   <http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Scalar-Vec-Util>. I will
   be notified, and then you'll automatically be notified of progress on
   your bug as I make changes.

SUPPORT
   You can find documentation for this module with the perldoc command.

       perldoc Scalar::Vec::Util

   Tests code coverage report is available at
   <http://www.profvince.com/perl/cover/Scalar-Vec-Util>.

COPYRIGHT & LICENSE
   Copyright 2008,2009,2010,2011,2012,2013 Vincent Pit, all rights
   reserved.

   This program is free software; you can redistribute it and/or modify it
   under the same terms as Perl itself.