3 /*****************************************************************************/
5 /* Copyright (c) 1995 - 2004 by Steffen Beyer. */
6 /* All rights reserved. */
8 /* This package is free software; you can redistribute it */
9 /* and/or modify it under the same terms as Perl itself. */
11 /*****************************************************************************/
19 #include "patchlevel.h"
20 #if ((PATCHLEVEL < 4) || ((PATCHLEVEL == 4) && (SUBVERSION < 5)))
21 /* PL_na was introduced in perl5.004_05 */
27 /* GIMME_V was introduced in perl5.004 */
34 #include "BitVector.h"
37 static char *BitVector_Class = "Bit::Vector";
38 static HV *BitVector_Stash;
40 typedef SV *BitVector_Object;
41 typedef SV *BitVector_Handle;
42 typedef N_word *BitVector_Address;
43 typedef SV *BitVector_Scalar;
46 const char *BitVector_OBJECT_ERROR = "item is not a \"Bit::Vector\" object";
47 const char *BitVector_SCALAR_ERROR = "item is not a scalar";
48 const char *BitVector_STRING_ERROR = "item is not a string";
49 const char *BitVector_MIN_ERROR = "minimum index out of range";
50 const char *BitVector_MAX_ERROR = "maximum index out of range";
51 const char *BitVector_START_ERROR = "start index out of range";
52 const char *BitVector_OFFSET_ERROR = "offset out of range";
53 const char *BitVector_CHUNK_ERROR = "chunk size out of range";
54 const char *BitVector_SET_ERROR = "set size mismatch";
55 const char *BitVector_MATRIX_ERROR = "matrix size mismatch";
56 const char *BitVector_SHAPE_ERROR = "not a square matrix";
57 const char *BitVector_MEMORY_ERROR = ERRCODE_NULL;
58 const char *BitVector_INDEX_ERROR = ERRCODE_INDX;
59 const char *BitVector_ORDER_ERROR = ERRCODE_ORDR;
60 const char *BitVector_SIZE_ERROR = ERRCODE_SIZE;
63 #define BIT_VECTOR_OBJECT(ref,hdl,adr) \
66 (hdl = (BitVector_Handle)SvRV(ref)) && \
69 (SvTYPE(hdl) == SVt_PVMG) && \
70 (SvSTASH(hdl) == BitVector_Stash) && \
71 (adr = (BitVector_Address)SvIV(hdl)) )
73 #define BIT_VECTOR_SCALAR(ref,typ,var) \
74 ( ref && !(SvROK(ref)) && ((var = (typ)SvIV(ref)) | 1) )
76 #define BIT_VECTOR_STRING(ref,var) \
77 ( ref && !(SvROK(ref)) && (var = (charptr)SvPV(ref,PL_na)) )
79 #define BIT_VECTOR_BUFFER(ref,var,len) \
80 ( ref && !(SvROK(ref)) && SvPOK(ref) && \
81 (var = (charptr)SvPV(ref,PL_na)) && \
82 ((len = (N_int)SvCUR(ref)) | 1) )
85 #define BIT_VECTOR_ERROR(message) \
86 croak("Bit::Vector::%s(): %s", GvNAME(CvGV(cv)), message)
89 #define BIT_VECTOR_OBJECT_ERROR \
90 BIT_VECTOR_ERROR( BitVector_OBJECT_ERROR )
92 #define BIT_VECTOR_SCALAR_ERROR \
93 BIT_VECTOR_ERROR( BitVector_SCALAR_ERROR )
95 #define BIT_VECTOR_STRING_ERROR \
96 BIT_VECTOR_ERROR( BitVector_STRING_ERROR )
98 #define BIT_VECTOR_MIN_ERROR \
99 BIT_VECTOR_ERROR( BitVector_MIN_ERROR )
101 #define BIT_VECTOR_MAX_ERROR \
102 BIT_VECTOR_ERROR( BitVector_MAX_ERROR )
104 #define BIT_VECTOR_START_ERROR \
105 BIT_VECTOR_ERROR( BitVector_START_ERROR )
107 #define BIT_VECTOR_OFFSET_ERROR \
108 BIT_VECTOR_ERROR( BitVector_OFFSET_ERROR )
110 #define BIT_VECTOR_CHUNK_ERROR \
111 BIT_VECTOR_ERROR( BitVector_CHUNK_ERROR )
113 #define BIT_VECTOR_SET_ERROR \
114 BIT_VECTOR_ERROR( BitVector_SET_ERROR )
116 #define BIT_VECTOR_MATRIX_ERROR \
117 BIT_VECTOR_ERROR( BitVector_MATRIX_ERROR )
119 #define BIT_VECTOR_SHAPE_ERROR \
120 BIT_VECTOR_ERROR( BitVector_SHAPE_ERROR )
122 #define BIT_VECTOR_MEMORY_ERROR \
123 BIT_VECTOR_ERROR( BitVector_MEMORY_ERROR )
125 #define BIT_VECTOR_INDEX_ERROR \
126 BIT_VECTOR_ERROR( BitVector_INDEX_ERROR )
128 #define BIT_VECTOR_ORDER_ERROR \
129 BIT_VECTOR_ERROR( BitVector_ORDER_ERROR )
131 #define BIT_VECTOR_SIZE_ERROR \
132 BIT_VECTOR_ERROR( BitVector_SIZE_ERROR )
135 #define BIT_VECTOR_EXCEPTION(code) \
136 BIT_VECTOR_ERROR( BitVector_Error(code) )
139 MODULE = Bit::Vector PACKAGE = Bit::Vector PREFIX = BitVector_
149 if ((rc = BitVector_Boot()))
151 BIT_VECTOR_EXCEPTION(rc);
154 BitVector_Stash = gv_stashpv(BitVector_Class,1);
159 BitVector_Version(...)
164 if ((items >= 0) and (items <= 1))
166 string = BitVector_Version();
170 PUSHs(sv_2mortal(newSVpv((char *)string,0)));
172 else BIT_VECTOR_MEMORY_ERROR;
174 else croak("Usage: Bit::Vector->Version()");
179 BitVector_Word_Bits(...)
182 if ((items >= 0) and (items <= 1))
184 RETVAL = BitVector_Word_Bits();
186 else croak("Usage: Bit::Vector->Word_Bits()");
193 BitVector_Long_Bits(...)
196 if ((items >= 0) and (items <= 1))
198 RETVAL = BitVector_Long_Bits();
200 else croak("Usage: Bit::Vector->Long_Bits()");
207 BitVector_Create(...)
212 BitVector_Scalar arg1;
213 BitVector_Scalar arg2;
214 BitVector_Address address;
215 BitVector_Handle handle;
216 BitVector_Object reference;
222 if ((items >= 2) and (items <= 3))
225 if ( BIT_VECTOR_SCALAR(arg1,N_int,bits) )
230 if ( BIT_VECTOR_SCALAR(arg2,N_int,count) )
234 if ((list = BitVector_Create_List(bits,true,count)) != NULL)
236 EXTEND(sp,(int)count);
241 handle = newSViv((IV)address);
242 reference = sv_bless(sv_2mortal(newRV(handle)),
244 SvREFCNT_dec(handle);
245 SvREADONLY_on(handle);
248 BitVector_Destroy_List(list,0);
250 else BIT_VECTOR_MEMORY_ERROR;
253 else BIT_VECTOR_SCALAR_ERROR;
257 if ((address = BitVector_Create(bits,true)) != NULL)
259 handle = newSViv((IV)address);
260 reference = sv_bless(sv_2mortal(newRV(handle)),
262 SvREFCNT_dec(handle);
263 SvREADONLY_on(handle);
266 else BIT_VECTOR_MEMORY_ERROR;
269 else BIT_VECTOR_SCALAR_ERROR;
271 else croak("Usage: %s(class,bits[,count])", GvNAME(CvGV(cv)));
276 BitVector_new_Hex(class,bits,string)
277 BitVector_Object class
278 BitVector_Scalar bits
279 BitVector_Scalar string
282 BitVector_Address address;
283 BitVector_Handle handle;
284 BitVector_Object reference;
289 if ( BIT_VECTOR_SCALAR(bits,N_int,size) )
291 if ( BIT_VECTOR_STRING(string,pointer) )
293 if ((address = BitVector_Create(size,false)) != NULL)
295 if ((code = BitVector_from_Hex(address,pointer)))
297 BitVector_Destroy(address);
298 BIT_VECTOR_EXCEPTION(code);
302 handle = newSViv((IV)address);
303 reference = sv_bless(sv_2mortal(newRV(handle)),
305 SvREFCNT_dec(handle);
306 SvREADONLY_on(handle);
310 else BIT_VECTOR_MEMORY_ERROR;
312 else BIT_VECTOR_STRING_ERROR;
314 else BIT_VECTOR_SCALAR_ERROR;
319 BitVector_new_Bin(class,bits,string)
320 BitVector_Object class
321 BitVector_Scalar bits
322 BitVector_Scalar string
325 BitVector_Address address;
326 BitVector_Handle handle;
327 BitVector_Object reference;
332 if ( BIT_VECTOR_SCALAR(bits,N_int,size) )
334 if ( BIT_VECTOR_STRING(string,pointer) )
336 if ((address = BitVector_Create(size,false)) != NULL)
338 if ((code = BitVector_from_Bin(address,pointer)))
340 BitVector_Destroy(address);
341 BIT_VECTOR_EXCEPTION(code);
345 handle = newSViv((IV)address);
346 reference = sv_bless(sv_2mortal(newRV(handle)),
348 SvREFCNT_dec(handle);
349 SvREADONLY_on(handle);
353 else BIT_VECTOR_MEMORY_ERROR;
355 else BIT_VECTOR_STRING_ERROR;
357 else BIT_VECTOR_SCALAR_ERROR;
362 BitVector_new_Dec(class,bits,string)
363 BitVector_Object class
364 BitVector_Scalar bits
365 BitVector_Scalar string
368 BitVector_Address address;
369 BitVector_Handle handle;
370 BitVector_Object reference;
375 if ( BIT_VECTOR_SCALAR(bits,N_int,size) )
377 if ( BIT_VECTOR_STRING(string,pointer) )
379 if ((address = BitVector_Create(size,false)) != NULL)
381 if ((code = BitVector_from_Dec(address,pointer)))
383 BitVector_Destroy(address);
384 BIT_VECTOR_EXCEPTION(code);
388 handle = newSViv((IV)address);
389 reference = sv_bless(sv_2mortal(newRV(handle)),
391 SvREFCNT_dec(handle);
392 SvREADONLY_on(handle);
396 else BIT_VECTOR_MEMORY_ERROR;
398 else BIT_VECTOR_STRING_ERROR;
400 else BIT_VECTOR_SCALAR_ERROR;
405 BitVector_new_Enum(class,bits,string)
406 BitVector_Object class
407 BitVector_Scalar bits
408 BitVector_Scalar string
411 BitVector_Address address;
412 BitVector_Handle handle;
413 BitVector_Object reference;
418 if ( BIT_VECTOR_SCALAR(bits,N_int,size) )
420 if ( BIT_VECTOR_STRING(string,pointer) )
422 if ((address = BitVector_Create(size,false)) != NULL)
424 if ((code = BitVector_from_Enum(address,pointer)))
426 BitVector_Destroy(address);
427 BIT_VECTOR_EXCEPTION(code);
431 handle = newSViv((IV)address);
432 reference = sv_bless(sv_2mortal(newRV(handle)),
434 SvREFCNT_dec(handle);
435 SvREADONLY_on(handle);
439 else BIT_VECTOR_MEMORY_ERROR;
441 else BIT_VECTOR_STRING_ERROR;
443 else BIT_VECTOR_SCALAR_ERROR;
448 BitVector_Shadow(reference)
449 BitVector_Object reference
452 BitVector_Handle handle;
453 BitVector_Address address;
455 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
457 if ((address = BitVector_Shadow(address)) != NULL)
459 handle = newSViv((IV)address);
460 reference = sv_bless(sv_2mortal(newRV(handle)),
462 SvREFCNT_dec(handle);
463 SvREADONLY_on(handle);
466 else BIT_VECTOR_MEMORY_ERROR;
468 else BIT_VECTOR_OBJECT_ERROR;
473 BitVector_Clone(reference)
474 BitVector_Object reference
477 BitVector_Handle handle;
478 BitVector_Address address;
480 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
482 if ((address = BitVector_Clone(address)) != NULL)
484 handle = newSViv((IV)address);
485 reference = sv_bless(sv_2mortal(newRV(handle)),
487 SvREFCNT_dec(handle);
488 SvREADONLY_on(handle);
491 else BIT_VECTOR_MEMORY_ERROR;
493 else BIT_VECTOR_OBJECT_ERROR;
498 BitVector_Concat(Xref,Yref)
499 BitVector_Object Xref
500 BitVector_Object Yref
503 BitVector_Handle Xhdl;
504 BitVector_Address Xadr;
505 BitVector_Handle Yhdl;
506 BitVector_Address Yadr;
507 BitVector_Object reference;
508 BitVector_Handle handle;
509 BitVector_Address address;
511 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
512 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
514 if ((address = BitVector_Concat(Xadr,Yadr)) != NULL)
516 handle = newSViv((IV)address);
517 reference = sv_bless(sv_2mortal(newRV(handle)),
519 SvREFCNT_dec(handle);
520 SvREADONLY_on(handle);
523 else BIT_VECTOR_MEMORY_ERROR;
525 else BIT_VECTOR_OBJECT_ERROR;
530 BitVector_Concat_List(...)
533 BitVector_Object Xref;
534 BitVector_Handle Xhdl;
535 BitVector_Address Xadr;
536 BitVector_Object reference;
537 BitVector_Handle handle;
538 BitVector_Address address;
548 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) )
552 else if ((index != 0) or SvROK(Xref))
553 BIT_VECTOR_OBJECT_ERROR;
555 if ((address = BitVector_Create(bits,false)) != NULL)
562 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) )
564 if ((bits = bits_(Xadr)) > 0)
566 BitVector_Interval_Copy(address,Xadr,offset,0,bits);
570 else if ((index != 0) or SvROK(Xref)) BIT_VECTOR_OBJECT_ERROR;
572 handle = newSViv((IV)address);
573 reference = sv_bless(sv_2mortal(newRV(handle)),
575 SvREFCNT_dec(handle);
576 SvREADONLY_on(handle);
579 else BIT_VECTOR_MEMORY_ERROR;
584 BitVector_Size(reference)
585 BitVector_Object reference
588 BitVector_Handle handle;
589 BitVector_Address address;
591 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
593 RETVAL = bits_(address);
595 else BIT_VECTOR_OBJECT_ERROR;
602 BitVector_Resize(reference,bits)
603 BitVector_Object reference
604 BitVector_Scalar bits
607 BitVector_Handle handle;
608 BitVector_Address address;
611 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
613 if ( BIT_VECTOR_SCALAR(bits,N_int,size) )
615 address = BitVector_Resize(address,size);
616 SvREADONLY_off(handle);
617 sv_setiv(handle,(IV)address);
618 SvREADONLY_on(handle);
619 if (address == NULL) BIT_VECTOR_MEMORY_ERROR;
621 else BIT_VECTOR_SCALAR_ERROR;
623 else BIT_VECTOR_OBJECT_ERROR;
628 BitVector_DESTROY(reference)
629 BitVector_Object reference
632 BitVector_Handle handle;
633 BitVector_Address address;
635 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
637 BitVector_Destroy(address);
638 SvREADONLY_off(handle);
639 sv_setiv(handle,(IV)NULL);
640 SvREADONLY_on(handle);
642 /* else BIT_VECTOR_OBJECT_ERROR; */
647 BitVector_Copy(Xref,Yref)
648 BitVector_Object Xref
649 BitVector_Object Yref
652 BitVector_Handle Xhdl;
653 BitVector_Address Xadr;
654 BitVector_Handle Yhdl;
655 BitVector_Address Yadr;
657 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
658 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
660 BitVector_Copy(Xadr,Yadr);
662 else BIT_VECTOR_OBJECT_ERROR;
667 BitVector_Empty(reference)
668 BitVector_Object reference
671 BitVector_Handle handle;
672 BitVector_Address address;
674 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
676 BitVector_Empty(address);
678 else BIT_VECTOR_OBJECT_ERROR;
683 BitVector_Fill(reference)
684 BitVector_Object reference
687 BitVector_Handle handle;
688 BitVector_Address address;
690 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
692 BitVector_Fill(address);
694 else BIT_VECTOR_OBJECT_ERROR;
699 BitVector_Flip(reference)
700 BitVector_Object reference
703 BitVector_Handle handle;
704 BitVector_Address address;
706 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
708 BitVector_Flip(address);
710 else BIT_VECTOR_OBJECT_ERROR;
715 BitVector_Primes(reference)
716 BitVector_Object reference
719 BitVector_Handle handle;
720 BitVector_Address address;
722 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
724 BitVector_Primes(address);
726 else BIT_VECTOR_OBJECT_ERROR;
731 BitVector_Reverse(Xref,Yref)
732 BitVector_Object Xref
733 BitVector_Object Yref
736 BitVector_Handle Xhdl;
737 BitVector_Address Xadr;
738 BitVector_Handle Yhdl;
739 BitVector_Address Yadr;
741 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
742 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
744 if (bits_(Xadr) == bits_(Yadr))
746 BitVector_Reverse(Xadr,Yadr);
748 else BIT_VECTOR_SIZE_ERROR;
750 else BIT_VECTOR_OBJECT_ERROR;
755 BitVector_Interval_Empty(reference,min,max)
756 BitVector_Object reference
763 BitVector_Handle handle;
764 BitVector_Address address;
768 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
770 if ( BIT_VECTOR_SCALAR(min,N_int,lower) &&
771 BIT_VECTOR_SCALAR(max,N_int,upper) )
773 if (lower >= bits_(address)) BIT_VECTOR_MIN_ERROR;
774 else if (upper >= bits_(address)) BIT_VECTOR_MAX_ERROR;
775 else if (lower > upper) BIT_VECTOR_ORDER_ERROR;
776 else BitVector_Interval_Empty(address,lower,upper);
778 else BIT_VECTOR_SCALAR_ERROR;
780 else BIT_VECTOR_OBJECT_ERROR;
785 BitVector_Interval_Fill(reference,min,max)
786 BitVector_Object reference
793 BitVector_Handle handle;
794 BitVector_Address address;
798 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
800 if ( BIT_VECTOR_SCALAR(min,N_int,lower) &&
801 BIT_VECTOR_SCALAR(max,N_int,upper) )
803 if (lower >= bits_(address)) BIT_VECTOR_MIN_ERROR;
804 else if (upper >= bits_(address)) BIT_VECTOR_MAX_ERROR;
805 else if (lower > upper) BIT_VECTOR_ORDER_ERROR;
806 else BitVector_Interval_Fill(address,lower,upper);
808 else BIT_VECTOR_SCALAR_ERROR;
810 else BIT_VECTOR_OBJECT_ERROR;
815 BitVector_Interval_Flip(reference,min,max)
816 BitVector_Object reference
823 BitVector_Handle handle;
824 BitVector_Address address;
828 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
830 if ( BIT_VECTOR_SCALAR(min,N_int,lower) &&
831 BIT_VECTOR_SCALAR(max,N_int,upper) )
833 if (lower >= bits_(address)) BIT_VECTOR_MIN_ERROR;
834 else if (upper >= bits_(address)) BIT_VECTOR_MAX_ERROR;
835 else if (lower > upper) BIT_VECTOR_ORDER_ERROR;
836 else BitVector_Interval_Flip(address,lower,upper);
838 else BIT_VECTOR_SCALAR_ERROR;
840 else BIT_VECTOR_OBJECT_ERROR;
845 BitVector_Interval_Reverse(reference,min,max)
846 BitVector_Object reference
851 BitVector_Handle handle;
852 BitVector_Address address;
856 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
858 if ( BIT_VECTOR_SCALAR(min,N_int,lower) &&
859 BIT_VECTOR_SCALAR(max,N_int,upper) )
861 if (lower >= bits_(address)) BIT_VECTOR_MIN_ERROR;
862 else if (upper >= bits_(address)) BIT_VECTOR_MAX_ERROR;
863 else if (lower > upper) BIT_VECTOR_ORDER_ERROR;
864 else BitVector_Interval_Reverse(address,lower,upper);
866 else BIT_VECTOR_SCALAR_ERROR;
868 else BIT_VECTOR_OBJECT_ERROR;
873 BitVector_Interval_Scan_inc(reference,start)
874 BitVector_Object reference
875 BitVector_Scalar start
878 BitVector_Handle handle;
879 BitVector_Address address;
884 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
886 if ( BIT_VECTOR_SCALAR(start,N_int,first) )
888 if (first < bits_(address))
890 if ( BitVector_interval_scan_inc(address,first,&min,&max) )
893 PUSHs(sv_2mortal(newSViv((IV)min)));
894 PUSHs(sv_2mortal(newSViv((IV)max)));
896 /* else return empty list */
898 else BIT_VECTOR_START_ERROR;
900 else BIT_VECTOR_SCALAR_ERROR;
902 else BIT_VECTOR_OBJECT_ERROR;
907 BitVector_Interval_Scan_dec(reference,start)
908 BitVector_Object reference
909 BitVector_Scalar start
912 BitVector_Handle handle;
913 BitVector_Address address;
918 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
920 if ( BIT_VECTOR_SCALAR(start,N_int,first) )
922 if (first < bits_(address))
924 if ( BitVector_interval_scan_dec(address,first,&min,&max) )
927 PUSHs(sv_2mortal(newSViv((IV)min)));
928 PUSHs(sv_2mortal(newSViv((IV)max)));
930 /* else return empty list */
932 else BIT_VECTOR_START_ERROR;
934 else BIT_VECTOR_SCALAR_ERROR;
936 else BIT_VECTOR_OBJECT_ERROR;
941 BitVector_Interval_Copy(Xref,Yref,Xoffset,Yoffset,length)
942 BitVector_Object Xref
943 BitVector_Object Yref
944 BitVector_Scalar Xoffset
945 BitVector_Scalar Yoffset
946 BitVector_Scalar length
949 BitVector_Handle Xhdl;
950 BitVector_Address Xadr;
951 BitVector_Handle Yhdl;
952 BitVector_Address Yadr;
957 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
958 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
960 if ( BIT_VECTOR_SCALAR(Xoffset,N_int,Xoff) &&
961 BIT_VECTOR_SCALAR(Yoffset,N_int,Yoff) &&
962 BIT_VECTOR_SCALAR(length, N_int,len) )
964 if ((Xoff < bits_(Xadr)) and (Yoff < bits_(Yadr)))
966 if (len > 0) BitVector_Interval_Copy(Xadr,Yadr,Xoff,Yoff,len);
968 else BIT_VECTOR_OFFSET_ERROR;
970 else BIT_VECTOR_SCALAR_ERROR;
972 else BIT_VECTOR_OBJECT_ERROR;
977 BitVector_Interval_Substitute(Xref,Yref,Xoffset,Xlength,Yoffset,Ylength)
978 BitVector_Object Xref
979 BitVector_Object Yref
980 BitVector_Scalar Xoffset
981 BitVector_Scalar Xlength
982 BitVector_Scalar Yoffset
983 BitVector_Scalar Ylength
986 BitVector_Handle Xhdl;
987 BitVector_Address Xadr;
988 BitVector_Handle Yhdl;
989 BitVector_Address Yadr;
995 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
996 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
998 if ( BIT_VECTOR_SCALAR(Xoffset,N_int,Xoff) &&
999 BIT_VECTOR_SCALAR(Xlength,N_int,Xlen) &&
1000 BIT_VECTOR_SCALAR(Yoffset,N_int,Yoff) &&
1001 BIT_VECTOR_SCALAR(Ylength,N_int,Ylen) )
1003 if ((Xoff <= bits_(Xadr)) and (Yoff <= bits_(Yadr)))
1005 Xadr = BitVector_Interval_Substitute(Xadr,Yadr,Xoff,Xlen,Yoff,Ylen);
1006 SvREADONLY_off(Xhdl);
1007 sv_setiv(Xhdl,(IV)Xadr);
1008 SvREADONLY_on(Xhdl);
1009 if (Xadr == NULL) BIT_VECTOR_MEMORY_ERROR;
1011 else BIT_VECTOR_OFFSET_ERROR;
1013 else BIT_VECTOR_SCALAR_ERROR;
1015 else BIT_VECTOR_OBJECT_ERROR;
1020 BitVector_is_empty(reference)
1021 BitVector_Object reference
1024 BitVector_Handle handle;
1025 BitVector_Address address;
1027 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1029 RETVAL = BitVector_is_empty(address);
1031 else BIT_VECTOR_OBJECT_ERROR;
1038 BitVector_is_full(reference)
1039 BitVector_Object reference
1042 BitVector_Handle handle;
1043 BitVector_Address address;
1045 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1047 RETVAL = BitVector_is_full(address);
1049 else BIT_VECTOR_OBJECT_ERROR;
1056 BitVector_equal(Xref,Yref)
1057 BitVector_Object Xref
1058 BitVector_Object Yref
1061 BitVector_Handle Xhdl;
1062 BitVector_Address Xadr;
1063 BitVector_Handle Yhdl;
1064 BitVector_Address Yadr;
1066 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
1067 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
1069 if (bits_(Xadr) == bits_(Yadr))
1071 RETVAL = BitVector_equal(Xadr,Yadr);
1073 else BIT_VECTOR_SIZE_ERROR;
1075 else BIT_VECTOR_OBJECT_ERROR;
1082 BitVector_Lexicompare(Xref,Yref)
1083 BitVector_Object Xref
1084 BitVector_Object Yref
1087 BitVector_Handle Xhdl;
1088 BitVector_Address Xadr;
1089 BitVector_Handle Yhdl;
1090 BitVector_Address Yadr;
1092 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
1093 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
1095 if (bits_(Xadr) == bits_(Yadr))
1097 RETVAL = BitVector_Lexicompare(Xadr,Yadr);
1099 else BIT_VECTOR_SIZE_ERROR;
1101 else BIT_VECTOR_OBJECT_ERROR;
1108 BitVector_Compare(Xref,Yref)
1109 BitVector_Object Xref
1110 BitVector_Object Yref
1113 BitVector_Handle Xhdl;
1114 BitVector_Address Xadr;
1115 BitVector_Handle Yhdl;
1116 BitVector_Address Yadr;
1118 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
1119 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
1121 if (bits_(Xadr) == bits_(Yadr))
1123 RETVAL = BitVector_Compare(Xadr,Yadr);
1125 else BIT_VECTOR_SIZE_ERROR;
1127 else BIT_VECTOR_OBJECT_ERROR;
1134 BitVector_to_Hex(reference)
1135 BitVector_Object reference
1140 BitVector_Handle handle;
1141 BitVector_Address address;
1144 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1146 string = BitVector_to_Hex(address);
1150 PUSHs(sv_2mortal(newSVpv((char *)string,0)));
1151 BitVector_Dispose(string);
1153 else BIT_VECTOR_MEMORY_ERROR;
1155 else BIT_VECTOR_OBJECT_ERROR;
1160 BitVector_from_Hex(reference,string)
1161 BitVector_Object reference
1162 BitVector_Scalar string
1167 BitVector_Handle handle;
1168 BitVector_Address address;
1172 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1174 if ( BIT_VECTOR_STRING(string,pointer) )
1176 if ((code = BitVector_from_Hex(address,pointer)))
1177 BIT_VECTOR_EXCEPTION(code);
1179 else BIT_VECTOR_STRING_ERROR;
1181 else BIT_VECTOR_OBJECT_ERROR;
1186 BitVector_to_Bin(reference)
1187 BitVector_Object reference
1190 BitVector_Handle handle;
1191 BitVector_Address address;
1194 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1196 string = BitVector_to_Bin(address);
1200 PUSHs(sv_2mortal(newSVpv((char *)string,0)));
1201 BitVector_Dispose(string);
1203 else BIT_VECTOR_MEMORY_ERROR;
1205 else BIT_VECTOR_OBJECT_ERROR;
1210 BitVector_from_Bin(reference,string)
1211 BitVector_Object reference
1212 BitVector_Scalar string
1215 BitVector_Handle handle;
1216 BitVector_Address address;
1220 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1222 if ( BIT_VECTOR_STRING(string,pointer) )
1224 if ((code = BitVector_from_Bin(address,pointer)))
1225 BIT_VECTOR_EXCEPTION(code);
1227 else BIT_VECTOR_STRING_ERROR;
1229 else BIT_VECTOR_OBJECT_ERROR;
1234 BitVector_to_Dec(reference)
1235 BitVector_Object reference
1238 BitVector_Handle handle;
1239 BitVector_Address address;
1242 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1244 string = BitVector_to_Dec(address);
1248 PUSHs(sv_2mortal(newSVpv((char *)string,0)));
1249 BitVector_Dispose(string);
1251 else BIT_VECTOR_MEMORY_ERROR;
1253 else BIT_VECTOR_OBJECT_ERROR;
1258 BitVector_from_Dec(reference,string)
1259 BitVector_Object reference
1260 BitVector_Scalar string
1263 BitVector_Handle handle;
1264 BitVector_Address address;
1268 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1270 if ( BIT_VECTOR_STRING(string,pointer) )
1272 if ((code = BitVector_from_Dec(address,pointer)))
1273 BIT_VECTOR_EXCEPTION(code);
1275 else BIT_VECTOR_STRING_ERROR;
1277 else BIT_VECTOR_OBJECT_ERROR;
1282 BitVector_to_Enum(reference)
1283 BitVector_Object reference
1288 BitVector_Handle handle;
1289 BitVector_Address address;
1292 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1294 string = BitVector_to_Enum(address);
1298 PUSHs(sv_2mortal(newSVpv((char *)string,0)));
1299 BitVector_Dispose(string);
1301 else BIT_VECTOR_MEMORY_ERROR;
1303 else BIT_VECTOR_OBJECT_ERROR;
1308 BitVector_from_Enum(reference,string)
1309 BitVector_Object reference
1310 BitVector_Scalar string
1315 BitVector_Handle handle;
1316 BitVector_Address address;
1320 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1322 if ( BIT_VECTOR_STRING(string,pointer) )
1324 if ((code = BitVector_from_Enum(address,pointer)))
1325 BIT_VECTOR_EXCEPTION(code);
1327 else BIT_VECTOR_STRING_ERROR;
1329 else BIT_VECTOR_OBJECT_ERROR;
1334 BitVector_Bit_Off(reference,index)
1335 BitVector_Object reference
1336 BitVector_Scalar index
1339 BitVector_Handle handle;
1340 BitVector_Address address;
1343 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1345 if ( BIT_VECTOR_SCALAR(index,N_int,idx) )
1347 if (idx < bits_(address))
1349 BitVector_Bit_Off(address,idx);
1351 else BIT_VECTOR_INDEX_ERROR;
1353 else BIT_VECTOR_SCALAR_ERROR;
1355 else BIT_VECTOR_OBJECT_ERROR;
1360 BitVector_Bit_On(reference,index)
1361 BitVector_Object reference
1362 BitVector_Scalar index
1365 BitVector_Handle handle;
1366 BitVector_Address address;
1369 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1371 if ( BIT_VECTOR_SCALAR(index,N_int,idx) )
1373 if (idx < bits_(address))
1375 BitVector_Bit_On(address,idx);
1377 else BIT_VECTOR_INDEX_ERROR;
1379 else BIT_VECTOR_SCALAR_ERROR;
1381 else BIT_VECTOR_OBJECT_ERROR;
1386 BitVector_bit_flip(reference,index)
1387 BitVector_Object reference
1388 BitVector_Scalar index
1393 BitVector_Handle handle;
1394 BitVector_Address address;
1397 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1399 if ( BIT_VECTOR_SCALAR(index,N_int,idx) )
1401 if (idx < bits_(address))
1403 RETVAL = BitVector_bit_flip(address,idx);
1405 else BIT_VECTOR_INDEX_ERROR;
1407 else BIT_VECTOR_SCALAR_ERROR;
1409 else BIT_VECTOR_OBJECT_ERROR;
1416 BitVector_bit_test(reference,index)
1417 BitVector_Object reference
1418 BitVector_Scalar index
1424 BitVector_Handle handle;
1425 BitVector_Address address;
1428 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1430 if ( BIT_VECTOR_SCALAR(index,N_int,idx) )
1432 if (idx < bits_(address))
1434 RETVAL = BitVector_bit_test(address,idx);
1436 else BIT_VECTOR_INDEX_ERROR;
1438 else BIT_VECTOR_SCALAR_ERROR;
1440 else BIT_VECTOR_OBJECT_ERROR;
1447 BitVector_Bit_Copy(reference,index,bit)
1448 BitVector_Object reference
1449 BitVector_Scalar index
1450 BitVector_Scalar bit
1453 BitVector_Handle handle;
1454 BitVector_Address address;
1458 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1460 if ( BIT_VECTOR_SCALAR(index,N_int,idx) &&
1461 BIT_VECTOR_SCALAR(bit,boolean,b) )
1463 if (idx < bits_(address))
1465 BitVector_Bit_Copy(address,idx,b);
1467 else BIT_VECTOR_INDEX_ERROR;
1469 else BIT_VECTOR_SCALAR_ERROR;
1471 else BIT_VECTOR_OBJECT_ERROR;
1476 BitVector_LSB(reference,bit)
1477 BitVector_Object reference
1478 BitVector_Scalar bit
1481 BitVector_Handle handle;
1482 BitVector_Address address;
1485 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1487 if ( BIT_VECTOR_SCALAR(bit,boolean,b) )
1489 BitVector_LSB(address,b);
1491 else BIT_VECTOR_SCALAR_ERROR;
1493 else BIT_VECTOR_OBJECT_ERROR;
1498 BitVector_MSB(reference,bit)
1499 BitVector_Object reference
1500 BitVector_Scalar bit
1503 BitVector_Handle handle;
1504 BitVector_Address address;
1507 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1509 if ( BIT_VECTOR_SCALAR(bit,boolean,b) )
1511 BitVector_MSB(address,b);
1513 else BIT_VECTOR_SCALAR_ERROR;
1515 else BIT_VECTOR_OBJECT_ERROR;
1520 BitVector_lsb(reference)
1521 BitVector_Object reference
1524 BitVector_Handle handle;
1525 BitVector_Address address;
1527 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1529 RETVAL = BitVector_lsb_(address);
1531 else BIT_VECTOR_OBJECT_ERROR;
1538 BitVector_msb(reference)
1539 BitVector_Object reference
1542 BitVector_Handle handle;
1543 BitVector_Address address;
1545 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1547 RETVAL = BitVector_msb_(address);
1549 else BIT_VECTOR_OBJECT_ERROR;
1556 BitVector_rotate_left(reference)
1557 BitVector_Object reference
1560 BitVector_Handle handle;
1561 BitVector_Address address;
1563 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1565 RETVAL = BitVector_rotate_left(address);
1567 else BIT_VECTOR_OBJECT_ERROR;
1574 BitVector_rotate_right(reference)
1575 BitVector_Object reference
1578 BitVector_Handle handle;
1579 BitVector_Address address;
1581 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1583 RETVAL = BitVector_rotate_right(address);
1585 else BIT_VECTOR_OBJECT_ERROR;
1592 BitVector_shift_left(reference,carry)
1593 BitVector_Object reference
1594 BitVector_Scalar carry
1597 BitVector_Handle handle;
1598 BitVector_Address address;
1601 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1603 if ( BIT_VECTOR_SCALAR(carry,boolean,c) )
1605 RETVAL = BitVector_shift_left(address,c);
1607 else BIT_VECTOR_SCALAR_ERROR;
1609 else BIT_VECTOR_OBJECT_ERROR;
1616 BitVector_shift_right(reference,carry)
1617 BitVector_Object reference
1618 BitVector_Scalar carry
1621 BitVector_Handle handle;
1622 BitVector_Address address;
1625 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1627 if ( BIT_VECTOR_SCALAR(carry,boolean,c) )
1629 RETVAL = BitVector_shift_right(address,c);
1631 else BIT_VECTOR_SCALAR_ERROR;
1633 else BIT_VECTOR_OBJECT_ERROR;
1640 BitVector_Move_Left(reference,bits)
1641 BitVector_Object reference
1642 BitVector_Scalar bits
1645 BitVector_Handle handle;
1646 BitVector_Address address;
1649 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1651 if ( BIT_VECTOR_SCALAR(bits,N_int,cnt) )
1653 BitVector_Move_Left(address,cnt);
1655 else BIT_VECTOR_SCALAR_ERROR;
1657 else BIT_VECTOR_OBJECT_ERROR;
1662 BitVector_Move_Right(reference,bits)
1663 BitVector_Object reference
1664 BitVector_Scalar bits
1667 BitVector_Handle handle;
1668 BitVector_Address address;
1671 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1673 if ( BIT_VECTOR_SCALAR(bits,N_int,cnt) )
1675 BitVector_Move_Right(address,cnt);
1677 else BIT_VECTOR_SCALAR_ERROR;
1679 else BIT_VECTOR_OBJECT_ERROR;
1684 BitVector_Insert(reference,offset,count)
1685 BitVector_Object reference
1686 BitVector_Scalar offset
1687 BitVector_Scalar count
1690 BitVector_Handle handle;
1691 BitVector_Address address;
1695 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1697 if ( BIT_VECTOR_SCALAR(offset,N_int,off) &&
1698 BIT_VECTOR_SCALAR(count,N_int,cnt) )
1700 if (off < bits_(address))
1702 BitVector_Insert(address,off,cnt,true);
1704 else BIT_VECTOR_OFFSET_ERROR;
1706 else BIT_VECTOR_SCALAR_ERROR;
1708 else BIT_VECTOR_OBJECT_ERROR;
1713 BitVector_Delete(reference,offset,count)
1714 BitVector_Object reference
1715 BitVector_Scalar offset
1716 BitVector_Scalar count
1719 BitVector_Handle handle;
1720 BitVector_Address address;
1724 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1726 if ( BIT_VECTOR_SCALAR(offset,N_int,off) &&
1727 BIT_VECTOR_SCALAR(count,N_int,cnt) )
1729 if (off < bits_(address))
1731 BitVector_Delete(address,off,cnt,true);
1733 else BIT_VECTOR_OFFSET_ERROR;
1735 else BIT_VECTOR_SCALAR_ERROR;
1737 else BIT_VECTOR_OBJECT_ERROR;
1742 BitVector_increment(reference)
1743 BitVector_Object reference
1746 BitVector_Handle handle;
1747 BitVector_Address address;
1749 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1751 RETVAL = BitVector_increment(address);
1753 else BIT_VECTOR_OBJECT_ERROR;
1760 BitVector_decrement(reference)
1761 BitVector_Object reference
1764 BitVector_Handle handle;
1765 BitVector_Address address;
1767 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1769 RETVAL = BitVector_decrement(address);
1771 else BIT_VECTOR_OBJECT_ERROR;
1778 BitVector_add(Xref,Yref,Zref,carry)
1779 BitVector_Object Xref
1780 BitVector_Object Yref
1781 BitVector_Object Zref
1782 BitVector_Scalar carry
1785 BitVector_Handle Xhdl;
1786 BitVector_Address Xadr;
1787 BitVector_Handle Yhdl;
1788 BitVector_Address Yadr;
1789 BitVector_Handle Zhdl;
1790 BitVector_Address Zadr;
1794 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
1795 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) &&
1796 BIT_VECTOR_OBJECT(Zref,Zhdl,Zadr) )
1798 if ( BIT_VECTOR_SCALAR(carry,boolean,c) )
1800 if ((bits_(Xadr) == bits_(Yadr)) and (bits_(Xadr) == bits_(Zadr)))
1802 v = BitVector_compute(Xadr,Yadr,Zadr,false,&c);
1803 if (GIMME_V == G_ARRAY)
1806 PUSHs(sv_2mortal(newSViv((IV)c)));
1807 PUSHs(sv_2mortal(newSViv((IV)v)));
1812 PUSHs(sv_2mortal(newSViv((IV)c)));
1815 else BIT_VECTOR_SIZE_ERROR;
1817 else BIT_VECTOR_SCALAR_ERROR;
1819 else BIT_VECTOR_OBJECT_ERROR;
1824 BitVector_subtract(Xref,Yref,Zref,carry)
1825 BitVector_Object Xref
1826 BitVector_Object Yref
1827 BitVector_Object Zref
1828 BitVector_Scalar carry
1833 BitVector_Handle Xhdl;
1834 BitVector_Address Xadr;
1835 BitVector_Handle Yhdl;
1836 BitVector_Address Yadr;
1837 BitVector_Handle Zhdl;
1838 BitVector_Address Zadr;
1842 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
1843 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) &&
1844 BIT_VECTOR_OBJECT(Zref,Zhdl,Zadr) )
1846 if ( BIT_VECTOR_SCALAR(carry,boolean,c) )
1848 if ((bits_(Xadr) == bits_(Yadr)) and (bits_(Xadr) == bits_(Zadr)))
1850 v = BitVector_compute(Xadr,Yadr,Zadr,true,&c);
1851 if (GIMME_V == G_ARRAY)
1854 PUSHs(sv_2mortal(newSViv((IV)c)));
1855 PUSHs(sv_2mortal(newSViv((IV)v)));
1860 PUSHs(sv_2mortal(newSViv((IV)c)));
1863 else BIT_VECTOR_SIZE_ERROR;
1865 else BIT_VECTOR_SCALAR_ERROR;
1867 else BIT_VECTOR_OBJECT_ERROR;
1872 BitVector_inc(Xref,Yref)
1873 BitVector_Object Xref
1874 BitVector_Object Yref
1877 BitVector_Handle Xhdl;
1878 BitVector_Address Xadr;
1879 BitVector_Handle Yhdl;
1880 BitVector_Address Yadr;
1883 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
1884 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
1886 if (bits_(Xadr) == bits_(Yadr))
1888 RETVAL = BitVector_compute(Xadr,Yadr,NULL,false,&c);
1890 else BIT_VECTOR_SIZE_ERROR;
1892 else BIT_VECTOR_OBJECT_ERROR;
1899 BitVector_dec(Xref,Yref)
1900 BitVector_Object Xref
1901 BitVector_Object Yref
1904 BitVector_Handle Xhdl;
1905 BitVector_Address Xadr;
1906 BitVector_Handle Yhdl;
1907 BitVector_Address Yadr;
1910 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
1911 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
1913 if (bits_(Xadr) == bits_(Yadr))
1915 RETVAL = BitVector_compute(Xadr,Yadr,NULL,true,&c);
1917 else BIT_VECTOR_SIZE_ERROR;
1919 else BIT_VECTOR_OBJECT_ERROR;
1926 BitVector_Negate(Xref,Yref)
1927 BitVector_Object Xref
1928 BitVector_Object Yref
1933 BitVector_Handle Xhdl;
1934 BitVector_Address Xadr;
1935 BitVector_Handle Yhdl;
1936 BitVector_Address Yadr;
1938 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
1939 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
1941 if (bits_(Xadr) == bits_(Yadr))
1943 BitVector_Negate(Xadr,Yadr);
1945 else BIT_VECTOR_SIZE_ERROR;
1947 else BIT_VECTOR_OBJECT_ERROR;
1952 BitVector_Absolute(Xref,Yref)
1953 BitVector_Object Xref
1954 BitVector_Object Yref
1959 BitVector_Handle Xhdl;
1960 BitVector_Address Xadr;
1961 BitVector_Handle Yhdl;
1962 BitVector_Address Yadr;
1964 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
1965 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
1967 if (bits_(Xadr) == bits_(Yadr))
1969 BitVector_Absolute(Xadr,Yadr);
1971 else BIT_VECTOR_SIZE_ERROR;
1973 else BIT_VECTOR_OBJECT_ERROR;
1978 BitVector_Sign(reference)
1979 BitVector_Object reference
1982 BitVector_Handle handle;
1983 BitVector_Address address;
1985 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
1987 RETVAL = BitVector_Sign(address);
1989 else BIT_VECTOR_OBJECT_ERROR;
1996 BitVector_Multiply(Xref,Yref,Zref)
1997 BitVector_Object Xref
1998 BitVector_Object Yref
1999 BitVector_Object Zref
2002 BitVector_Handle Xhdl;
2003 BitVector_Address Xadr;
2004 BitVector_Handle Yhdl;
2005 BitVector_Address Yadr;
2006 BitVector_Handle Zhdl;
2007 BitVector_Address Zadr;
2010 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
2011 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) &&
2012 BIT_VECTOR_OBJECT(Zref,Zhdl,Zadr) )
2014 if ((bits_(Xadr) >= bits_(Yadr)) and (bits_(Yadr) == bits_(Zadr)))
2016 if ((code = BitVector_Multiply(Xadr,Yadr,Zadr)))
2017 BIT_VECTOR_EXCEPTION(code);
2019 else BIT_VECTOR_SIZE_ERROR;
2021 else BIT_VECTOR_OBJECT_ERROR;
2026 BitVector_Divide(Qref,Xref,Yref,Rref)
2027 BitVector_Object Qref
2028 BitVector_Object Xref
2029 BitVector_Object Yref
2030 BitVector_Object Rref
2033 BitVector_Handle Qhdl;
2034 BitVector_Address Qadr;
2035 BitVector_Handle Xhdl;
2036 BitVector_Address Xadr;
2037 BitVector_Handle Yhdl;
2038 BitVector_Address Yadr;
2039 BitVector_Handle Rhdl;
2040 BitVector_Address Radr;
2043 if ( BIT_VECTOR_OBJECT(Qref,Qhdl,Qadr) &&
2044 BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
2045 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) &&
2046 BIT_VECTOR_OBJECT(Rref,Rhdl,Radr) )
2048 if ((code = BitVector_Divide(Qadr,Xadr,Yadr,Radr)))
2049 BIT_VECTOR_EXCEPTION(code);
2051 else BIT_VECTOR_OBJECT_ERROR;
2059 BitVector_Object Uref;
2060 BitVector_Handle Uhdl;
2061 BitVector_Address Uadr;
2062 BitVector_Object Vref;
2063 BitVector_Handle Vhdl;
2064 BitVector_Address Vadr;
2065 BitVector_Object Wref;
2066 BitVector_Handle Whdl;
2067 BitVector_Address Wadr;
2068 BitVector_Object Xref;
2069 BitVector_Handle Xhdl;
2070 BitVector_Address Xadr;
2071 BitVector_Object Yref;
2072 BitVector_Handle Yhdl;
2073 BitVector_Address Yadr;
2081 if ( BIT_VECTOR_OBJECT(Uref,Uhdl,Uadr) &&
2082 BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
2083 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
2085 if ((code = BitVector_GCD(Uadr,Xadr,Yadr)))
2086 BIT_VECTOR_EXCEPTION(code);
2088 else BIT_VECTOR_OBJECT_ERROR;
2090 else if (items == 5)
2097 if ( BIT_VECTOR_OBJECT(Uref,Uhdl,Uadr) &&
2098 BIT_VECTOR_OBJECT(Vref,Vhdl,Vadr) &&
2099 BIT_VECTOR_OBJECT(Wref,Whdl,Wadr) &&
2100 BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
2101 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
2103 if ((code = BitVector_GCD2(Uadr,Vadr,Wadr,Xadr,Yadr)))
2104 BIT_VECTOR_EXCEPTION(code);
2106 else BIT_VECTOR_OBJECT_ERROR;
2108 else croak("Usage: %s(Uref[,Vref,Wref],Xref,Yref)", GvNAME(CvGV(cv)));
2113 BitVector_Power(Xref,Yref,Zref)
2114 BitVector_Object Xref
2115 BitVector_Object Yref
2116 BitVector_Object Zref
2119 BitVector_Handle Xhdl;
2120 BitVector_Address Xadr;
2121 BitVector_Handle Yhdl;
2122 BitVector_Address Yadr;
2123 BitVector_Handle Zhdl;
2124 BitVector_Address Zadr;
2127 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
2128 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) &&
2129 BIT_VECTOR_OBJECT(Zref,Zhdl,Zadr) )
2131 if ((code = BitVector_Power(Xadr,Yadr,Zadr)))
2132 BIT_VECTOR_EXCEPTION(code);
2134 else BIT_VECTOR_OBJECT_ERROR;
2139 BitVector_Block_Store(reference,buffer)
2140 BitVector_Object reference
2141 BitVector_Scalar buffer
2144 BitVector_Handle handle;
2145 BitVector_Address address;
2149 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2151 if ( BIT_VECTOR_BUFFER(buffer,string,length) )
2153 BitVector_Block_Store(address,string,length);
2155 else BIT_VECTOR_STRING_ERROR;
2157 else BIT_VECTOR_OBJECT_ERROR;
2162 BitVector_Block_Read(reference)
2163 BitVector_Object reference
2166 BitVector_Handle handle;
2167 BitVector_Address address;
2171 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2173 string = BitVector_Block_Read(address,&length);
2177 PUSHs(sv_2mortal(newSVpv((char *)string,length)));
2178 BitVector_Dispose(string);
2180 else BIT_VECTOR_MEMORY_ERROR;
2182 else BIT_VECTOR_OBJECT_ERROR;
2187 BitVector_Word_Size(reference)
2188 BitVector_Object reference
2191 BitVector_Handle handle;
2192 BitVector_Address address;
2194 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2196 RETVAL = size_(address);
2198 else BIT_VECTOR_OBJECT_ERROR;
2205 BitVector_Word_Store(reference,offset,value)
2206 BitVector_Object reference
2207 BitVector_Scalar offset
2208 BitVector_Scalar value
2211 BitVector_Handle handle;
2212 BitVector_Address address;
2216 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2218 if ( BIT_VECTOR_SCALAR(offset,N_int,off) &&
2219 BIT_VECTOR_SCALAR(value,N_int,val) )
2221 if (off < size_(address))
2223 BitVector_Word_Store(address,off,val);
2225 else BIT_VECTOR_OFFSET_ERROR;
2227 else BIT_VECTOR_SCALAR_ERROR;
2229 else BIT_VECTOR_OBJECT_ERROR;
2234 BitVector_Word_Read(reference,offset)
2235 BitVector_Object reference
2236 BitVector_Scalar offset
2239 BitVector_Handle handle;
2240 BitVector_Address address;
2243 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2245 if ( BIT_VECTOR_SCALAR(offset,N_int,off) )
2247 if (off < size_(address))
2249 RETVAL = BitVector_Word_Read(address,off);
2251 else BIT_VECTOR_OFFSET_ERROR;
2253 else BIT_VECTOR_SCALAR_ERROR;
2255 else BIT_VECTOR_OBJECT_ERROR;
2262 BitVector_Word_List_Store(reference,...)
2263 BitVector_Object reference
2266 BitVector_Handle handle;
2267 BitVector_Address address;
2268 BitVector_Scalar scalar;
2274 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2276 size = size_(address);
2277 for ( offset = 0, index = 1;
2278 ((offset < size) and (index < items)); offset++, index++ )
2281 if ( BIT_VECTOR_SCALAR(scalar,N_int,value) )
2283 BitVector_Word_Store(address,offset,value);
2285 else BIT_VECTOR_SCALAR_ERROR;
2287 for ( ; (offset < size); offset++ )
2289 BitVector_Word_Store(address,offset,0);
2292 else BIT_VECTOR_OBJECT_ERROR;
2297 BitVector_Word_List_Read(reference)
2298 BitVector_Object reference
2301 BitVector_Handle handle;
2302 BitVector_Address address;
2307 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2309 size = size_(address);
2310 EXTEND(sp,(int)size);
2311 for ( offset = 0; (offset < size); offset++ )
2313 value = BitVector_Word_Read(address,offset);
2314 PUSHs(sv_2mortal(newSViv((IV)value)));
2317 else BIT_VECTOR_OBJECT_ERROR;
2322 BitVector_Word_Insert(reference,offset,count)
2323 BitVector_Object reference
2324 BitVector_Scalar offset
2325 BitVector_Scalar count
2328 BitVector_Handle handle;
2329 BitVector_Address address;
2333 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2335 if ( BIT_VECTOR_SCALAR(offset,N_int,off) &&
2336 BIT_VECTOR_SCALAR(count,N_int,cnt) )
2338 if (off < size_(address))
2340 BitVector_Word_Insert(address,off,cnt,true);
2342 else BIT_VECTOR_OFFSET_ERROR;
2344 else BIT_VECTOR_SCALAR_ERROR;
2346 else BIT_VECTOR_OBJECT_ERROR;
2351 BitVector_Word_Delete(reference,offset,count)
2352 BitVector_Object reference
2353 BitVector_Scalar offset
2354 BitVector_Scalar count
2357 BitVector_Handle handle;
2358 BitVector_Address address;
2362 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2364 if ( BIT_VECTOR_SCALAR(offset,N_int,off) &&
2365 BIT_VECTOR_SCALAR(count,N_int,cnt) )
2367 if (off < size_(address))
2369 BitVector_Word_Delete(address,off,cnt,true);
2371 else BIT_VECTOR_OFFSET_ERROR;
2373 else BIT_VECTOR_SCALAR_ERROR;
2375 else BIT_VECTOR_OBJECT_ERROR;
2380 BitVector_Chunk_Store(reference,chunksize,offset,value)
2381 BitVector_Object reference
2382 BitVector_Scalar chunksize
2383 BitVector_Scalar offset
2384 BitVector_Scalar value
2387 BitVector_Handle handle;
2388 BitVector_Address address;
2393 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2395 if ( BIT_VECTOR_SCALAR(chunksize,N_int,bits) &&
2396 BIT_VECTOR_SCALAR(offset,N_int,off) &&
2397 BIT_VECTOR_SCALAR(value,N_long,val) )
2399 if ((bits > 0) and (bits <= BitVector_Long_Bits()))
2401 if (off < bits_(address))
2403 BitVector_Chunk_Store(address,bits,off,val);
2405 else BIT_VECTOR_OFFSET_ERROR;
2407 else BIT_VECTOR_CHUNK_ERROR;
2409 else BIT_VECTOR_SCALAR_ERROR;
2411 else BIT_VECTOR_OBJECT_ERROR;
2416 BitVector_Chunk_Read(reference,chunksize,offset)
2417 BitVector_Object reference
2418 BitVector_Scalar chunksize
2419 BitVector_Scalar offset
2422 BitVector_Handle handle;
2423 BitVector_Address address;
2427 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2429 if ( BIT_VECTOR_SCALAR(chunksize,N_int,bits) &&
2430 BIT_VECTOR_SCALAR(offset,N_int,off) )
2432 if ((bits > 0) and (bits <= BitVector_Long_Bits()))
2434 if (off < bits_(address))
2436 RETVAL = BitVector_Chunk_Read(address,bits,off);
2438 else BIT_VECTOR_OFFSET_ERROR;
2440 else BIT_VECTOR_CHUNK_ERROR;
2442 else BIT_VECTOR_SCALAR_ERROR;
2444 else BIT_VECTOR_OBJECT_ERROR;
2451 BitVector_Chunk_List_Store(reference,chunksize,...)
2452 BitVector_Object reference
2453 BitVector_Scalar chunksize
2456 BitVector_Handle handle;
2457 BitVector_Address address;
2458 BitVector_Scalar scalar;
2472 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2474 if ( BIT_VECTOR_SCALAR(chunksize,N_int,chunkspan) )
2476 if ((chunkspan > 0) and (chunkspan <= BitVector_Long_Bits()))
2478 wordsize = BitVector_Word_Bits();
2479 size = size_(address);
2480 chunkmask = ~((~0L << (chunkspan-1)) << 1); /* C bug work-around */
2487 while (offset < size)
2489 if ((chunkbits == 0) and (index < items))
2492 if ( BIT_VECTOR_SCALAR(scalar,N_long,chunk) )
2495 chunkbits = chunkspan;
2498 else BIT_VECTOR_SCALAR_ERROR;
2500 bits = wordsize - wordbits;
2501 if (chunkbits <= bits)
2505 wordbits += chunkbits;
2511 mask = ~(~0L << bits);
2519 if ((wordbits >= wordsize) or (index >= items))
2521 BitVector_Word_Store(address,offset,(N_int)value);
2528 else BIT_VECTOR_CHUNK_ERROR;
2530 else BIT_VECTOR_SCALAR_ERROR;
2532 else BIT_VECTOR_OBJECT_ERROR;
2537 BitVector_Chunk_List_Read(reference,chunksize)
2538 BitVector_Object reference
2539 BitVector_Scalar chunksize
2542 BitVector_Handle handle;
2543 BitVector_Address address;
2557 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2559 if ( BIT_VECTOR_SCALAR(chunksize,N_int,chunkspan) )
2561 if ((chunkspan > 0) and (chunkspan <= BitVector_Long_Bits()))
2563 wordsize = BitVector_Word_Bits();
2564 bits = bits_(address);
2565 size = size_(address);
2566 length = (N_int) (bits / chunkspan);
2567 if ((length * chunkspan) < bits) length++;
2568 EXTEND(sp,(int)length);
2575 while (index < length)
2577 if ((wordbits == 0) and (offset < size))
2579 value = (N_long) BitVector_Word_Read(address,offset);
2580 wordbits = wordsize;
2583 bits = chunkspan - chunkbits;
2584 if (wordbits <= bits)
2586 value <<= chunkbits;
2588 chunkbits += wordbits;
2594 mask = ~(~0L << bits);
2602 if ((chunkbits >= chunkspan) or
2603 ((offset >= size) and (chunkbits > 0)))
2605 PUSHs(sv_2mortal(newSViv((IV)chunk)));
2612 else BIT_VECTOR_CHUNK_ERROR;
2614 else BIT_VECTOR_SCALAR_ERROR;
2616 else BIT_VECTOR_OBJECT_ERROR;
2621 BitVector_Index_List_Remove(reference,...)
2622 BitVector_Object reference
2625 BitVector_Handle handle;
2626 BitVector_Address address;
2627 BitVector_Scalar scalar;
2632 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2634 bits = bits_(address);
2635 for ( index = 1; index < items; index++ )
2638 if ( BIT_VECTOR_SCALAR(scalar,N_int,value) )
2642 BitVector_Bit_Off(address,value);
2644 else BIT_VECTOR_INDEX_ERROR;
2646 else BIT_VECTOR_SCALAR_ERROR;
2649 else BIT_VECTOR_OBJECT_ERROR;
2654 BitVector_Index_List_Store(reference,...)
2655 BitVector_Object reference
2658 BitVector_Handle handle;
2659 BitVector_Address address;
2660 BitVector_Scalar scalar;
2665 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2667 bits = bits_(address);
2668 for ( index = 1; index < items; index++ )
2671 if ( BIT_VECTOR_SCALAR(scalar,N_int,value) )
2675 BitVector_Bit_On(address,value);
2677 else BIT_VECTOR_INDEX_ERROR;
2679 else BIT_VECTOR_SCALAR_ERROR;
2682 else BIT_VECTOR_OBJECT_ERROR;
2687 BitVector_Index_List_Read(reference)
2688 BitVector_Object reference
2691 BitVector_Handle handle;
2692 BitVector_Address address;
2701 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2703 size = size_(address);
2704 bits = BitVector_Word_Bits();
2705 norm = Set_Norm(address);
2708 EXTEND(sp,(int)norm);
2709 for ( base = word = 0; word < size; word++, base += bits )
2712 value = BitVector_Word_Read(address,word);
2715 if (value AND 0x0001)
2716 PUSHs(sv_2mortal(newSViv((IV)index)));
2723 else BIT_VECTOR_OBJECT_ERROR;
2727 MODULE = Bit::Vector PACKAGE = Bit::Vector PREFIX = Set_
2731 Set_Union(Xref,Yref,Zref)
2732 BitVector_Object Xref
2733 BitVector_Object Yref
2734 BitVector_Object Zref
2739 BitVector_Handle Xhdl;
2740 BitVector_Address Xadr;
2741 BitVector_Handle Yhdl;
2742 BitVector_Address Yadr;
2743 BitVector_Handle Zhdl;
2744 BitVector_Address Zadr;
2746 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
2747 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) &&
2748 BIT_VECTOR_OBJECT(Zref,Zhdl,Zadr) )
2750 if ((bits_(Xadr) == bits_(Yadr)) and (bits_(Xadr) == bits_(Zadr)))
2752 Set_Union(Xadr,Yadr,Zadr);
2754 else BIT_VECTOR_SET_ERROR;
2756 else BIT_VECTOR_OBJECT_ERROR;
2761 Set_Intersection(Xref,Yref,Zref)
2762 BitVector_Object Xref
2763 BitVector_Object Yref
2764 BitVector_Object Zref
2769 BitVector_Handle Xhdl;
2770 BitVector_Address Xadr;
2771 BitVector_Handle Yhdl;
2772 BitVector_Address Yadr;
2773 BitVector_Handle Zhdl;
2774 BitVector_Address Zadr;
2776 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
2777 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) &&
2778 BIT_VECTOR_OBJECT(Zref,Zhdl,Zadr) )
2780 if ((bits_(Xadr) == bits_(Yadr)) and (bits_(Xadr) == bits_(Zadr)))
2782 Set_Intersection(Xadr,Yadr,Zadr);
2784 else BIT_VECTOR_SET_ERROR;
2786 else BIT_VECTOR_OBJECT_ERROR;
2791 Set_Difference(Xref,Yref,Zref)
2792 BitVector_Object Xref
2793 BitVector_Object Yref
2794 BitVector_Object Zref
2799 BitVector_Handle Xhdl;
2800 BitVector_Address Xadr;
2801 BitVector_Handle Yhdl;
2802 BitVector_Address Yadr;
2803 BitVector_Handle Zhdl;
2804 BitVector_Address Zadr;
2806 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
2807 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) &&
2808 BIT_VECTOR_OBJECT(Zref,Zhdl,Zadr) )
2810 if ((bits_(Xadr) == bits_(Yadr)) and (bits_(Xadr) == bits_(Zadr)))
2812 Set_Difference(Xadr,Yadr,Zadr);
2814 else BIT_VECTOR_SET_ERROR;
2816 else BIT_VECTOR_OBJECT_ERROR;
2821 Set_ExclusiveOr(Xref,Yref,Zref)
2822 BitVector_Object Xref
2823 BitVector_Object Yref
2824 BitVector_Object Zref
2829 BitVector_Handle Xhdl;
2830 BitVector_Address Xadr;
2831 BitVector_Handle Yhdl;
2832 BitVector_Address Yadr;
2833 BitVector_Handle Zhdl;
2834 BitVector_Address Zadr;
2836 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
2837 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) &&
2838 BIT_VECTOR_OBJECT(Zref,Zhdl,Zadr) )
2840 if ((bits_(Xadr) == bits_(Yadr)) and (bits_(Xadr) == bits_(Zadr)))
2842 Set_ExclusiveOr(Xadr,Yadr,Zadr);
2844 else BIT_VECTOR_SET_ERROR;
2846 else BIT_VECTOR_OBJECT_ERROR;
2851 Set_Complement(Xref,Yref)
2852 BitVector_Object Xref
2853 BitVector_Object Yref
2858 BitVector_Handle Xhdl;
2859 BitVector_Address Xadr;
2860 BitVector_Handle Yhdl;
2861 BitVector_Address Yadr;
2863 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
2864 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
2866 if (bits_(Xadr) == bits_(Yadr))
2868 Set_Complement(Xadr,Yadr);
2870 else BIT_VECTOR_SET_ERROR;
2872 else BIT_VECTOR_OBJECT_ERROR;
2877 Set_subset(Xref,Yref)
2878 BitVector_Object Xref
2879 BitVector_Object Yref
2884 BitVector_Handle Xhdl;
2885 BitVector_Address Xadr;
2886 BitVector_Handle Yhdl;
2887 BitVector_Address Yadr;
2889 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
2890 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
2892 if (bits_(Xadr) == bits_(Yadr))
2894 RETVAL = Set_subset(Xadr,Yadr);
2896 else BIT_VECTOR_SET_ERROR;
2898 else BIT_VECTOR_OBJECT_ERROR;
2906 BitVector_Object reference
2909 BitVector_Handle handle;
2910 BitVector_Address address;
2912 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2914 RETVAL = Set_Norm(address);
2916 else BIT_VECTOR_OBJECT_ERROR;
2923 Set_Norm2(reference)
2924 BitVector_Object reference
2927 BitVector_Handle handle;
2928 BitVector_Address address;
2930 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2932 RETVAL = Set_Norm2(address);
2934 else BIT_VECTOR_OBJECT_ERROR;
2941 Set_Norm3(reference)
2942 BitVector_Object reference
2945 BitVector_Handle handle;
2946 BitVector_Address address;
2948 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2950 RETVAL = Set_Norm3(address);
2952 else BIT_VECTOR_OBJECT_ERROR;
2960 BitVector_Object reference
2963 BitVector_Handle handle;
2964 BitVector_Address address;
2966 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2968 RETVAL = Set_Min(address);
2970 else BIT_VECTOR_OBJECT_ERROR;
2978 BitVector_Object reference
2981 BitVector_Handle handle;
2982 BitVector_Address address;
2984 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
2986 RETVAL = Set_Max(address);
2988 else BIT_VECTOR_OBJECT_ERROR;
2994 MODULE = Bit::Vector PACKAGE = Bit::Vector PREFIX = Matrix_
2998 Matrix_Multiplication(Xref,Xrows,Xcols,Yref,Yrows,Ycols,Zref,Zrows,Zcols)
2999 BitVector_Object Xref
3000 BitVector_Scalar Xrows
3001 BitVector_Scalar Xcols
3002 BitVector_Object Yref
3003 BitVector_Scalar Yrows
3004 BitVector_Scalar Ycols
3005 BitVector_Object Zref
3006 BitVector_Scalar Zrows
3007 BitVector_Scalar Zcols
3010 BitVector_Handle Xhdl;
3011 BitVector_Address Xadr;
3012 BitVector_Handle Yhdl;
3013 BitVector_Address Yadr;
3014 BitVector_Handle Zhdl;
3015 BitVector_Address Zadr;
3023 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
3024 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) &&
3025 BIT_VECTOR_OBJECT(Zref,Zhdl,Zadr) )
3027 if ( BIT_VECTOR_SCALAR(Xrows,N_int,rowsX) &&
3028 BIT_VECTOR_SCALAR(Xcols,N_int,colsX) &&
3029 BIT_VECTOR_SCALAR(Yrows,N_int,rowsY) &&
3030 BIT_VECTOR_SCALAR(Ycols,N_int,colsY) &&
3031 BIT_VECTOR_SCALAR(Zrows,N_int,rowsZ) &&
3032 BIT_VECTOR_SCALAR(Zcols,N_int,colsZ) )
3034 if ((colsY == rowsZ) and (rowsX == rowsY) and (colsX == colsZ) and
3035 (bits_(Xadr) == rowsX*colsX) and
3036 (bits_(Yadr) == rowsY*colsY) and
3037 (bits_(Zadr) == rowsZ*colsZ))
3039 Matrix_Multiplication(Xadr,rowsX,colsX,
3043 else BIT_VECTOR_MATRIX_ERROR;
3045 else BIT_VECTOR_SCALAR_ERROR;
3047 else BIT_VECTOR_OBJECT_ERROR;
3052 Matrix_Product(Xref,Xrows,Xcols,Yref,Yrows,Ycols,Zref,Zrows,Zcols)
3053 BitVector_Object Xref
3054 BitVector_Scalar Xrows
3055 BitVector_Scalar Xcols
3056 BitVector_Object Yref
3057 BitVector_Scalar Yrows
3058 BitVector_Scalar Ycols
3059 BitVector_Object Zref
3060 BitVector_Scalar Zrows
3061 BitVector_Scalar Zcols
3064 BitVector_Handle Xhdl;
3065 BitVector_Address Xadr;
3066 BitVector_Handle Yhdl;
3067 BitVector_Address Yadr;
3068 BitVector_Handle Zhdl;
3069 BitVector_Address Zadr;
3077 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
3078 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) &&
3079 BIT_VECTOR_OBJECT(Zref,Zhdl,Zadr) )
3081 if ( BIT_VECTOR_SCALAR(Xrows,N_int,rowsX) &&
3082 BIT_VECTOR_SCALAR(Xcols,N_int,colsX) &&
3083 BIT_VECTOR_SCALAR(Yrows,N_int,rowsY) &&
3084 BIT_VECTOR_SCALAR(Ycols,N_int,colsY) &&
3085 BIT_VECTOR_SCALAR(Zrows,N_int,rowsZ) &&
3086 BIT_VECTOR_SCALAR(Zcols,N_int,colsZ) )
3088 if ((colsY == rowsZ) and (rowsX == rowsY) and (colsX == colsZ) and
3089 (bits_(Xadr) == rowsX*colsX) and
3090 (bits_(Yadr) == rowsY*colsY) and
3091 (bits_(Zadr) == rowsZ*colsZ))
3093 Matrix_Product(Xadr,rowsX,colsX,
3097 else BIT_VECTOR_MATRIX_ERROR;
3099 else BIT_VECTOR_SCALAR_ERROR;
3101 else BIT_VECTOR_OBJECT_ERROR;
3106 Matrix_Closure(reference,rows,cols)
3107 BitVector_Object reference
3108 BitVector_Scalar rows
3109 BitVector_Scalar cols
3112 BitVector_Handle handle;
3113 BitVector_Address address;
3117 if ( BIT_VECTOR_OBJECT(reference,handle,address) )
3119 if ( BIT_VECTOR_SCALAR(rows,N_int,r) &&
3120 BIT_VECTOR_SCALAR(cols,N_int,c) )
3122 if (bits_(address) == r*c)
3126 Matrix_Closure(address,r,c);
3128 else BIT_VECTOR_SHAPE_ERROR;
3130 else BIT_VECTOR_MATRIX_ERROR;
3132 else BIT_VECTOR_SCALAR_ERROR;
3134 else BIT_VECTOR_OBJECT_ERROR;
3139 Matrix_Transpose(Xref,Xrows,Xcols,Yref,Yrows,Ycols)
3140 BitVector_Object Xref
3141 BitVector_Scalar Xrows
3142 BitVector_Scalar Xcols
3143 BitVector_Object Yref
3144 BitVector_Scalar Yrows
3145 BitVector_Scalar Ycols
3148 BitVector_Handle Xhdl;
3149 BitVector_Address Xadr;
3150 BitVector_Handle Yhdl;
3151 BitVector_Address Yadr;
3157 if ( BIT_VECTOR_OBJECT(Xref,Xhdl,Xadr) &&
3158 BIT_VECTOR_OBJECT(Yref,Yhdl,Yadr) )
3160 if ( BIT_VECTOR_SCALAR(Xrows,N_int,rowsX) &&
3161 BIT_VECTOR_SCALAR(Xcols,N_int,colsX) &&
3162 BIT_VECTOR_SCALAR(Yrows,N_int,rowsY) &&
3163 BIT_VECTOR_SCALAR(Ycols,N_int,colsY) )
3165 if ((rowsX == colsY) and (colsX == rowsY) and
3166 (bits_(Xadr) == rowsX*colsX) and
3167 (bits_(Yadr) == rowsY*colsY))
3169 if ((Xadr != Yadr) or (rowsY == colsY))
3171 Matrix_Transpose(Xadr,rowsX,colsX,
3174 else BIT_VECTOR_SHAPE_ERROR;
3176 else BIT_VECTOR_MATRIX_ERROR;
3178 else BIT_VECTOR_SCALAR_ERROR;
3180 else BIT_VECTOR_OBJECT_ERROR;