SheafSystem  0.0.0.0
zn_to_bool.cc
1 
2 //
3 // Copyright (c) 2014 Limit Point Systems, Inc.
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 
18 // Implementation for class ZN_TO_BOOL
19 
20 
21 #include "SheafSystem/zn_to_bool.h"
22 #include "SheafSystem/assert_contract.h"
23 #include "SheafSystem/block.h"
24 #include "SheafSystem/error_message.h"
25 #include "SheafSystem/std_iomanip.h"
26 
27 using namespace std;
28 
29 // ===========================================================
30 // ZN_TO_BOOL FACET
31 // ===========================================================
32 
34 bool
36 invariant() const
37 {
38  bool result = true;
39 
40  // Positive upper bound.
41 
42  invariance(ub() >= 0);
43 
44  // Ct and ub are synonomous in this class.
45 
46  invariance(ct() == ub());
47 
48  return result;
49 }
50 
54 {
55  // Preconditions:
56 
57 
58  // Body:
59 
60  _ub = 0;
61  _word_ub = 0;
62  _values = 0;
63  _values_ub = 0;
64 
65  // Postconditions:
66 
67  ensure(ub() == 0);
68 
69  // Exit:
70 
71  return;
72 }
73 
74 
77 zn_to_bool(const zn_to_bool& xother)
78 {
79 
80  // Preconditions:
81 
82  // Body:
83 
84  _ub = xother._ub;
85  _word_ub = xother._word_ub;
86  _values_ub = xother._values_ub;
87 
88  if(_values_ub > 0)
89  {
90  _values = new word_t[_values_ub];
91  }
92  else
93  {
94  _values = 0;
95  }
96 
97  const_cast<zn_to_bool&>(xother).equal_pa(this);
98 
99  // Postconditions:
100 
101  ensure(invariant());
102  ensure(is_equal_to(&xother));
103 
104 }
105 
106 
109 zn_to_bool(int xub, bool xinitialize)
110 {
111 
112  // Preconditions:
113 
114  require(xub >= 0);
115 
116  // Body:
117 
118  _ub = xub;
119 
120  _word_ub = (_ub+BITS_PER_WORD-1)/BITS_PER_WORD;
121  _values_ub = _word_ub;
122 
123  _values = _values_ub > 0 ? new word_t[_values_ub] : 0;
124 
125  if(xub > 0 && xinitialize)
126  {
127  // initialize to false
128 
129  make_false_sa();
130  }
131 
132  // postconditions:
133 
134  ensure(invariant());
135  ensure((xub > 0 && xinitialize) ? is_false() : true);
136 
137 }
138 
141 zn_to_bool(int xub, unsigned* values)
142 {
143 
144  // preconditions:
145 
146  require(xub > 0);
147  require(values != 0);
148 
149  // body:
150 
151  _ub = xub;
152 
153  _word_ub = (_ub+BITS_PER_WORD-1)/BITS_PER_WORD;
154  _values_ub = _word_ub;
155 
156  _values = new word_t[_values_ub];
157 
158  if (_values != 0)
159  {
160  // bit storage created successfully; initialize
161  for (int i = 0; i < _values_ub; ++i)
162  _values[i] = values[i];
163  }
164 
165  // postconditions:
166 
167  ensure(invariant());
168 
169 }
170 
171 
175 {
176  if(_values != 0)
177  {
178  delete [] _values;
179  }
180 
181 }
182 
183 // ===========================================================
184 // DOMAIN FACET
185 // ===========================================================
186 
187 
188 
190 bool
193 {
194  bool result;
195 
196  // Preconditions:
197 
198  // Body:
199 
200  result = _values != 0;
201 
202  // Postconditions:
203 
204  // Exit
205 
206  return(result);
207 }
208 
209 
210 
212 int
214 ub() const
215 {
216 
217  // body:
218 
219  int result = _ub;
220 
221  // postconditions:
222 
223  ensure(result >= 0);
224 
225  return result;
226 }
227 
228 
229 
231 bool
233 index_in_bounds(int i) const
234 {
235  bool result;
236 
237  // Preconditions:
238 
239  // Body:
240 
241  result = (0 <= i) && (i < _ub);
242 
243  // Postconditions:
244 
245  ensure( result == ((0 <= i) && (i < ub())) );
246 
247  // Exit
248 
249  return result;
250 }
251 
252 
253 
255 bool
257 index_in_bounds(const block<int>* indices) const
258 {
259  bool result = true;
260  int i = 0;
261 
262  // Preconditions:
263 
264  // Body:
265 
266  while( (i<indices->ct()) && result)
267  {
268  result = index_in_bounds((*indices)[i]);
269  i++;
270  }
271 
272 
273  // Postconditions:
274 
275  // postcondition: for all i in indices: index_in_bounds(i)
276 
277  // Exit
278 
279  return result;
280 }
281 
282 
283 
285 int
287 ct() const
288 {
289 
290  // body:
291 
292  int result = _ub;
293 
294  // postconditions:
295 
296  ensure(result >= 0);
297 
298  return result;
299 }
300 
301 
302 
304 int
306 true_ct() const
307 {
308  int result = 0;
309  int j = 0;
310  word_t* word_ptr = _values;
311  word_t mask = 1;
312 
313 
314  // body:
315 
316  for(int i=0; i<_ub; i++)
317  {
318  if( *word_ptr & mask )
319  result++;
320 
321  if(j < BITS_PER_WORD - 1)
322  {
323  j++;
324  mask = mask << 1;
325  }
326  else
327  {
328  j = 0;
329  mask = 1;
330  word_ptr++;
331  };
332  }
333 
334  // postconditions:
335 
336  ensure(result >= 0);
337 
338  return result;
339 }
340 
341 
342 
344 int
346 false_ct() const
347 {
348  // body:
349 
350  int result = ct() - true_ct();
351 
352  // postconditions:
353 
354  ensure(result == ct() - true_ct());
355 
356  return result;
357 }
358 
360 void
362 extend_to(int xub)
363 {
364  // Preconditions:
365 
366  require(xub > 0);
367 
368  // Body:
369 
370  if (xub > ub())
371  {
372 
373  // Calculate number of words needed.
374 
375  _word_ub = (xub + BITS_PER_WORD -1)/BITS_PER_WORD;
376 
377  if(_word_ub > _values_ub)
378  {
379  // We need to allocate more storage.
380  // Need to at least double in order to keep
381  // amortized cost of copying linear.
382 
383  int new_values_ub = (_word_ub > 2*_values_ub) ? _word_ub : 2*_values_ub;
384 
385  // Try to allocate new storage
386 
387  word_t* new_values = new word_t[new_values_ub];
388 
389  if(new_values != 0)
390  {
391  // allocation succeeded; copy data to new storage
392 
393  for(int i=0; i<_values_ub; i++)
394  {
395  *(new_values+i) = *(_values+i);
396  }
397 
398  // initialize remainder of words to false
399 
400  for(int i=_values_ub; i<new_values_ub; i++)
401  {
402  *(new_values+i) = (word_t)0;
403  }
404 
405  // deallocate old storage
406 
407  delete [] _values;
408 
409  // hook new storage into object
410 
411  _values = new_values;
412  _values_ub = new_values_ub;
413 
414  } // end if new values
415  else
416  {
417  // Failed to allocate.
418 
419  post_fatal_error_message("Unable to allocate memory.");
420  }
421  } // end if _word_ub
422 
423  assertion(_word_ub <= _values_ub);
424 
425  _ub = xub;
426 
427  } // end if xub > ub()
428  else
429  {
430  // Do nothing
431  }
432 
433 
434 
435  // Postconditions:
436 
437  ensure(invariant());
438  ensure( ub() >= xub );
439 
440  // Exit
441 
442  return;
443 }
444 
445 
446 
448 size_t
450 capacity() const
451 {
452  size_t result;
453 
454  // Preconditions:
455 
456 
457  // Body
458 
459  result = _values_ub*BITS_PER_WORD;
460 
461  // Postconditions:
462 
463 
464  // Exit:
465 
466  return result;
467 }
468 
469 
470 // ===========================================================
471 // CHARACTERISTIC FUNCTION FACET
472 // ===========================================================
473 
475 bool
477 is_true_for(const block<int>* indices) const
478 {
479  bool result = true;
480 
481  // Preconditions:
482 
483  require(index_in_bounds(indices));
484 
485  // Body:
486 
487  int i = (*indices)[0];
488 
489  while( (i<indices->ct()) && result )
490  {
491  result = (*this)[(*indices)[i]] && result;
492  i++;
493  }
494 
495 
496  // Postconditions:
497 
498  // Exit
499 
500  return result;
501 }
502 
503 
505 bool
507 is_false_for(const block<int>* indices) const
508 {
509  bool result = true;
510 
511  // Preconditions:
512 
513  require(index_in_bounds(indices));
514 
515  // Body:
516 
517  int i = (*indices)[0];
518 
519  while( (i<indices->ct()) && result )
520  {
521  result = !((*this)[(*indices)[i]]) && result;
522  i++;
523  }
524 
525 
526  // Postconditions:
527 
528  // Exit
529 
530  return result;
531 }
532 
533 
535 void
537 put(int xindex, bool val)
538 {
539 
540  // Preconditions:
541 
542  require(index_in_bounds(xindex));
543 
544  // Body:
545 
546  if (val)
547  {
548  // set value true
549  get_word(xindex) |= get_mask(xindex);
550  }
551  else
552  {
553  // set value false
554 
555  get_word(xindex) &= ~get_mask(xindex);
556  }
557 
558  // Postconditions:
559 
560  ensure(invariant());
561  ensure((*this)[xindex] == val);
562 
563  // Exit
564 
565 }
566 
568 void
570 put(const block<int>* indices, bool val)
571 {
572 
573  // Preconditions:
574 
575  require(indices != 0);
576  require( index_in_bounds(indices) );
577 
578 
579  // Body:
580 
581  for(int i=0; i<indices->ct(); i++)
582  {
583  int j = (*indices)[i];
584  if(val)
585  {
586  get_word(j) |= get_mask(j);
587  }
588  else
589  {
590  get_word(j) &= ~get_mask(j);
591  };
592  }
593 
594  // Postconditions:
595 
596  ensure(invariant());
597  ensure(val ? is_true_for(indices) : is_false_for(indices));
598 
599  // Exit
600 
601 }
602 
603 
605 void
607 force(int xindex, bool val)
608 {
609 
610  // Preconditions:
611 
612  require(xindex >= 0);
613 
614  // Body:
615 
616  if(xindex >= _ub)
617  {
618  int lnew_ub = (xindex < 2*_ub) ? 2*_ub : xindex+1;
619  extend_to(lnew_ub);
620  }
621 
622  assertion(_ub > xindex);
623 
624  put(xindex, val);
625 
626  // Postconditions:
627 
628  ensure(invariant());
629  ensure((*this)[xindex] == val);
630 
631  // Exit
632 
633 }
634 
635 
637 void
639 put_not(int xindex)
640 {
641 
642  // Preconditions:
643 
644  require(index_in_bounds(xindex));
645 
646  // Body:
647 
648  // set value true
649 
650  word_t& w = get_word(xindex);
651  word_t m = get_mask(xindex);
652 
653  w = get_word(xindex);
654  m = get_mask(xindex);
655  w = (w | m) & ~(w & m);
656 
657  // Postconditions:
658 
659  ensure(invariant());
660  // ensure((*this)[xindex] != old (*this)[xindex]);
661 
662  // Exit
663 
664 }
665 
666 
668 void
670 put_not(const block<int>* indices)
671 {
672 
673  // Preconditions:
674 
675  require(indices != 0);
676  require( index_in_bounds(indices) );
677 
678 
679  // Body:
680 
681  for(int i=0; i<indices->ct(); i++)
682  {
683  int j = (*indices)[i];
684  word_t& w = get_word(j);
685  word_t m = get_mask(j);
686  w = (w | m) & ~(w & m);
687  }
688 
689  // Postconditions:
690 
691  ensure(invariant());
692  ensure(unexecutable("for all i in indices: (*this)[i] = ! old (*this)[i]"));
693 
694  // Exit
695 
696 }
697 
698 // ===========================================================
699 // BOOLEAN ALGEBRA FACET
700 // ===========================================================
701 
702 
703 
705 bool
707 is_true() const
708 {
709  bool result = true;
710  int i = 0;
711 
712 
713  // Preconditions:
714 
715  // Body:
716 
717  while( (i<_word_ub) && result )
718  {
719  result = ( *(_values + i) == ~(static_cast<word_t>(0)) );
720  i++;
721  }
722 
723  // Postconditions:
724 
725  // Exit
726 
727  return result;
728 }
729 
730 
731 
733 bool
735 is_false() const
736 {
737  bool result = true;
738  int i = 0;
739 
740 
741  // Preconditions:
742 
743  // Body:
744 
745  while( (i<_word_ub) && result )
746  {
747  result = ( *(_values + i) == static_cast<word_t>(0) );
748  i++;
749  }
750 
751  // Postconditions:
752 
753  // Exit
754 
755  return result;
756 }
757 
758 
759 
761 bool
763 is_equal_to(const zn_to_bool* other) const
764 {
765  bool result = true;
766  int i = 0;
767 
768 
769  // Preconditions
770 
771  require((other != 0) && (other->ub() == ub()));
772 
773  // Body:
774 
775  while( (i<_word_ub) && result )
776  {
777  result = ( *(_values + i) == *(other->_values +i) );
778  i++;
779  }
780 
781  // Postconditions:
782 
783  // Exit
784 
785  return result;
786 }
787 
789 bool
791 operator==(const zn_to_bool& other) const
792 {
793  bool result = true;
794  int i = 0;
795 
796 
797  // Preconditions
798 
799  require(other.ub() == ub());
800 
801  // Body:
802 
803  while( (i<_word_ub) && result )
804  {
805  result = ( *(_values + i) == *(other._values +i) );
806  i++;
807  }
808 
809  // Postconditions:
810 
811  // Exit
812 
813  return result;
814 }
815 
816 
817 
819 bool
821 includes(const zn_to_bool* other) const
822 {
823  bool result = true;
824  int i = 0;
825 
826 
827  // Preconditions
828 
829  require((other != 0) && (other->ub() == ub()));
830 
831  // Body:
832 
833  while( (i<_word_ub) && result )
834  {
835  word_t other_value = *(other->_values + i);
836  result = ( ( (*(_values + i)) & other_value ) == other_value );
837  i++;
838  }
839 
840  // Postconditions:
841 
842  // Exit
843 
844  return result;
845 }
846 
847 
848 
850 bool
852 is_not(const zn_to_bool* other) const
853 {
854  bool result = true;
855  int i = 0;
856 
857 
858  // Preconditions
859 
860  require((other != 0) && (other->ub() == ub()));
861 
862  // Body:
863 
864  while( (i<_word_ub) && result )
865  {
866  result = ( *(_values + i) == ~(*(other->_values +i)) );
867  i++;
868  }
869 
870  // Postconditions:
871 
872  // Exit
873 
874  return result;
875 }
876 
881 {
882  zn_to_bool* result;
883 
884  // Preconditions:
885 
886  // Body:
887 
888  result = new zn_to_bool(_ub);
889 
890  if(result != 0)
891  result->make_true_sa();
892 
893 
894  // Postconditions:
895 
896  ensure((result != 0) && result->invariant());
897  ensure(result->is_true());
898 
899  // Exit
900 
901  return(result);
902 }
903 
905 void
908 {
909  // Preconditions:
910 
911  // Body:
912 
913  for(int i=0; i<_word_ub; i++)
914  {
915  *(_values+i) = ~((word_t)0);
916  }
917 
918  // Postconditions:
919 
920  ensure(is_true());
921 
922  // Exit
923 
924  return;
925 }
926 
931 {
932  zn_to_bool* result;
933 
934  // Preconditions:
935 
936  // Body:
937 
938  result = new zn_to_bool(_ub);
939 
940  // don't need to do more, constructor ensures false
941 
942  // Postconditions:
943 
944  ensure((result != 0) && result->invariant());
945  ensure(result->is_false());
946 
947  // Exit
948 
949  return(result);
950 }
951 
953 void
956 {
957  // Preconditions:
958 
959  // Body:
960 
961  for(int i=0; i<_word_ub; i++)
962  {
963  *(_values+i) = (word_t)0;
964  }
965 
966  // Postconditions:
967 
968  ensure(is_false());
969 
970  // Exit
971 
972  return;
973 }
974 
979 {
980  zn_to_bool* result;
981 
982  // Preconditions:
983 
984  // Body:
985 
986  result = new zn_to_bool(_ub);
987 
988  if(result != 0)
989  equal_pa(result);
990 
991 
992  // Postconditions:
993 
994  ensure((result != 0) && result->invariant());
995  ensure(is_equal_to(result));
996 
997  // Exit
998 
999  return(result);
1000 }
1001 
1003 void
1005 equal_pa(const zn_to_bool* result)
1006 {
1007  // Preconditions:
1008 
1009  // Body:
1010 
1011  for(int i=0; i<_word_ub; i++)
1012  {
1013  *(result->_values+ i) = *(_values+i);
1014  }
1015 
1016  // Postconditions:
1017 
1018  ensure(is_equal_to(result));
1019 
1020  // Exit
1021 
1022  return;
1023 }
1024 
1028 operator=(const zn_to_bool& xother)
1029 {
1030  // Preconditions:
1031 
1032  // Body:
1033 
1034  if(_values != 0)
1035  {
1036  delete _values;
1037  }
1038 
1039  _ub = xother._ub;
1040  _word_ub = xother._word_ub;
1041  _values = new word_t[_word_ub];
1042 
1043  for(int i=0; i<_word_ub; i++)
1044  {
1045  _values[i] = xother._values[i];
1046  }
1047 
1048  // Postconditions:
1049 
1050  ensure(*this == xother);
1051 
1052  // Exit
1053 
1054  return *this;
1055 }
1056 
1061 {
1062  zn_to_bool* result;
1063 
1064  // Preconditions:
1065 
1066  // Body:
1067 
1068  result = new zn_to_bool(_ub);
1069 
1070  if(result != 0)
1071  b_not_pa(result);
1072 
1073 
1074  // Postconditions:
1075 
1076  ensure((result != 0) && result->invariant());
1077  ensure(is_not(result));
1078 
1079  // Exit
1080 
1081  return(result);
1082 }
1083 
1085 void
1087 b_not_pa(const zn_to_bool* result)
1088 {
1089  // Preconditions:
1090 
1091  // Body:
1092 
1093  for(int i=0; i<_word_ub; i++)
1094  {
1095  *(result->_values+ i) = ~(*(_values+i));
1096  }
1097 
1098  // Postconditions:
1099 
1100  // Exit
1101 
1102  return;
1103 }
1104 
1106 void
1109 {
1110  // Preconditions:
1111 
1112  // Body:
1113 
1114  b_not_pa(this);
1115 
1116  // Postconditions:
1117 
1118  // ensure(is_not(old this));
1119 
1120  // Exit
1121 
1122  return;
1123 }
1124 
1128 b_and(const zn_to_bool* other)
1129 {
1130  zn_to_bool* result;
1131 
1132  // Preconditions:
1133 
1134  require((other != 0) && (other->ub() == ub()));
1135 
1136  // Body:
1137 
1138  result = new zn_to_bool(_ub);
1139 
1140  if(result != 0)
1141  b_and_pa(other, result);
1142 
1143  // Postconditions:
1144 
1145  ensure((result != 0) && result->invariant());
1146 
1147  // Exit
1148 
1149  return result;
1150 }
1151 
1153 void
1155 b_and_pa(const zn_to_bool* other, zn_to_bool* result)
1156 {
1157 
1158  // Preconditions:
1159 
1160  require((other != 0));
1161  require(result != 0);
1162  require(other->ub() == result->ub());
1163 
1164  // Body:
1165 
1166  for(int i=0; i<_word_ub; i++)
1167  {
1168  *(result->_values+i) = *(_values+i) & *(other->_values+i);
1169  }
1170 
1171  // Postconditions:
1172 
1173  // Exit
1174 
1175  return;
1176 }
1177 
1179 void
1181 b_and_sa(const zn_to_bool* other)
1182 {
1183 
1184  // Preconditions:
1185 
1186  require((other != 0) && (other->ub() == ub()));
1187 
1188  // Body:
1189 
1190  b_and_pa(other, this);
1191 
1192  // Postconditions:
1193 
1194  // Exit
1195 
1196  return;
1197 }
1198 
1202 b_or(const zn_to_bool* other)
1203 {
1204  zn_to_bool* result;
1205 
1206  // Preconditions:
1207 
1208  require((other != 0) && (other->ub() == ub()));
1209 
1210  // Body:
1211 
1212  result = new zn_to_bool(_ub);
1213 
1214  if(result != 0)
1215  b_or_pa(other, result);
1216 
1217  // Postconditions:
1218 
1219  ensure((result != 0) && result->invariant());
1220 
1221  // Exit
1222 
1223  return(result);
1224 }
1225 
1227 void
1229 b_or_pa(const zn_to_bool* other, zn_to_bool* result)
1230 {
1231 
1232  // Preconditions:
1233 
1234  require((other != 0));
1235  require(result != 0);
1236  require(other->ub() == result->ub());
1237 
1238  // Body:
1239 
1240  for(int i=0; i<_word_ub; i++)
1241  {
1242  *(result->_values+i) = *(_values+i) | *(other->_values+i);
1243  }
1244 
1245  // Postconditions:
1246 
1247  // Exit
1248 
1249  return;
1250 }
1251 
1253 void
1255 b_or_sa(const zn_to_bool* other)
1256 {
1257 
1258  // Preconditions:
1259 
1260  require((other != 0) && (other->ub() == ub()));
1261 
1262  // Body:
1263 
1264  b_or_pa(other, this);
1265 
1266  // Postconditions:
1267 
1268  // Exit
1269 
1270  return;
1271 }
1272 
1276 b_and_not(const zn_to_bool* other)
1277 {
1278  zn_to_bool* result;
1279 
1280  // Preconditions:
1281 
1282  require((other != 0) && (other->ub() == ub()));
1283 
1284  // Body:
1285 
1286  result = new zn_to_bool(_ub);
1287 
1288  if(result != 0)
1289  b_and_not_pa(other, result);
1290 
1291  // Postconditions:
1292 
1293  ensure((result != 0) && result->invariant());
1294 
1295  // Exit
1296 
1297  return result;
1298 }
1299 
1301 void
1303 b_and_not_pa(const zn_to_bool* other, zn_to_bool* result)
1304 {
1305 
1306  // Preconditions:
1307 
1308  require((other != 0));
1309  require(result != 0);
1310  require(other->ub() == result->ub());
1311 
1312  // Body:
1313 
1314  for(int i=0; i<_word_ub; i++)
1315  {
1316  *(result->_values+i) = *(_values+i) & ~(*(other->_values+i));
1317  }
1318 
1319  // Postconditions:
1320 
1321  // Exit
1322 
1323  return;
1324 }
1325 
1327 void
1330 {
1331 
1332  // Preconditions:
1333 
1334  require((other != 0) && (other->ub() == ub()));
1335 
1336  // Body:
1337 
1338  b_and_not_pa(other, this);
1339 
1340  // Postconditions:
1341 
1342  // Exit
1343 
1344  return;
1345 }
1346 
1347 // ===========================================================
1348 // NON-MEMBER FUNCTIONS
1349 // ===========================================================
1350 
1351 std::ostream& sheaf::operator << (std::ostream& xos, zn_to_bool& xzn)
1352 {
1353 
1354  // Preconditions:
1355 
1356  // Body:
1357 
1358  int j = 0;
1359  zn_to_bool::word_t mask = 1;
1360  zn_to_bool::word_t* word_ptr = xzn._values;
1361 
1362  xos << endl << "word ub: " << xzn._word_ub << "; words:" << endl;
1363  int lwidth = 2*sizeof(zn_to_bool::word_t);
1364  char lfill_char = xos.fill('0');
1365 
1366  xos << hex;
1367 
1368  for (int i = 0; i < xzn._word_ub; ++i)
1369  {
1370  xos << setw(lwidth) << *(xzn._values+i) << endl;
1371  }
1372 
1373  xos << dec ;
1374  xos.fill(lfill_char);
1375 
1376  xos << endl << "bit ub: " << xzn.ub() << " bits: " << endl;
1377 
1378  for(int i=0; i < xzn.ub(); ++i)
1379  {
1380  if( *word_ptr & mask )
1381  {
1382  xos << '1';
1383  }
1384  else
1385  {
1386  xos << '0';
1387  };
1388 
1389  if(j < zn_to_bool::BITS_PER_WORD - 1)
1390  {
1391  ++j;
1392  mask = mask << 1;
1393  }
1394  else
1395  {
1396  j = 0;
1397  mask = 1;
1398  ++word_ptr;
1399  };
1400 
1401  }
1402 
1403  // Postconditions:
1404 
1405  // Exit:
1406 
1407  return xos;
1408 }
1409 
1411 size_t
1412 sheaf::deep_size(const zn_to_bool& xp, bool xinclude_shallow)
1413 {
1414  size_t result;
1415 
1416  // Preconditions:
1417 
1418  // Body:
1419 
1420  result = xinclude_shallow ? sizeof(xp) : 0;
1421 
1422  zn_to_bool& lxp = const_cast<zn_to_bool&>(xp);
1423 
1424  // Add the memory allocated for _values.
1425 
1426  if(lxp.values() != 0)
1427  {
1428  result += (lxp.word_ub())*sizeof(zn_to_bool::word_t);
1429  }
1430 
1431  // Postconditions:
1432 
1433  ensure(result >= 0);
1434 
1435  // Exit
1436 
1437  return result;
1438 }
zn_to_bool * b_and_not(const zn_to_bool *other)
This AND NOT other, auto-allocated.
Definition: zn_to_bool.cc:1276
void b_and_pa(const zn_to_bool *other, zn_to_bool *result)
This AND other, pre-allocated.
Definition: zn_to_bool.cc:1155
size_type ct() const
The number of items currently in use.
bool operator==(const zn_to_bool &other) const
True if function is equal to other evrywhere on domain.
Definition: zn_to_bool.cc:791
void b_and_not_pa(const zn_to_bool *other, zn_to_bool *result)
This AND NOT other, pre-allocated.
Definition: zn_to_bool.cc:1303
void make_false_sa()
Constant function false, self-allocated. Note on terminology: "false" is a keyword, so this function can not be just "false"
Definition: zn_to_bool.cc:955
void b_or_sa(const zn_to_bool *other)
This OR other, self-allocated.
Definition: zn_to_bool.cc:1255
STL namespace.
void put(int i, bool value)
Sets i-th member to value.
Definition: zn_to_bool.cc:537
unsigned int word_t
The type of the private, internal representation used for bits; Unsigned int is the type used in the ...
Definition: zn_to_bool.h:160
bool is_true_for(const block< int > *indices) const
True if for all i in indices: member with index i is true.
Definition: zn_to_bool.cc:477
int ub() const
The upper bound for the domain index.
Definition: zn_to_bool.cc:214
zn_to_bool * make_true()
Constant function true, auto-allocated.
Definition: zn_to_bool.cc:880
bool is_false_for(const block< int > *indices) const
True if for all i in indices: member with index i is false.
Definition: zn_to_bool.cc:507
void b_not_pa(const zn_to_bool *other)
Boolean complement, pre-allocated.
Definition: zn_to_bool.cc:1087
bool is_not(const zn_to_bool *other) const
True if function is complement of other evrywhere on domain.
Definition: zn_to_bool.cc:852
void put_not(int i)
Sets i-th member to its complement.
Definition: zn_to_bool.cc:639
~zn_to_bool()
Destructor.
Definition: zn_to_bool.cc:174
A map from Zn (the integers mod n) to bools. A characteristic function used to represent subsets of Z...
Definition: zn_to_bool.h:52
zn_to_bool()
Default constructor.
Definition: zn_to_bool.cc:53
void b_not_sa()
Boolean complement, self-allocated.
Definition: zn_to_bool.cc:1108
int ct() const
The number of members in the domain.
Definition: zn_to_bool.cc:287
bool index_in_bounds(int i) const
True if index i is in bounds for this vector.
Definition: zn_to_bool.cc:233
SHEAF_DLL_SPEC size_t deep_size(const dof_descriptor_array &xp, bool xinclude_shallow=true)
The deep size of the referenced object of type dof_descriptor_array.
zn_to_bool * equal()
OBSOLETE; use copy contructor.
Definition: zn_to_bool.cc:978
bool is_equal_to(const zn_to_bool *other) const
OBSOLETE: use operator==(const zn_to_bool&). True if function is equal to other evrywhere on domain...
Definition: zn_to_bool.cc:763
void equal_pa(const zn_to_bool *result)
OBSOLETE; use assignment operator.
Definition: zn_to_bool.cc:1005
zn_to_bool * make_false()
Constant function false, auto-allocated. Note on terminology: "false" is a keyword, so this function can not be just "false"
Definition: zn_to_bool.cc:930
bool domain_is_valid() const
True if domain properly allocated.
Definition: zn_to_bool.cc:192
zn_to_bool * b_and(const zn_to_bool *other)
This AND other, auto-allocated.
Definition: zn_to_bool.cc:1128
zn_to_bool * b_not()
Boolean complement, auto-allocated.
Definition: zn_to_bool.cc:1060
int false_ct() const
The number of members with value = false.
Definition: zn_to_bool.cc:346
void b_or_pa(const zn_to_bool *other, zn_to_bool *result)
This OR other, pre-allocated.
Definition: zn_to_bool.cc:1229
size_t capacity() const
The number of members this can extend_to() without reallocating.
Definition: zn_to_bool.cc:450
zn_to_bool * b_or(const zn_to_bool *other)
This OR other, auto-allocated.
Definition: zn_to_bool.cc:1202
int true_ct() const
The number of members with value = true.
Definition: zn_to_bool.cc:306
bool is_false() const
True if function is false evrywhere on domain.
Definition: zn_to_bool.cc:735
SHEAF_DLL_SPEC std::ostream & operator<<(std::ostream &os, const dof_descriptor_array &p)
Insert dof_descriptor_array& p into ostream& os.
bool invariant() const
Class Invariant.
Definition: zn_to_bool.cc:36
bool is_true() const
True function is true everywhere on domain.
Definition: zn_to_bool.cc:707
void b_and_sa(const zn_to_bool *other)
This AND other, self-allocated.
Definition: zn_to_bool.cc:1181
void extend_to(int xub)
Make the upper bound at least xub.
Definition: zn_to_bool.cc:362
bool includes(const zn_to_bool *other) const
True if this function is true everywhere other is true.
Definition: zn_to_bool.cc:821
zn_to_bool & operator=(const zn_to_bool &xother)
Assignment operator.
Definition: zn_to_bool.cc:1028
void b_and_not_sa(const zn_to_bool *other)
This AND NOT other, self-allocated.
Definition: zn_to_bool.cc:1329
void make_true_sa()
Constant function true, self-allocated. Note on terminology: "true" is a keyword, so this function can not be just "true"
Definition: zn_to_bool.cc:907
void force(int i, bool value)
Sets the i-th member to value, extends the upper bound if necessary.
Definition: zn_to_bool.cc:607