Mercurial > repos > deepakjadmin > mayatool3_test2
comparison lib/BitVector.pm @ 0:4816e4a8ae95 draft default tip
Uploaded
author | deepakjadmin |
---|---|
date | Wed, 20 Jan 2016 09:23:18 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4816e4a8ae95 |
---|---|
1 package BitVector; | |
2 # | |
3 # $RCSfile: BitVector.pm,v $ | |
4 # $Date: 2015/02/28 20:47:02 $ | |
5 # $Revision: 1.32 $ | |
6 # | |
7 # Author: Manish Sud <msud@san.rr.com> | |
8 # | |
9 # Copyright (C) 2015 Manish Sud. All rights reserved. | |
10 # | |
11 # This file is part of MayaChemTools. | |
12 # | |
13 # MayaChemTools is free software; you can redistribute it and/or modify it under | |
14 # the terms of the GNU Lesser General Public License as published by the Free | |
15 # Software Foundation; either version 3 of the License, or (at your option) any | |
16 # later version. | |
17 # | |
18 # MayaChemTools is distributed in the hope that it will be useful, but without | |
19 # any warranty; without even the implied warranty of merchantability of fitness | |
20 # for a particular purpose. See the GNU Lesser General Public License for more | |
21 # details. | |
22 # | |
23 # You should have received a copy of the GNU Lesser General Public License | |
24 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or | |
25 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330, | |
26 # Boston, MA, 02111-1307, USA. | |
27 # | |
28 | |
29 use strict; | |
30 use Carp; | |
31 use Exporter; | |
32 use Scalar::Util (); | |
33 use TextUtil (); | |
34 use ConversionsUtil (); | |
35 use MathUtil; | |
36 | |
37 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); | |
38 | |
39 @ISA = qw(Exporter); | |
40 @EXPORT = qw(IsBitVector); | |
41 @EXPORT_OK = qw(NewFromBinaryString NewFromDecimalString NewFromHexadecimalString NewFromOctalString NewFromRawBinaryString); | |
42 | |
43 %EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]); | |
44 | |
45 # Setup class variables... | |
46 my($ClassName, $ValueFormat, $ValueBitOrder); | |
47 _InitializeClass(); | |
48 | |
49 # | |
50 # Overload bitwise and some logical operators... | |
51 # | |
52 # 'fallback' is set to 'false' to raise exception for all other operators. | |
53 # | |
54 use overload '""' => 'StringifyBitVector', | |
55 '&' => '_BitVectorAndOperator', | |
56 '|' => '_BitVectorOrOperator', | |
57 '^' => '_BitVectorExclusiveOrOperator', | |
58 | |
59 '~' => '_BitVectorNegationOperator', | |
60 | |
61 '==' => '_BitVectorEqualOperator', | |
62 '!=' => '_BitVectorNotEqualOperator', | |
63 | |
64 'fallback' => undef; | |
65 | |
66 # Class constructor... | |
67 # | |
68 sub new { | |
69 my($Class, $Size) = @_; | |
70 | |
71 # Initialize object... | |
72 my $This = {}; | |
73 bless $This, ref($Class) || $Class; | |
74 $This->_InitializeBitVector($Size); | |
75 | |
76 return $This; | |
77 } | |
78 | |
79 # Initialize object data... | |
80 # | |
81 # Note: | |
82 # . Perl pack function used to initialize vector automatically sets its size to | |
83 # nearest power of 2 value. | |
84 # | |
85 sub _InitializeBitVector { | |
86 my($This, $Size) = @_; | |
87 | |
88 if (!defined $Size) { | |
89 croak "Error: ${ClassName}->new: BitVector object instantiated without specifying its size ..."; | |
90 } | |
91 if ($Size <=0) { | |
92 croak "Error: ${ClassName}->new: Bit vector size, $Size, must be a positive integer..."; | |
93 } | |
94 | |
95 # Initialize vector with zeros... | |
96 $This->{BitValues} = pack("b*", "0" x $Size); | |
97 | |
98 # Size to automatically set to nearest power of 2 by Perl pack function. So use the length | |
99 # of packed vector to set size... | |
100 $This->{Size} = length($This->GetBitsAsBinaryString()); | |
101 | |
102 return $This; | |
103 } | |
104 | |
105 # Initialize class ... | |
106 sub _InitializeClass { | |
107 #Class name... | |
108 $ClassName = __PACKAGE__; | |
109 | |
110 # Print format for bit vectore values... | |
111 $ValueFormat = "Binary"; | |
112 | |
113 # Bit ordering for printing bit vector value strings. Default is to print lowest bit of each | |
114 # byte on the left. | |
115 # | |
116 # Internally, bits are stored in ascending order using Perl vec function. Regardless | |
117 # of machine order, big-endian or little-endian, vec function always considers first | |
118 # string byte as the lowest byte and first bit within each byte as the lowest bit. | |
119 # | |
120 # Possible values: Ascending or Descending | |
121 # | |
122 $ValueBitOrder = 'Ascending'; | |
123 } | |
124 | |
125 # Create a new bit vector using binary string. This functionality can be | |
126 # either invoked as a class function or an object method. | |
127 # | |
128 # The size of bit vector is automatically set to reflect the string. | |
129 # | |
130 sub NewFromBinaryString ($;$) { | |
131 my($FirstParameter, $SecondParameter, $ThirdParameter) = @_; | |
132 | |
133 if (_IsBitVector($FirstParameter)) { | |
134 return _NewBitVectorFromString('Binary', $SecondParameter, $ThirdParameter); | |
135 } | |
136 else { | |
137 return _NewBitVectorFromString( 'Binary', $FirstParameter, $SecondParameter); | |
138 } | |
139 } | |
140 | |
141 # Create a new bit vector using hexadecimal string. This functionality can be | |
142 # either invoked as a class function or an object method. | |
143 # | |
144 # The size of bit vector is automatically set to reflect the string. | |
145 # | |
146 sub NewFromHexadecimalString ($;$) { | |
147 my($FirstParameter, $SecondParameter, $ThirdParameter) = @_; | |
148 | |
149 if (_IsBitVector($FirstParameter)) { | |
150 return _NewBitVectorFromString('Hexadecimal', $SecondParameter, $ThirdParameter); | |
151 } | |
152 else { | |
153 return _NewBitVectorFromString( 'Hexadecimal', $FirstParameter, $SecondParameter); | |
154 } | |
155 } | |
156 | |
157 # Create a new bit vector using octal string. This functionality can be | |
158 # either invoked as a class function or an object method. | |
159 # | |
160 # The size of bit vector is automatically set to reflect the string. | |
161 # | |
162 sub NewFromOctalString ($;$) { | |
163 my($FirstParameter, $SecondParameter, $ThirdParameter) = @_; | |
164 | |
165 if (_IsBitVector($FirstParameter)) { | |
166 return _NewBitVectorFromString('Octal', $SecondParameter, $ThirdParameter); | |
167 } | |
168 else { | |
169 return _NewBitVectorFromString( 'Octal', $FirstParameter, $SecondParameter); | |
170 } | |
171 } | |
172 | |
173 # Create a new bit vector using decimal string. This functionality can be | |
174 # either invoked as a class function or an object method. | |
175 # | |
176 # The size of bit vector is automatically set to reflect the string. | |
177 # | |
178 sub NewFromDecimalString ($;$) { | |
179 my($FirstParameter, $SecondParameter, $ThirdParameter) = @_; | |
180 | |
181 if (_IsBitVector($FirstParameter)) { | |
182 return _NewBitVectorFromString('Decimal', $SecondParameter, $ThirdParameter); | |
183 } | |
184 else { | |
185 return _NewBitVectorFromString( 'Decimal', $FirstParameter, $SecondParameter); | |
186 } | |
187 } | |
188 | |
189 # Create a new bit vector using raw binary string. This functionality can be | |
190 # either invoked as a class function or an object method. | |
191 # | |
192 # The size of bit vector is automatically set to reflect the string. | |
193 # | |
194 sub NewFromRawBinaryString ($;$) { | |
195 my($FirstParameter, $SecondParameter, $ThirdParameter) = @_; | |
196 | |
197 if (_IsBitVector($FirstParameter)) { | |
198 return _NewBitVectorFromString('RawBinary', $SecondParameter, $ThirdParameter); | |
199 } | |
200 else { | |
201 return _NewBitVectorFromString( 'RawBinary', $FirstParameter, $SecondParameter); | |
202 } | |
203 } | |
204 | |
205 # Create a new bit vector from a string... | |
206 # | |
207 sub _NewBitVectorFromString ($$;$) { | |
208 my($Format, $String, $BitOrder) = @_; | |
209 my($Size, $BitVector); | |
210 | |
211 $Size = _CalculateStringSizeInBits($Format, $String); | |
212 | |
213 $BitVector = new BitVector($Size); | |
214 $BitVector->_SetBitsAsString($Format, $String, $BitOrder); | |
215 | |
216 return $BitVector; | |
217 } | |
218 | |
219 # Copy bit vector... | |
220 sub Copy { | |
221 my($This) = @_; | |
222 my($BitVector); | |
223 | |
224 # Make a new bit vector... | |
225 $BitVector = (ref $This)->new($This->{Size}); | |
226 | |
227 # Copy bit values... | |
228 $BitVector->{BitValues} = $This->{BitValues}; | |
229 | |
230 # Copy value format for stringification... | |
231 if (exists $This->{ValueFormat}) { | |
232 $BitVector->{ValueFormat} = $This->{ValueFormat}; | |
233 } | |
234 # Copy value bit order for stringification... | |
235 if (exists $This->{ValueBitOrder}) { | |
236 $BitVector->{ValueBitOrder} = $This->{ValueBitOrder}; | |
237 } | |
238 return $BitVector; | |
239 } | |
240 | |
241 # Reverse bit values in bit vector... | |
242 sub Reverse { | |
243 my($This) = @_; | |
244 my($BitNum, $ReverseBitNum, $BitValue, $ReverseBitValue); | |
245 | |
246 $BitNum = 0; $ReverseBitNum = $This->{Size} - 1; | |
247 | |
248 while ($BitNum < $ReverseBitNum) { | |
249 $BitValue = $This->_GetBitValue($BitNum); | |
250 $ReverseBitValue = $This->_GetBitValue($ReverseBitNum); | |
251 | |
252 $This->_SetBitValue($BitNum, $ReverseBitValue); | |
253 $This->_SetBitValue($ReverseBitNum, $BitValue); | |
254 | |
255 $BitNum++; $ReverseBitNum--; | |
256 } | |
257 return $This; | |
258 } | |
259 | |
260 # Is it a bit vector object? | |
261 sub IsBitVector ($) { | |
262 my($Object) = @_; | |
263 | |
264 return _IsBitVector($Object); | |
265 } | |
266 | |
267 # Get size... | |
268 sub GetSize { | |
269 my($This) = @_; | |
270 | |
271 return $This->{Size}; | |
272 } | |
273 | |
274 # Set a bit... | |
275 # | |
276 sub SetBit { | |
277 my($This, $BitNum, $SkipCheck) = @_; | |
278 | |
279 # Just set it... | |
280 if ($SkipCheck) { | |
281 return $This->_SetBitValue($BitNum, 1); | |
282 } | |
283 | |
284 # Check and set... | |
285 $This->_ValidateBitNumber("SetBit", $BitNum); | |
286 | |
287 return $This->_SetBitValue($BitNum, 1); | |
288 } | |
289 | |
290 # Set arbitrary bits specified as a list of bit numbers... | |
291 # | |
292 sub SetBits { | |
293 my($This, @BitNums) = @_; | |
294 my($BitNum); | |
295 | |
296 for $BitNum (@BitNums) { | |
297 $This->SetBit($BitNum); | |
298 } | |
299 return $This; | |
300 } | |
301 | |
302 # Set bits in a specified range... | |
303 # | |
304 sub SetBitsRange { | |
305 my($This, $MinBitNum, $MaxBitNum) = @_; | |
306 my($BitNum); | |
307 | |
308 $This->_ValidateBitNumber("SetBitsRange", $MinBitNum); | |
309 $This->_ValidateBitNumber("SetBitsRange", $MaxBitNum); | |
310 | |
311 for $BitNum ($MinBitNum .. $MaxBitNum) { | |
312 $This->_SetBitValue($BitNum, 1); | |
313 } | |
314 return $This; | |
315 } | |
316 | |
317 # Set all bits... | |
318 # | |
319 sub SetAllBits { | |
320 my($This) = @_; | |
321 | |
322 $This->{BitValues} = pack("b*", "1" x $This->{Size}); | |
323 } | |
324 | |
325 # Clear a bit... | |
326 # | |
327 sub ClearBit { | |
328 my($This, $BitNum) = @_; | |
329 | |
330 $This->_ValidateBitNumber("ClearBit", $BitNum); | |
331 | |
332 return $This->_SetBitValue($BitNum, 0); | |
333 } | |
334 | |
335 # Clear arbitrary bits specified as a list of bit numbers... | |
336 # | |
337 sub ClearBits { | |
338 my($This, @BitNums) = @_; | |
339 my($BitNum); | |
340 | |
341 for $BitNum (@BitNums) { | |
342 $This->ClearBit($BitNum); | |
343 } | |
344 return $This; | |
345 } | |
346 | |
347 # Clear bits in a specified range... | |
348 # | |
349 sub ClearBitsRange { | |
350 my($This, $MinBitNum, $MaxBitNum) = @_; | |
351 my($BitNum); | |
352 | |
353 $This->_ValidateBitNumber("ClearBitsRange", $MinBitNum); | |
354 $This->_ValidateBitNumber("ClearBitsRange", $MaxBitNum); | |
355 | |
356 for $BitNum ($MinBitNum .. $MaxBitNum) { | |
357 $This->_SetBitValue($BitNum, 0); | |
358 } | |
359 return $This; | |
360 } | |
361 | |
362 # Clear all bits... | |
363 # | |
364 sub ClearAllBits { | |
365 my($This) = @_; | |
366 | |
367 $This->{BitValues} = pack("b*", "0" x $This->{Size}); | |
368 | |
369 return $This; | |
370 } | |
371 | |
372 # Set or clear bit... | |
373 # | |
374 sub SetBitValue { | |
375 my($This, $BitNum, $BitValue) = @_; | |
376 | |
377 BITVALUE: { | |
378 if ($BitValue == 1) { return $This->SetBit($BitNum); last BITVALUE; } | |
379 if ($BitValue == 0) { return $This->ClearBit($BitNum); last BITVALUE; } | |
380 croak "Error: ${ClassName}->SetBit: Specified bit value, $BitValue, must be 0 or 1..."; | |
381 } | |
382 return $This; | |
383 } | |
384 | |
385 # Flip bit value... | |
386 # | |
387 sub FlipBit { | |
388 my($This, $BitNum) = @_; | |
389 | |
390 $This->_ValidateBitNumber("FlipBit", $BitNum); | |
391 return $This->_FlipBit($BitNum); | |
392 } | |
393 | |
394 # Flip arbitrary bits specified as a list of bit numbers... | |
395 # | |
396 sub FlipBits { | |
397 my($This, @BitNums) = @_; | |
398 my($BitNum); | |
399 | |
400 for $BitNum (@BitNums) { | |
401 $This->FlipBit(); | |
402 } | |
403 return $This; | |
404 } | |
405 | |
406 # Flip bit value in a specified bit range... | |
407 # | |
408 sub FlipBitsRange { | |
409 my($This, $MinBitNum, $MaxBitNum) = @_; | |
410 my($BitNum); | |
411 | |
412 $This->_ValidateBitNumber("FlipBitsRange", $MinBitNum); | |
413 $This->_ValidateBitNumber("FlipBitsRange", $MaxBitNum); | |
414 | |
415 for $BitNum ($MinBitNum .. $MaxBitNum) { | |
416 $This->_FlipBit(); | |
417 } | |
418 return $This; | |
419 } | |
420 | |
421 # Flip all bit valus... | |
422 # | |
423 sub FlipAllBits { | |
424 my($This) = @_; | |
425 | |
426 return $This->FlipBits(0, ($This->{Size} - 1)); | |
427 } | |
428 | |
429 # Flip bit value... | |
430 sub _FlipBit { | |
431 my($This, $BitNum) = @_; | |
432 | |
433 if ($This->_GetBitValue($BitNum)) { | |
434 return $This->_SetBitValue($BitNum, 0); | |
435 } | |
436 else { | |
437 return $This->_SetBitValue($BitNum, 1); | |
438 } | |
439 } | |
440 | |
441 # Get bit value... | |
442 # | |
443 sub GetBit { | |
444 my($This, $BitNum) = @_; | |
445 | |
446 $This->_ValidateBitNumber("GetBit", $BitNum); | |
447 | |
448 return $This->_GetBitValue($BitNum); | |
449 } | |
450 | |
451 # Is a specific bit set? | |
452 # | |
453 sub IsBitSet { | |
454 my($This, $BitNum) = @_; | |
455 | |
456 if (!(defined($BitNum) && ($BitNum >= 0) && ($BitNum < $This->{Size}))) { | |
457 return undef; | |
458 } | |
459 | |
460 return $This->_GetBitValue($BitNum) ? 1 : 0; | |
461 } | |
462 | |
463 # Is a specific bit clear? | |
464 # | |
465 sub IsBitClear { | |
466 my($This, $BitNum) = @_; | |
467 | |
468 if (!(defined($BitNum) && ($BitNum >= 0) && ($BitNum < $This->{Size}))) { | |
469 return undef; | |
470 } | |
471 | |
472 return $This->_GetBitValue($BitNum) ? 0 : 1; | |
473 } | |
474 | |
475 # Get number of set bits... | |
476 # | |
477 sub GetNumOfSetBits { | |
478 my($This) = @_; | |
479 | |
480 return unpack("%b*", $This->{BitValues}); | |
481 } | |
482 | |
483 # Get number of clear bits... | |
484 # | |
485 sub GetNumOfClearBits { | |
486 my($This) = @_; | |
487 | |
488 return ($This->{Size} - $This->GetNumOfSetBits()); | |
489 } | |
490 | |
491 # Get density of set bits... | |
492 # | |
493 sub GetDensityOfSetBits { | |
494 my($This) = @_; | |
495 | |
496 return $This->{Size} ? ($This->GetNumOfSetBits()/$This->{Size}) : 0; | |
497 } | |
498 | |
499 # Get density of clear bits... | |
500 # | |
501 sub GetDensityOfClearBits { | |
502 my($This) = @_; | |
503 | |
504 return $This->GetNumOfClearBits()/$This->{Size}; | |
505 } | |
506 | |
507 # Convert internal bit values stored using Perl vec function with first string byte | |
508 # as the lowest byte and first bit within each byte as the lowest bit into a binary | |
509 # string with ascending or descending bit order within each byte. The internal | |
510 # bit order corresponds to ascending bit order within each byte. | |
511 # | |
512 sub GetBitsAsBinaryString { | |
513 my($This, $BitOrder) = @_; | |
514 | |
515 return $This->_GetBitsAsString('Binary', $BitOrder); | |
516 } | |
517 | |
518 # Convert internal bit values stored using Perl vec function with first string byte | |
519 # as the lowest byte and first bit within each byte as the lowest bit into a hexadecimal | |
520 # string with ascending or descending bit order within each byte. The internal | |
521 # bit order corresponds to ascending bit order within each byte. | |
522 # | |
523 # | |
524 sub GetBitsAsHexadecimalString { | |
525 my($This, $BitOrder) = @_; | |
526 | |
527 return $This->_GetBitsAsString('Hexadecimal', $BitOrder); | |
528 } | |
529 | |
530 # Convert bit values into a octal string value... | |
531 # | |
532 sub GetBitsAsOctalString { | |
533 my($This, $BitOrder) = @_; | |
534 | |
535 return $This->_GetBitsAsString('Octal', $BitOrder); | |
536 } | |
537 | |
538 # Convert bit values into a decimal string value... | |
539 # | |
540 sub GetBitsAsDecimalString { | |
541 my($This, $BitOrder) = @_; | |
542 | |
543 return $This->_GetBitsAsString('Decimal', $BitOrder); | |
544 } | |
545 | |
546 # Return packed bit values which also contains nonprintable characters... | |
547 # | |
548 sub GetBitsAsRawBinaryString { | |
549 my($This) = @_; | |
550 | |
551 return $This->_GetBitsAsString('RawBinary'); | |
552 } | |
553 | |
554 # Convert internal bit values stored using Perl vec function with first string byte | |
555 # as the lowest byte and first bit within each byte as the lowest bit into a | |
556 # string with ascending or descending bit order within each byte. The internal | |
557 # bit order corresponds to ascending bit order within each byte. | |
558 # | |
559 # | |
560 sub _GetBitsAsString { | |
561 my($This, $Format, $BitOrder) = @_; | |
562 my($BinaryTemplate, $HexadecimalTemplate); | |
563 | |
564 ($BinaryTemplate, $HexadecimalTemplate) = $This->_SetupBitsPackUnpackTemplate($BitOrder); | |
565 | |
566 FORMAT : { | |
567 if ($Format =~ /^(Hexadecimal|Hex|HexadecimalString)$/i) { return unpack($HexadecimalTemplate, $This->{BitValues}); last FORMAT; } | |
568 if ($Format =~ /^(Octal|Oct|OctalString)$/i) { return ConversionsUtil::HexadecimalToOctal(unpack($HexadecimalTemplate, $This->{BitValues})); last FORMAT; } | |
569 if ($Format =~ /^(Decimal|Dec|DecimalString)$/i) { return ConversionsUtil::HexadecimalToDecimal(unpack($HexadecimalTemplate, $This->{BitValues})); last FORMAT; } | |
570 if ($Format =~ /^(Binary|Bin|BinaryString)$/i) { return unpack($BinaryTemplate, $This->{BitValues}); last FORMAT; } | |
571 if ($Format =~ /^(RawBinary|RawBin|RawBinaryString)$/i) { return $This->{BitValues}; last FORMAT; } | |
572 croak "Error: ${ClassName}->_GetBitsAsString: Specified bit vector string format, $Format, is not supported. Value values: Binary, Bin, BinaryString, Hexdecimal, Hex, HexadecimalString, Decimal, Dec, DecimalString, Octal, Oct, OctalString, RawBinary, RawBin, RawBinaryString..."; | |
573 } | |
574 } | |
575 | |
576 # Setup templates to unpack bits... | |
577 # | |
578 sub _SetupBitsPackUnpackTemplate { | |
579 my($This, $BitOrder) = @_; | |
580 my($BinaryTemplate, $HexadecimalTemplate); | |
581 | |
582 $BitOrder = (defined($BitOrder) && $BitOrder) ? $BitOrder : 'Ascending'; | |
583 | |
584 if ($BitOrder =~ /^Ascending$/i) { | |
585 $BinaryTemplate = "b*"; | |
586 $HexadecimalTemplate = "h*"; | |
587 } | |
588 elsif ($BitOrder =~ /^Descending$/i) { | |
589 $BinaryTemplate = "B*"; | |
590 $HexadecimalTemplate = "H*"; | |
591 } | |
592 else { | |
593 croak "Warning: ${ClassName}::_SetupBitsPackUnpackTemplate: Specified bit order value, $BitOrder, is not supported. Supported values: Ascending, Descending..."; | |
594 } | |
595 return ($BinaryTemplate, $HexadecimalTemplate); | |
596 } | |
597 | |
598 # Set bit values using hexadecimal string. The initial size of bit vector is not changed. | |
599 # | |
600 sub SetBitsAsHexadecimalString { | |
601 my($This, $Hexadecimal, $BitOrder) = @_; | |
602 | |
603 if ($Hexadecimal =~ /^0x/i) { | |
604 $Hexadecimal =~ s/^0x//i; | |
605 } | |
606 return $This->_SetBitsAsString('Hexadecimal', $Hexadecimal, $BitOrder); | |
607 } | |
608 | |
609 # Set bit values using octal string. The initial size of bit vector is not changed. | |
610 # | |
611 sub SetBitsAsOctalString { | |
612 my($This, $Octal, $BitOrder) = @_; | |
613 | |
614 if ($Octal =~ /^0/i) { | |
615 $Octal =~ s/^0//i; | |
616 } | |
617 return $This->_SetBitsAsString('Octal', $Octal, $BitOrder); | |
618 } | |
619 | |
620 # Set bit values using a decimal number. The initial size of bit vector is not changed. | |
621 # | |
622 sub SetBitsAsDecimalString { | |
623 my($This, $Decimal, $BitOrder) = @_; | |
624 | |
625 if (!TextUtil::IsPositiveInteger($Decimal)) { | |
626 croak "Error: ${ClassName}->SetBitsAsDecimalString: Specified decimal value, $Decimal, must be a positive integer..."; | |
627 } | |
628 if ($Decimal =~ /[+]/) { | |
629 $Decimal =~ s/[+]//; | |
630 } | |
631 return $This->_SetBitsAsString('Decimal', $Decimal, $BitOrder); | |
632 } | |
633 | |
634 # Set bit values using hexadecimal string. The initial size of bit vector is not changed. | |
635 # | |
636 sub SetBitsAsBinaryString { | |
637 my($This, $Binary, $BitOrder) = @_; | |
638 | |
639 if ($Binary =~ /^0b/i) { | |
640 $Binary =~ s/^0b//i; | |
641 } | |
642 return $This->_SetBitsAsString('Binary', $Binary, $BitOrder); | |
643 } | |
644 | |
645 # Set bit values using packed binary string. The size of bit vector is changed to reflect | |
646 # the input raw string... | |
647 # | |
648 sub SetBitsAsRawBinaryString { | |
649 my($This, $RawBinary) = @_; | |
650 | |
651 return $This->_SetBitsAsString('RawBinary', $RawBinary); | |
652 } | |
653 | |
654 # Set bits using string in a specified format. This size of bit vector is not changed except for | |
655 # RawBinary string type... | |
656 # | |
657 sub _SetBitsAsString { | |
658 my($This, $Format, $String, $BitOrder) = @_; | |
659 my($Size, $BinaryTemplate, $HexadecimalTemplate); | |
660 | |
661 ($BinaryTemplate, $HexadecimalTemplate) = $This->_SetupBitsPackUnpackTemplate($BitOrder); | |
662 | |
663 $Size = $This->{Size}; | |
664 FORMAT : { | |
665 if ($Format =~ /^(Hexadecimal|Hex|HexadecimalString)$/i) { $This->{BitValues} = pack($HexadecimalTemplate, $String); last FORMAT; } | |
666 if ($Format =~ /^(Octal|Oct|OctalString)$/i) { vec($This->{BitValues}, 0, $Size) = ConversionsUtil::OctalToDecimal($String); last FORMAT; } | |
667 if ($Format =~ /^(Decimal|Dec|DecimalString)$/i) { vec($This->{BitValues}, 0, $Size) = $String; last FORMAT; } | |
668 if ($Format =~ /^(Binary|Bin|BinaryString)$/i) { $This->{BitValues} = pack($BinaryTemplate, $String); last FORMAT; } | |
669 if ($Format =~ /^(RawBinary|RawBin|RawBinaryString)$/i) { $This->{BitValues} = $String; last FORMAT; } | |
670 croak "Error: ${ClassName}->_SetBitsAsString: Specified bit vector string format, $Format, is not supported. Value values: Binary, Bin, BinaryString, Hexdecimal, Hex, HexadecimalString, Decimal, Dec, DecimalString, Octal, Oct, OctalString, RawBinary, RawBin, RawBinaryString..."; | |
671 } | |
672 | |
673 # Set size using packed string... | |
674 $Size = length($This->GetBitsAsBinaryString()); | |
675 if ($Size <=0) { | |
676 croak "Error: ${ClassName}->_SetBitsAsString: Bit vector size, $Size, must be a positive integer..."; | |
677 } | |
678 $This->{Size} = $Size; | |
679 | |
680 return $This; | |
681 } | |
682 | |
683 # Calculate string size in bits... | |
684 # | |
685 sub _CalculateStringSizeInBits ($$;$) { | |
686 my($FirstParameter, $SecondParameter, $ThisParameter) = @_; | |
687 my($This, $Format, $String, $Size); | |
688 | |
689 if ((@_ == 3) && (_IsBitVector($FirstParameter))) { | |
690 ($This, $Format, $String) = ($FirstParameter, $SecondParameter, $ThisParameter); | |
691 } | |
692 else { | |
693 ($This, $Format, $String) = (undef, $FirstParameter, $SecondParameter); | |
694 } | |
695 | |
696 FORMAT : { | |
697 if ($Format =~ /^(Hexadecimal|Hex|HexadecimalString)$/i) { $Size = length($String) * 4; last FORMAT; } | |
698 if ($Format =~ /^(Octal|Oct|OctalString)$/i) { $Size = length($String) * 3; last FORMAT; } | |
699 if ($Format =~ /^(Decimal|Dec|DecimalString)$/i) { $Size = length(ConversionsUtil::DecimalToHexadecimal($String)) * 4; last FORMAT; } | |
700 if ($Format =~ /^(Binary|Bin|BinaryString)$/i) { $Size = length($String); last FORMAT; } | |
701 if ($Format =~ /^(RawBinary|RawBin|RawBinaryString)$/i) { $Size = length(unpack("B*", $String)); last FORMAT; } | |
702 croak "Error: ${ClassName}::_CalculateStringSizeInBits: Specified bit vector string format, $Format, is not supported. Value values: Binary, Bin, BinaryString, Hexdecimal, Hex, HexadecimalString, Decimal, Dec, DecimalString, Octal, Oct, OctalString, RawBinary, RawBin, RawBinaryString..."; | |
703 } | |
704 return $Size; | |
705 } | |
706 | |
707 # Set bit value using Perl vec function with bit numbers going from left to right. | |
708 # First bit number corresponds to 0. | |
709 # | |
710 sub _SetBitValue { | |
711 my($This, $BitNum, $BitValue) = @_; | |
712 my($Offset, $Width); | |
713 | |
714 $Offset = $BitNum; | |
715 $Width = 1; | |
716 | |
717 vec($This->{BitValues}, $Offset, $Width) = $BitValue; | |
718 | |
719 return $This; | |
720 } | |
721 | |
722 # Get bit value Perl vec function with bit numbers going from left to right. | |
723 # First bit number corresponds to 0. | |
724 # | |
725 sub _GetBitValue { | |
726 my($This, $BitNum) = @_; | |
727 my($Offset, $Width, $BitValue); | |
728 | |
729 $Offset = $BitNum; | |
730 $Width = 1; | |
731 | |
732 $BitValue = vec($This->{BitValues}, $Offset, $Width); | |
733 | |
734 return $BitValue; | |
735 } | |
736 | |
737 # Check to make sure it's a valid bit number... | |
738 # | |
739 sub _ValidateBitNumber { | |
740 my($This, $CallerName, $BitNum) = @_; | |
741 | |
742 if (!defined $BitNum) { | |
743 croak "Error: ${ClassName}->${CallerName}: Bit number is not defined..."; | |
744 } | |
745 if ($BitNum < 0) { | |
746 croak "Error: ${ClassName}->${CallerName}: Bit number value, $BitNum, must be >= 0 ..."; | |
747 } | |
748 if ($BitNum >= $This->{Size}) { | |
749 croak "Error: ${ClassName}->${CallerName}: Bit number number value, $BitNum, must be less than the size of bit vector, ", $This->{Size}, "..."; | |
750 } | |
751 | |
752 return $This; | |
753 } | |
754 | |
755 # Set bit values print format for an individual object or the whole class... | |
756 # | |
757 sub SetBitValuePrintFormat ($;$) { | |
758 my($FirstParameter, $SecondParameter) = @_; | |
759 | |
760 if ((@_ == 2) && (_IsBitVector($FirstParameter))) { | |
761 # Set bit values print format for the specific object... | |
762 my($This, $ValuePrintFormat) = ($FirstParameter, $SecondParameter); | |
763 | |
764 if (!_ValidateBitValuePrintFormat($ValuePrintFormat)) { | |
765 return; | |
766 } | |
767 | |
768 $This->{ValueFormat} = $ValuePrintFormat; | |
769 } | |
770 else { | |
771 # Set value print format for the class... | |
772 my($ValuePrintFormat) = ($FirstParameter); | |
773 | |
774 if (!_ValidateBitValuePrintFormat($ValuePrintFormat)) { | |
775 return; | |
776 } | |
777 | |
778 $ValueFormat = $ValuePrintFormat; | |
779 } | |
780 } | |
781 | |
782 # Set bit values bit order for an individual object or the whole class... | |
783 # | |
784 sub SetBitValueBitOrder ($;$) { | |
785 my($FirstParameter, $SecondParameter) = @_; | |
786 | |
787 if ((@_ == 2) && (_IsBitVector($FirstParameter))) { | |
788 # Set bit value bit order for the specific object... | |
789 my($This, $BitOrder) = ($FirstParameter, $SecondParameter); | |
790 | |
791 if (!_ValidateBitValueBitOrder($BitOrder)) { | |
792 return; | |
793 } | |
794 | |
795 $This->{ValueBitOrder} = $BitOrder; | |
796 } | |
797 else { | |
798 # Set bit value bit order for the class... | |
799 my($BitOrder) = ($FirstParameter); | |
800 | |
801 if (!_ValidateBitValueBitOrder($BitOrder)) { | |
802 return; | |
803 } | |
804 | |
805 $ValueBitOrder = $BitOrder; | |
806 } | |
807 } | |
808 | |
809 # Validate print format for bit values... | |
810 sub _ValidateBitValueBitOrder { | |
811 my($BitOrder) = @_; | |
812 | |
813 if ($BitOrder !~ /^(Ascending|Descending)$/i) { | |
814 carp "Warning: ${ClassName}::_ValidateBitValueBitOrder: Specified bit order value, $BitOrder, is not supported. Supported values: Ascending, Descending..."; | |
815 return 0; | |
816 } | |
817 return 1; | |
818 } | |
819 | |
820 # Validate print format for bit values... | |
821 sub _ValidateBitValuePrintFormat { | |
822 my($ValuePrintFormat) = @_; | |
823 | |
824 if ($ValuePrintFormat !~ /^(Binary|Bin||BinaryString|Hexadecimal|Hex||HexadecimalString|Decimal|Dec||DecimalString|Octal|Oct||OctalString|RawBinary|RawBin|RawBinaryString)$/i) { | |
825 carp "Warning: ${ClassName}::_ValidateBitValuePrintFormat: Specified bit vector print format value, $ValuePrintFormat, is not supported. Supported values: Binary, Bin, BinaryString, Hexdecimal, Hex, HexadecimalString, Decimal, Dec, DecimalString, Octal, Oct, OctalString, RawBinary, RawBin, RawBinaryString..."; | |
826 return 0; | |
827 } | |
828 return 1; | |
829 } | |
830 | |
831 # Bitwise AND operation for BitVectors... | |
832 # | |
833 sub _BitVectorAndOperator { | |
834 my($This, $Other, $OrderFlipped, $OtherIsBitVector, $ErrorMsg, $CheckBitVectorSizes); | |
835 | |
836 $ErrorMsg = "_BitVectorAndOperator: Bitwise AND oparation failed"; | |
837 $CheckBitVectorSizes = 1; | |
838 ($This, $Other, $OrderFlipped, $OtherIsBitVector) = _ProcessOverloadedOperatorParameters($ErrorMsg, @_, $CheckBitVectorSizes); | |
839 | |
840 if (!$OtherIsBitVector) { | |
841 if ($OrderFlipped) { | |
842 croak "Error: ${ClassName}->${ErrorMsg}: First object must be a bit vector..."; | |
843 } | |
844 } | |
845 my($BitVector); | |
846 $BitVector = (ref $This)->new($This->{Size}); | |
847 $BitVector->{BitValues} = $This->{BitValues} & $Other->{BitValues}; | |
848 | |
849 return $BitVector; | |
850 } | |
851 | |
852 # Bitwise OR operation for BitVectors... | |
853 # | |
854 sub _BitVectorOrOperator { | |
855 my($This, $Other, $OrderFlipped, $OtherIsBitVector, $ErrorMsg, $CheckBitVectorSizes); | |
856 | |
857 $ErrorMsg = "_BitVectorAndOperator: Bitwise OR oparation failed"; | |
858 $CheckBitVectorSizes = 1; | |
859 ($This, $Other, $OrderFlipped, $OtherIsBitVector) = _ProcessOverloadedOperatorParameters($ErrorMsg, @_, $CheckBitVectorSizes); | |
860 | |
861 if (!$OtherIsBitVector) { | |
862 if ($OrderFlipped) { | |
863 croak "Error: ${ClassName}->${ErrorMsg}: First object must be a bit vector..."; | |
864 } | |
865 } | |
866 my($BitVector); | |
867 $BitVector = (ref $This)->new($This->{Size}); | |
868 $BitVector->{BitValues} = $This->{BitValues} | $Other->{BitValues}; | |
869 | |
870 return $BitVector; | |
871 } | |
872 | |
873 # Bitwise XOR operation for BitVectors... | |
874 # | |
875 sub _BitVectorExclusiveOrOperator { | |
876 my($This, $Other, $OrderFlipped, $OtherIsBitVector, $ErrorMsg, $CheckBitVectorSizes); | |
877 | |
878 $ErrorMsg = "_BitVectorAndOperator: Bitwise XOR oparation failed"; | |
879 $CheckBitVectorSizes = 1; | |
880 ($This, $Other, $OrderFlipped, $OtherIsBitVector) = _ProcessOverloadedOperatorParameters($ErrorMsg, @_, $CheckBitVectorSizes); | |
881 | |
882 if (!$OtherIsBitVector) { | |
883 if ($OrderFlipped) { | |
884 croak "Error: ${ClassName}->${ErrorMsg}: First object must be a bit vector..."; | |
885 } | |
886 } | |
887 my($BitVector); | |
888 $BitVector = (ref $This)->new($This->{Size}); | |
889 $BitVector->{BitValues} = $This->{BitValues} ^ $Other->{BitValues}; | |
890 | |
891 return $BitVector; | |
892 } | |
893 | |
894 # Bitwise negation operation for BitVectors... | |
895 # | |
896 sub _BitVectorNegationOperator { | |
897 my($This, $Other, $OrderFlipped, $OtherIsBitVector, $ErrorMsg, $CheckBitVectorSizes); | |
898 | |
899 $ErrorMsg = "_BitVectorAndOperator: Bitwise negation oparation failed"; | |
900 $CheckBitVectorSizes = 1; | |
901 ($This, $Other, $OrderFlipped, $OtherIsBitVector) = _ProcessOverloadedOperatorParameters($ErrorMsg, @_, $CheckBitVectorSizes); | |
902 | |
903 my($BitVector); | |
904 $BitVector = (ref $This)->new($This->{Size}); | |
905 $BitVector->{BitValues} = ~ $This->{BitValues}; | |
906 | |
907 return $BitVector; | |
908 } | |
909 | |
910 # Bit vector equla operator. Two bit vectors are considered equal assuming their size | |
911 # is same and bits are on at the same positions... | |
912 # | |
913 sub _BitVectorEqualOperator { | |
914 my($This, $Other, $OrderFlipped, $OtherIsBitVector, $ErrorMsg, $CheckBitVectorSizes); | |
915 | |
916 $ErrorMsg = "_BitVectorEqualOperator: BitVector == oparation failed"; | |
917 $CheckBitVectorSizes = 0; | |
918 ($This, $Other, $OrderFlipped, $OtherIsBitVector) = _ProcessOverloadedOperatorParameters($ErrorMsg, @_, $CheckBitVectorSizes); | |
919 | |
920 if (!$OtherIsBitVector) { | |
921 if ($OrderFlipped) { | |
922 croak "Error: ${ClassName}->${ErrorMsg}: First object must be a bit vector..."; | |
923 } | |
924 } | |
925 if ($This->GetSize() != $Other->GetSize()) { | |
926 return 0; | |
927 } | |
928 if ($This->GetNumOfSetBits() != $Other->GetNumOfSetBits()) { | |
929 return 0; | |
930 } | |
931 # Check number of On bits only in This vector. It must be zero for vectors to be equal... | |
932 my($BitVector); | |
933 $BitVector = $This & ~$Other; | |
934 | |
935 return $BitVector->GetNumOfSetBits() ? 0 : 1; | |
936 } | |
937 | |
938 # Bit vector not equal operator. Two bit vectors are considered not equal when their size | |
939 # is different or bits are on at the same positions... | |
940 # | |
941 sub _BitVectorNotEqualOperator { | |
942 my($This, $Other, $OrderFlipped, $OtherIsBitVector, $ErrorMsg, $CheckBitVectorSizes); | |
943 | |
944 $ErrorMsg = "_BitVectorEqualOperator: BitVector != oparation failed"; | |
945 $CheckBitVectorSizes = 0; | |
946 ($This, $Other, $OrderFlipped, $OtherIsBitVector) = _ProcessOverloadedOperatorParameters($ErrorMsg, @_, $CheckBitVectorSizes); | |
947 | |
948 if (!$OtherIsBitVector) { | |
949 if ($OrderFlipped) { | |
950 croak "Error: ${ClassName}->${ErrorMsg}: First object must be a bit vector..."; | |
951 } | |
952 } | |
953 if ($This->GetSize() != $Other->GetSize()) { | |
954 return 1; | |
955 } | |
956 if ($This->GetNumOfSetBits() != $Other->GetNumOfSetBits()) { | |
957 return 1; | |
958 } | |
959 # Check number of On bits only in This vector. It must be zero for vectors to be equal... | |
960 my($BitVector); | |
961 $BitVector = $This & ~$Other; | |
962 | |
963 return $BitVector->GetNumOfSetBits() ? 1 : 0; | |
964 } | |
965 | |
966 # Process parameters passed to overloaded operators... | |
967 # | |
968 # For uninary operators, $SecondParameter is not defined. | |
969 sub _ProcessOverloadedOperatorParameters { | |
970 my($ErrorMsg, $FirstParameter, $SecondParameter, $ParametersOrderStatus, $CheckBitVectorSizesStatus) = @_; | |
971 my($This, $Other, $OrderFlipped, $OtherIsBitVector, $CheckBitVectorSizes); | |
972 | |
973 ($This, $Other) = ($FirstParameter, $SecondParameter); | |
974 $OrderFlipped = (defined($ParametersOrderStatus) && $ParametersOrderStatus) ? 1 : 0; | |
975 $CheckBitVectorSizes = (defined $CheckBitVectorSizesStatus) ? $CheckBitVectorSizesStatus : 1; | |
976 | |
977 _ValidateBitVector($ErrorMsg, $This); | |
978 | |
979 $OtherIsBitVector = 0; | |
980 if (defined($Other) && (ref $Other)) { | |
981 # Make sure $Other is a vector... | |
982 _ValidateBitVector($ErrorMsg, $Other); | |
983 if ($CheckBitVectorSizes) { | |
984 _ValidateBitVectorSizesAreEqual($ErrorMsg, $This, $Other); | |
985 } | |
986 $OtherIsBitVector = 1; | |
987 } | |
988 return ($This, $Other, $OrderFlipped, $OtherIsBitVector); | |
989 } | |
990 | |
991 # Is it a bit vector object? | |
992 sub _IsBitVector { | |
993 my($Object) = @_; | |
994 | |
995 return (Scalar::Util::blessed($Object) && $Object->isa($ClassName)) ? 1 : 0; | |
996 } | |
997 | |
998 # Make sure it's a bit vector reference... | |
999 sub _ValidateBitVector { | |
1000 my($ErrorMsg, $Vector) = @_; | |
1001 | |
1002 if (!_IsBitVector($Vector)) { | |
1003 croak "Error: ${ClassName}->${ErrorMsg}: Object must be a bit vector..."; | |
1004 } | |
1005 } | |
1006 | |
1007 # Make sure size of the two bit vectors are equal... | |
1008 sub _ValidateBitVectorSizesAreEqual { | |
1009 my($ErrorMsg, $BitVector1, $BitVector2) = @_; | |
1010 | |
1011 if ($BitVector1->GetSize() != $BitVector2->GetSize()) { | |
1012 croak "Error: ${ClassName}->${ErrorMsg}: Size of the bit vectors must be same..."; | |
1013 } | |
1014 } | |
1015 | |
1016 # Return a string containing vector values... | |
1017 sub StringifyBitVector { | |
1018 my($This) = @_; | |
1019 my($BitVectorString, $PrintFormat, $BitOrder, $BitsValue); | |
1020 | |
1021 $PrintFormat = (exists $This->{ValueFormat}) ? $This->{ValueFormat} : $ValueFormat; | |
1022 $BitOrder = (exists $This->{ValueBitOrder}) ? $This->{ValueBitOrder} : $ValueBitOrder; | |
1023 $BitVectorString = ''; | |
1024 | |
1025 FORMAT: { | |
1026 if ($PrintFormat =~ /^(Hexadecimal|Hex|HexadecimalString)$/i) { $BitsValue = $This->_GetBitsAsString('Hexadecimal', $BitOrder); last FORMAT; } | |
1027 if ($PrintFormat =~ /^(Octal|Oct|OctalString)$/i) { $BitsValue = $This->_GetBitsAsString('Octal', $BitOrder); last FORMAT; } | |
1028 if ($PrintFormat =~ /^(Decimal|Dec|DecimalString)$/i) { $BitsValue = $This->_GetBitsAsString('Decimal', $BitOrder); last FORMAT; } | |
1029 if ($PrintFormat =~ /^(RawBinary|RawBin|RawBinaryString)$/i) { $BitsValue = $This->_GetBitsAsString('RawBinary'); last FORMAT; } | |
1030 # Default is bninary format... | |
1031 $BitsValue = $This->_GetBitsAsString('Binary', $BitOrder); | |
1032 } | |
1033 $BitVectorString = "<Size: ". $This->GetSize() . ";BitOrder: $BitOrder; Value: " . $BitsValue . ">"; | |
1034 | |
1035 return $BitVectorString; | |
1036 } | |
1037 | |
1038 1; | |
1039 | |
1040 __END__ | |
1041 | |
1042 =head1 NAME | |
1043 | |
1044 BitVector | |
1045 | |
1046 =head1 SYNOPSIS | |
1047 | |
1048 use BitVector; | |
1049 | |
1050 use BitVector (); | |
1051 | |
1052 use BitVector qw(:all); | |
1053 | |
1054 =head1 DESCRIPTION | |
1055 | |
1056 B<BitVector> class provides the following methods: | |
1057 | |
1058 new, ClearAllBits, ClearBit, ClearBits, ClearBitsRange, Copy, FlipAllBits, | |
1059 FlipBit, FlipBits, FlipBitsRange, GetBit, GetBitsAsBinaryString, | |
1060 GetBitsAsDecimalString, GetBitsAsHexadecimalString, GetBitsAsOctalString, | |
1061 GetBitsAsRawBinaryString, GetDensityOfClearBits, GetDensityOfSetBits, | |
1062 GetNumOfClearBits, GetNumOfSetBits, GetSize, IsBitClear, IsBitSet, IsBitVector, | |
1063 NewFromBinaryString, NewFromDecimalString, NewFromHexadecimalString, | |
1064 NewFromOctalString, NewFromRawBinaryString, Reverse, SetAllBits, SetBit, | |
1065 SetBitValue, SetBitValueBitOrder, SetBitValuePrintFormat, SetBits, | |
1066 SetBitsAsBinaryString, SetBitsAsDecimalString, SetBitsAsHexadecimalString, | |
1067 SetBitsAsOctalString, SetBitsAsRawBinaryString, SetBitsRange, StringifyBitVector | |
1068 | |
1069 The following methods can also be used as functions: | |
1070 | |
1071 IsBitVector, NewFromBinaryString, NewFromDecimalString, NewFromHexadecimalString, | |
1072 NewFromOctalString, NewFromRawBinaryString | |
1073 | |
1074 The following operators are overloaded: | |
1075 | |
1076 "" & | ^ ~ == != | |
1077 | |
1078 Internally, bits are stored in ascending order using Perl vec function. Regardless | |
1079 of machine order, big-endian or little-endian, vec function always considers first | |
1080 string byte as the lowest byte and first bit within each byte as the lowest bit. | |
1081 | |
1082 Things to keep in mind: | |
1083 | |
1084 o Bit numbers range from 0 to (Size - 1). | |
1085 o Bit data retieval methods provide options to data in ascending or | |
1086 descending bit order. Default is ascending bit order. | |
1087 o Stringyfy method provides an option to print data in ascending or | |
1088 descending bit order. Default is ascending bit order. | |
1089 | |
1090 =head2 METHODS | |
1091 | |
1092 =over 4 | |
1093 | |
1094 =item B<new> | |
1095 | |
1096 $NewBitVector = new BitVector($Size); | |
1097 | |
1098 Create a new I<BitVector> object of size I<Size> and return newly created | |
1099 B<BitVector>. Bit numbers range from 0 to 1 less than I<Size>. | |
1100 | |
1101 =item B<ClearAllBits> | |
1102 | |
1103 $BitVector->ClearAllBits(); | |
1104 | |
1105 Set all bit values to 0 in I<BitVector> object and return I<BitVector>. | |
1106 | |
1107 =item B<ClearBit> | |
1108 | |
1109 $BitVector->ClearBit($BitNum); | |
1110 | |
1111 Set specified bit number I<BitNum> to 0 in I<BitVector> object and return I<BitVector>. | |
1112 | |
1113 =item B<ClearBits> | |
1114 | |
1115 $BitVector->ClearBits(@BitNums); | |
1116 | |
1117 Set specified bit numbers I<BitNums> to 0 in I<BitVector> object and return I<BitVector>. | |
1118 | |
1119 =item B<ClearBitsRange> | |
1120 | |
1121 $BitVector->ClearBitsRange($MinBitNum, $MaxBitNum); | |
1122 | |
1123 Set specified bit numbers between I<MinBitNum> and I<MaxBitNum> to 0 in I<BitVector> | |
1124 object and return I<BitVector>. | |
1125 | |
1126 =item B<Copy> | |
1127 | |
1128 $NewBitVector = $BitVector->Copy(); | |
1129 | |
1130 Copy I<BitVector> and its associated data to a new B<BitVector> and return a new | |
1131 B<BitVector>. | |
1132 | |
1133 =item B<FlipAllBits> | |
1134 | |
1135 $BitVector->FlipAllBits(); | |
1136 | |
1137 Flip values of all bits in I<BitVector> and its associated data to a new B<BitVector> and return | |
1138 I<BitVector>. | |
1139 | |
1140 =item B<FlipBit> | |
1141 | |
1142 $BitVector->FlipBit($BitNum); | |
1143 | |
1144 Flip value of specified I<BitNum> of in I<BitVector> and return I<BitVector>. | |
1145 | |
1146 =item B<FlipBits> | |
1147 | |
1148 $BitVector->FlipBits(@BitNums); | |
1149 | |
1150 Flip values of specified bit numbers I<BitNums> in I<BitVector> object and return I<BitVector>. | |
1151 | |
1152 =item B<FlipBitsRange> | |
1153 | |
1154 $BitVector->FlipBitsRange($MinBitNum, $MaxBitNum); | |
1155 | |
1156 Flip values of specified bit numbers between I<MinBitNum> and I<MaxBitNum> in I<BitVector> | |
1157 object and return I<BitVector>. | |
1158 | |
1159 =item B<GetBit> | |
1160 | |
1161 $BitValue = $BitVector->GetBit($BitNum); | |
1162 | |
1163 Returns value of bit number I<BitNum> in I<BitVector> object. | |
1164 | |
1165 =item B<GetBitsAsBinaryString> | |
1166 | |
1167 $BitString = $BitVector->GetBitsAsBinaryString([$BitOrder]); | |
1168 | |
1169 Returns values of bits in I<BitVector> as an ascii bit string containing 0s and 1s. | |
1170 | |
1171 Default I<BitOrder> is I<Ascending> bit order which corresponds to first bit in each | |
1172 byte as the loweset bit as opposed to the higest bit. | |
1173 | |
1174 =item B<GetBitsAsDecimalString> | |
1175 | |
1176 $BitString = $BitVector->GetBitsAsDecimalString([$BitOrder]); | |
1177 | |
1178 Returns values of bits in I<BitVector> as a decimal bit string containing values from 0 to | |
1179 9. | |
1180 | |
1181 Default I<BitOrder> is I<Ascending> bit order which corresponds to first bit in each | |
1182 byte as the loweset bit as opposed to the higest bit. | |
1183 | |
1184 =item B<GetBitsAsHexadecimalString> | |
1185 | |
1186 $BitString = $BitVector->GetBitsAsHexadecimalString([$BitOrder]); | |
1187 | |
1188 Returns values of bits in I<BitVector> as a hexadecimal bit string containing values from 0 to 9 | |
1189 and a to f. | |
1190 | |
1191 Default I<BitOrder> is I<Ascending> bit order which corresponds to first bit in each | |
1192 byte as the loweset bit as opposed to the higest bit. | |
1193 | |
1194 =item B<GetBitsAsOctalString> | |
1195 | |
1196 $BitString = $BitVector->GetBitsAsOctalString([$BitOrder]); | |
1197 | |
1198 Returns values of bits in I<BitVector> as an octal bit string containing values form 0 to | |
1199 7. | |
1200 | |
1201 Default I<BitOrder> is I<Ascending> bit order which corresponds to first bit in each | |
1202 byte as the loweset bit as opposed to the higest bit. | |
1203 | |
1204 =item B<GetBitsAsRawBinaryString> | |
1205 | |
1206 $BitString = $BitVector->GetBitsAsRawBinaryString(); | |
1207 | |
1208 Returns values of bits in I<BitVector> as an string corresponding to packed bit values | |
1209 used by Perl vec function without perfoming any unpacking. | |
1210 | |
1211 =item B<GetDensityOfClearBits> | |
1212 | |
1213 $ClearBitsDensity = $BitVector->GetDensityOfClearBits(); | |
1214 | |
1215 Returns density of clear bits in I<BitVector> which corresponds to number of bits set to 0 | |
1216 I<BitVector> divided by its size. | |
1217 | |
1218 =item B<GetDensityOfSetBits> | |
1219 | |
1220 $SetBitsDensity = $BitVector->GetDensityOfSetBits(); | |
1221 | |
1222 Returns density of set bits in I<BitVector> which corresponds to number of bits set to 1 in | |
1223 I<BitVector> divided by its size. | |
1224 | |
1225 =item B<GetNumOfClearBits> | |
1226 | |
1227 $NumOfClearBits = $BitVector->GetNumOfClearBits(); | |
1228 | |
1229 Returns number of bits set to 0 in I<BitVector>. | |
1230 | |
1231 =item B<GetNumOfSetBits> | |
1232 | |
1233 $NumOfSetBits = $BitVector->GetNumOfSetBits(); | |
1234 | |
1235 Returns number of bits set to 1 in I<BitVector>. | |
1236 | |
1237 =item B<GetSize> | |
1238 | |
1239 $Size = $BitVector->GetSize(); | |
1240 | |
1241 Returns size of I<BitVector>. | |
1242 | |
1243 =item B<IsBitClear> | |
1244 | |
1245 $Status = $BitVector->IsBitClear(); | |
1246 | |
1247 Returns 1 or 0 based on whether I<BitNum> is set to 0 in I<BitVector>. | |
1248 | |
1249 =item B<IsBitSet> | |
1250 | |
1251 $Status = $BitVector->IsBitSet($BitNum); | |
1252 | |
1253 Returns 1 or 0 based on whether I<BitNum> is set to 1 in I<BitVector>. | |
1254 | |
1255 =item B<IsBitVector> | |
1256 | |
1257 $Status = BitVector::IsBitVector($Object); | |
1258 | |
1259 Returns 1 or 0 based on whether I<Object> is a B<BitVector> object. | |
1260 | |
1261 =item B<NewFromBinaryString> | |
1262 | |
1263 $NewBitVector = BitVector::NewFromBinaryString($BinaryString, | |
1264 [$BitOrder]); | |
1265 $NewBitVector = $BitVector->NewFromBinaryString($BinaryString, | |
1266 [$BitOrder]); | |
1267 | |
1268 Creates a new I<BitVector> using I<BinaryString> and returns new B<BitVector> object. | |
1269 | |
1270 Default I<BitOrder> is I<Ascending> bit order which corresponds to first bit in each | |
1271 byte as the loweset bit as opposed to the higest bit. | |
1272 | |
1273 =item B<NewFromDecimalString> | |
1274 | |
1275 $NewBitVector = BitVector::NewFromDecimalString($DecimalString, | |
1276 [$BitOrder]); | |
1277 $NewBitVector = $BitVector->NewFromDecimalString($DecimalString, | |
1278 [$BitOrder]); | |
1279 | |
1280 Creates a new I<BitVector> using I<DecimalString> and returns new B<BitVector> object. | |
1281 | |
1282 Default I<BitOrder> is I<Ascending> bit order which corresponds to first bit in each | |
1283 byte as the loweset bit as opposed to the higest bit. | |
1284 | |
1285 =item B<NewFromHexadecimalString> | |
1286 | |
1287 $NewBitVector = BitVector::NewFromHexadecimalString( | |
1288 $HexadecimalString, [$BitOrder]); | |
1289 $NewBitVector = $BitVector->NewFromHexadecimalString( | |
1290 $HexadecimalString, [$BitOrder]); | |
1291 | |
1292 Creates a new I<BitVector> using I<HexadecimalString> and returns new B<BitVector> object. | |
1293 | |
1294 Default I<BitOrder> is I<Ascending> bit order which corresponds to first bit in each | |
1295 byte as the loweset bit as opposed to the higest bit. | |
1296 | |
1297 =item B<NewFromOctalString> | |
1298 | |
1299 $NewBitVector = BitVector::NewFromOctalString($OctalString, [$BitOrder]); | |
1300 $NewBitVector = $BitVector->NewFromOctalString($OctalString, [$BitOrder]); | |
1301 | |
1302 Creates a new I<BitVector> using I<OctalString> and returns new B<BitVector> object. | |
1303 | |
1304 Default I<BitOrder> is I<Ascending> bit order which corresponds to first bit in each | |
1305 byte as the loweset bit as opposed to the higest bit. | |
1306 | |
1307 =item B<NewFromRawBinaryString> | |
1308 | |
1309 $NewBitVector = BitVector::NewFromRawBinaryString( | |
1310 $RawBinaryString); | |
1311 $NewBitVector = $BitVector->NewFromRawBinaryString( | |
1312 $RawBinaryString); | |
1313 | |
1314 Creates a new I<BitVector> using I<RawBinaryString> and returns new B<BitVector> object. | |
1315 | |
1316 =item B<Reverse> | |
1317 | |
1318 $BitVector->Reverse(); | |
1319 | |
1320 Reverses values of bits in I<BitVector> and returns I<BitVector>. First bit number ends up with | |
1321 value of last bit number. | |
1322 | |
1323 =item B<SetAllBits> | |
1324 | |
1325 $BitVector->SetAllBits(); | |
1326 | |
1327 Sets values of all bits in I<BitVector> to 1 and returns I<BitVector>. | |
1328 | |
1329 =item B<SetBit> | |
1330 | |
1331 $BitVector->SetBit($BitNum); | |
1332 | |
1333 Sets value of I<BitNum> to 1 in I<BitVector> and returns I<BitVector>. | |
1334 | |
1335 =item B<SetBitValue> | |
1336 | |
1337 $BitVector->SetBitValue($BitNum, $BitValue); | |
1338 | |
1339 Sets value of I<BitNum> to I<BitValue> in I<BitVector> and returns I<BitVector>. | |
1340 | |
1341 =item B<SetBitValueBitOrder> | |
1342 | |
1343 BitVector::SetBitValueBitOrder($BitOrder); | |
1344 $BitVector->SetBitValueBitOrder($BitOrder); | |
1345 | |
1346 Set bit order for printing B<BitVector> values during stringification of B<BitVector> object. | |
1347 Possible bit order values: I<Ascending or Descending>. | |
1348 | |
1349 Bit order can be set for either an individual B<BitVector> object or the class. Default is | |
1350 to print bits in each byte in I<Asscending> bit order. | |
1351 | |
1352 Internally, bits are stored in I<Ascending> bit order using Perl vec function. Regardless | |
1353 of machine order, big-endian or little-endian, vec function always considers first | |
1354 string byte as the lowest byte and first bit within each byte as the lowest bit. | |
1355 | |
1356 =item B<SetBitValuePrintFormat> | |
1357 | |
1358 BitVector::SetBitValuePrintFormat($PrintValueFormat); | |
1359 $BitVector->SetBitValuePrintFormat($PrintValueFormat); | |
1360 | |
1361 Set bit values print format for printing B<BitVector> values during stringification of B<BitVector> | |
1362 object. Possible print format values: I<Binary, Bin, Hexadecimal, Hex, Decimal, Dec, Octal, | |
1363 Oct, RawBinary, RawBin>. Default: I<Binary>. | |
1364 | |
1365 Bit values print format can be set for either an individual B<BitVector> object or the class. | |
1366 | |
1367 =item B<SetBits> | |
1368 | |
1369 $BitVector->SetBits(@BitNums); | |
1370 | |
1371 Set specified bit numbers I<BitNums> to 1 in I<BitVector> object and return I<BitVector>. | |
1372 | |
1373 =item B<SetBitsAsBinaryString> | |
1374 | |
1375 $BitVector->SetBitsAsBinaryString($BinaryString); | |
1376 | |
1377 Set bit values in I<BitVector> using specified I<BinaryString> and return I<BitVector>. The | |
1378 size of I<BitVector> is not changed. | |
1379 | |
1380 =item B<SetBitsAsDecimalString> | |
1381 | |
1382 $BitVector->SetBitsAsDecimalString($DecimalString, [$BitOrder]); | |
1383 | |
1384 Set bit values in I<BitVector> using specified I<DecimalString> and return I<BitVector>. The | |
1385 size of I<BitVector> is not changed. | |
1386 | |
1387 =item B<SetBitsAsHexadecimalString> | |
1388 | |
1389 $BitVector->SetBitsAsHexadecimalString($HexadecimalString, [$BitOrder]); | |
1390 | |
1391 Set bit values in I<BitVector> using specified I<HexadecimalString> and return I<BitVector>. The | |
1392 size of I<BitVector> is not changed. | |
1393 | |
1394 =item B<SetBitsAsOctalString> | |
1395 | |
1396 $BitVector->SetBitsAsOctalString($OctalString, [$BitOrder]); | |
1397 | |
1398 Set bit values in I<BitVector> using specified I<OctalString> and return I<BitVector>. The | |
1399 size of I<BitVector> is not changed. | |
1400 | |
1401 =item B<SetBitsAsRawBinaryString> | |
1402 | |
1403 $BitVector->SetBitsAsRawBinaryString($RawBinaryString); | |
1404 | |
1405 Set bit values in I<BitVector> using specified I<RawBinaryString> and return I<BitVector>. The | |
1406 size of I<BitVector> is not changed. | |
1407 | |
1408 =item B<SetBitsRange> | |
1409 | |
1410 $BitVector->SetBitsRange($MinBitNum, $MaxBitNum); | |
1411 | |
1412 Set specified bit numbers between I<MinBitNum> and I<MaxBitNum> to 1 in I<BitVector> | |
1413 object and return I<BitVector>. | |
1414 | |
1415 =item B<StringifyBitVector> | |
1416 | |
1417 $String = $BitVector->StringifyBitVector(); | |
1418 | |
1419 Returns a string containing information about I<BitVector> object. | |
1420 | |
1421 =back | |
1422 | |
1423 =head1 AUTHOR | |
1424 | |
1425 Manish Sud <msud@san.rr.com> | |
1426 | |
1427 =head1 SEE ALSO | |
1428 | |
1429 Vector.pm | |
1430 | |
1431 =head1 COPYRIGHT | |
1432 | |
1433 Copyright (C) 2015 Manish Sud. All rights reserved. | |
1434 | |
1435 This file is part of MayaChemTools. | |
1436 | |
1437 MayaChemTools is free software; you can redistribute it and/or modify it under | |
1438 the terms of the GNU Lesser General Public License as published by the Free | |
1439 Software Foundation; either version 3 of the License, or (at your option) | |
1440 any later version. | |
1441 | |
1442 =cut |