annotate mayachemtools/lib/BitVector.pm @ 2:dfff2614510e draft

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