SheafSystem  0.0.0.0
hub_index_space_handle.cc
Go to the documentation of this file.
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 
20 
21 #include "SheafSystem/hub_index_space_handle.h"
22 #include "SheafSystem/assert_contract.h"
23 #include "SheafSystem/index_space_family.h"
24 #include "SheafSystem/primary_sum_index_space_state.h"
25 
26 // ===========================================================
27 // HUB_INDEX_SPACE_HANDLE FACET
28 // ===========================================================
29 
30 // PUBLIC MEMBER FUNCTIONS
31 
35 {
36  // Preconditions:
37 
38  // Body:
39 
40  // Postconditions:
41 
42  ensure(invariant());
43 
44  // Exit:
45 
46  return;
47 }
48 
51 {
52  // Preconditions:
53 
54  // Body:
55 
56  (*this) = xother;
57 
58  // Postconditions:
59 
60  ensure(invariant());
61  ensure((*this) == xother);
62 
63  // Exit:
64 
65  return;
66 }
67 
70  pod_type xindex)
71 {
72  // Preconditions:
73 
74  require(xid_spaces.contains(xindex));
75  require(conforms_to_state(xid_spaces, xindex));
76 
77  // Body:
78 
79  attach_to(xid_spaces, xindex);
80 
81  // Postconditions:
82 
83  ensure(invariant());
84  ensure(is_attached());
85  ensure(&id_spaces() == &xid_spaces);
86  ensure(index() == xindex);
87 
88  // Exit:
89 
90  return;
91 }
92 
95  const std::string& xname)
96 {
97  // Preconditions:
98 
99  require(xid_spaces.contains(xname));
100  require(conforms_to_state(xid_spaces, xname));
101 
102  // Body:
103 
104  attach_to(xid_spaces, xname);
105 
106  // Postconditions:
107 
108  ensure(invariant());
109  ensure(is_attached());
110  ensure(&id_spaces() == &xid_spaces);
111  ensure(name() == xname);
112 
113  // Exit:
114 
115  return;
116 }
117 
121 {
122  // Preconditions:
123 
124  require(xother.is_attached() ? conforms_to_state(xother) : true);
125 
126  // Body:
127 
128  attach_to(xother);
129 
130  // Postconditions:
131 
132  ensure(invariant());
133  ensure((*this) == xother);
134 
135  // Exit:
136 
137  return *this;
138 }
139 
142 {
143  // Preconditions:
144 
145  // Body:
146 
147  // nothing to do.
148 
149  // Postconditions:
150 
151  // Exit:
152 
153  return;
154 }
155 
156 // PROTECTED MEMBER FUNCTIONS
157 
160 {
161  // Preconditions:
162 
163  // Body:
164 
165  attach_to(&xstate);
166 
167  // Postconditions:
168 
169  ensure(invariant());
170  ensure(is_attached());
171  ensure(&state() == &xstate);
172 
173  // Exit:
174 
175  return;
176 }
177 
181 {
182  // Preconditions:
183 
184  require(is_attached());
185 
186  // Body:
187 
189  reinterpret_cast<primary_sum_index_space_state&>(*_state);
190 
191  // Postconditions:
192 
193  ensure(is_basic_query);
194 
195  // Exit:
196 
197  return result;
198 }
199 
202 state() const
203 {
204  // Preconditions:
205 
206  require(is_attached());
207 
208  // Body:
209 
210  const primary_sum_index_space_state& result =
211  reinterpret_cast<const primary_sum_index_space_state&>(*_state);
212 
213  // Postconditions:
214 
215  ensure(is_basic_query);
216 
217  // Exit:
218 
219  return result;
220 }
221 
222 // PRIVATE MEMBER FUNCTIONS
223 
224 
225 // ===========================================================
226 // PRIMARY SUM INDEX SPACE FACET
227 // ===========================================================
228 
229 // PUBLIC MEMBER FUNCTIONS
230 
234 {
235  // Preconditions:
236 
237  // Body:
238 
239  pod_index_type result = state().new_id();
240 
241  // Postconditions:
242 
243  ensure(contains(result));
244 
245  // Exit:
246 
247  return result;
248 }
249 
253 {
254  // Preconditions:
255 
256  require(is_valid_reserved_id(xid));
257 
258  // Body:
259 
260  state().new_id(xid);
261 
262  // Postconditions:
263 
264  ensure(contains(xid));
265 
266  // Exit:
267 
268  return xid;
269 }
270 
271 void
274 {
275  // Preconditions:
276 
277  // Body:
278 
279  state().delete_id(xid);
280 
281  // Postconditions:
282 
283  ensure(!contains(xid));
284 
285  // Exit:
286 
287  return;
288 }
289 
290 bool
293 {
294  // Preconditions:
295 
296  // Body:
297 
298  bool result = state().is_valid_reserved_id(xid);
299 
300  // Postconditions:
301 
302  ensure(is_basic_query);
303 
304  // Exit:
305 
306  return result;
307 }
308 
311 next_id() const
312 {
313  // Preconditions:
314 
315  // Body:
316 
317  pod_type result = state().next_id();
318 
319  // Postconditions:
320 
321  ensure(is_basic_query);
322 
323  // Exit:
324 
325  return result;
326 }
327 
331 {
332  // Preconditions:
333 
334  require(interval_is_available(next_id(), next_id()+xct));
335 
336  // Body:
337 
338  define_old_variable(size_type old_ct = ct());
339  define_old_variable(pod_type old_term_id_end = term_id_end());
340  define_old_variable(pod_type old_next_id = next_id());
341 
342  pod_type result = state().new_primary_term(xct);
343 
344  // Postconditions:
345 
346  ensure(invariant());
347  ensure(term_id_end() == old_term_id_end + 1);
348  ensure(id_spaces().contains(result));
349  ensure(interval_is_full(old_next_id, old_next_id+xct));
350  ensure(ct() == old_ct + xct);
351  ensure(next_id() == old_next_id + xct);
352 
353  // Exit:
354 
355  return result;
356 }
357 
361 {
362  // Preconditions:
363 
364  require(interval_is_available(xid, xid+xct));
365 
366  // Body:
367 
368  define_old_variable(size_type old_ct = ct());
369  define_old_variable(pod_type old_term_id_end = term_id_end());
370 
371  pod_type result = state().new_primary_term(xid, xct);
372 
373  // Postconditions:
374 
375  ensure(invariant());
376  ensure(term_id_end() == old_term_id_end + 1);
377  ensure(id_spaces().contains(result));
378  ensure(interval_is_full(xid, xid+xct));
379  ensure(ct() == old_ct + xct);
380 
381  // Exit:
382 
383  return result;
384 }
385 
386 void
389 {
390  // Preconditions:
391 
392  require(contains_term_id(xi));
393 
394  // Body:
395 
396  define_old_variable(pod_type old_term_ct = term(xi).ct());
397  define_old_variable(pod_type old_begin = term_begin(xi));
398  define_old_variable(pod_type old_end = term_end(xi));
399  define_old_variable(size_type old_ct = ct());
400  define_old_variable(pod_type old_term_id_begin = term_id_begin());
401  define_old_variable(pod_type old_term_id_end = term_id_end());
402 
403  state().remove_term(xi);
404 
405  // Postconditions:
406 
407  ensure(invariant());
408  ensure(ct() <= old_ct);
409  ensure(term_id_begin() >= old_term_id_begin);
410  ensure(term_id_end() <= old_term_id_end);
411  ensure(interval_is_empty(old_begin, old_end - 1));
412 
413  // Exit:
414 
415  return;
416 }
417 
418 void
421 {
422  // Preconditions:
423 
424  // Body:
425 
426  define_old_variable(size_type old_ct = ct());
427  define_old_variable(pod_type old_term_id_end = term_id_end());
428  define_old_variable(pod_type old_last_term_begin = term_begin(term_id_end() - 1));
429  define_old_variable(pod_type old_last_term_ct = last_term().ct());
430 
431  state().extend_last_term(xct);
432 
433  // Postconditions:
434 
435  ensure(invariant());
436  ensure(ct() == (old_ct - old_last_term_ct + xct));
437  ensure(term_id_end() == old_term_id_end);
438  ensure(interval_is_full(old_last_term_begin, old_last_term_begin + xct));
439 
440  // Exit:
441 
442  return;
443 }
444 
445 bool
447 interval_is_full(pod_type xbegin, pod_type xend) const
448 {
449  // Preconditions:
450 
451  require(xbegin < xend);
452 
453  // Body:
454 
455  bool result = state().interval_is_full(xbegin, xend);
456 
457  // Postconditions:
458 
459  ensure(is_basic_query);
460 
461  // Exit:
462 
463  return result;
464 }
465 
466 bool
469 {
470  // Preconditions:
471 
472  require(xbegin < xend);
473 
474  // Body:
475 
476  bool result = state().interval_is_empty(xbegin, xend);
477 
478  // Postconditions:
479 
480  ensure(is_basic_query);
481 
482  // Exit:
483 
484  return result;
485 }
486 
487 bool
490 {
491  // Preconditons:
492 
493  require(xbegin < xend);
494 
495  // Body:
496 
497  bool result = state().interval_is_available(xbegin, xend);
498 
499  // Postconditions:
500 
501  ensure(is_basic_query);
502 
503  // Exit:
504 
505  return result;
506 }
507 
508 // PROTECTED MEMBER FUNCTIONS
509 
510 // PRIVATE MEMBER FUNCTIONS
511 
512 
513 // ===========================================================
514 // GLUING FACET
515 // ===========================================================
516 
517 // PUBLIC MEMBER FUNCTIONS
518 
519 void
522 {
523  // Preconditions:
524 
525  require(contains_unique_rep(xid)); // Can't already be glued.
526  require(contains_rep(xrep));
527  require(term_id(xid) > term_id(xrep));
528 
529  // Body:
530 
531  state().glue(xid, xrep);
532 
533  // Postconditions:
534 
535  ensure(invariant());
536  ensure(!contains_rep(xid));
537  ensure(glued_hub_pod(xid) == xrep);
538 
539  // Exit:
540 
541  return;
542 }
543 
544 void
547 {
548  // Preconditions:
549 
550  require(contains(xid));
551  require(!contains_rep(xid));
552 
553  // Body:
554 
555  state().unglue(xid);
556 
557  // Postconditions:
558 
559  ensure(invariant());
560  ensure(contains_unique_rep(xid));
561 
562  // Exit:
563 
564  return;
565 }
566 
567 void
570 {
571  // Preconditions:
572 
573  require(contains_rep(xrep_id));
574 
575  // Body:
576 
577  state().unglue_all(xrep_id);
578 
579  // Postconditions:
580 
581  ensure(invariant());
582  ensure(contains_unique_rep(xrep_id));
583 
584  // Exit:
585 
586  return;
587 }
588 
589 bool
591 has_gluing() const
592 {
593  // Preconditions:
594 
595  // Body:
596 
597  bool result = state().has_gluing();
598 
599  // Postconditions:
600 
601  ensure(is_basic_query);
602 
603  // Exit:
604 
605  return result;
606 }
607 
608 // PROTECTED MEMBER FUNCTIONS
609 
610 // PRIVATE MEMBER FUNCTIONS
611 
612 
613 // ===========================================================
614 // GATHERED ID SPACE FACET
615 // ===========================================================
616 
617 // PUBLIC MEMBER FUNCTIONS
618 
621 new_gathered_id_space(bool xexclude_bottom)
622 {
623  // Preconditions:
624 
625  require(!has_gathered_id_space());
626 
627  // Body:
628 
629  const index_space_handle& result =
630  state().new_gathered_id_space(xexclude_bottom);
631 
632  // Postconditions:
633 
634  ensure(has_gathered_id_space());
635  ensure(gathered_id_space().is_gathered());
636  ensure(xexclude_bottom == gathered_id_space_excludes_bottom());
637 
638  // Exit:
639 
640  return result;
641 }
642 
643 void
646 {
647  // Preconditions:
648 
649  require(has_gathered_id_space());
650 
651  // Body:
652 
654 
655  // Postconditions:
656 
657  ensure(gathered_id_space().is_gathered());
658 
659  // Exit:
660 
661  return;
662 }
663 
667 {
668  // Preconditions:
669 
670  require(has_gathered_id_space());
671 
672  // Body:
673 
674  const index_space_handle& result = state().gathered_id_space();
675 
676  // Postconditions:
677 
678  ensure(is_basic_query);
679 
680  // Exit:
681 
682  return result;
683 }
684 
685 bool
688 {
689  // Preconditions:
690 
691  // Body:
692 
693  bool result = state().gathered_id_space_excludes_bottom();
694 
695  // Postconditions:
696 
697  ensure(is_basic_query);
698 
699  // Exit:
700 
701  return result;
702 }
703 
704 bool
707 {
708  // Preconditions:
709 
710  // Body:
711 
712  bool result = state().has_gathered_id_space();
713 
714  // Postconditions:
715 
716  ensure(is_basic_query);
717 
718  // Exit:
719 
720  return result;
721 }
722 
723 // PROTECTED MEMBER FUNCTIONS
724 
725 // PRIVATE MEMBER FUNCTIONS
726 
727 
728 // ===========================================================
729 // STANDARD IDS FACET
730 // ===========================================================
731 
732 // PUBLIC MEMBER FUNCTIONS
733 
734 void
737 {
738  // Preconditions:
739 
740  // Body:
741 
743 
744  // Postconditions:
745 
746  ensure(has_only_standard_ids());
747 
748  // Exit:
749 
750  return;
751 }
752 
753 bool
756 {
757  // Preconditions:
758 
759  // Body:
760 
761  bool result = state().has_only_standard_ids();
762 
763  // Postconditions:
764 
765  ensure(is_basic_query);
766 
767  // Exit:
768 
769  return result;
770 }
771 
772 void
775 {
776  // Preconditions:
777 
778  // Body:
779 
780  state().clear_ids();
781 
782  // Postconditions:
783 
784  ensure(has_only_standard_ids());
785 
786  // Exit:
787 
788  return;
789 }
790 
791 // PROTECTED MEMBER FUNCTIONS
792 
793 // PRIVATE MEMBER FUNCTIONS
794 
795 
796 // ===========================================================
797 // SUM_INDEX_SPACE_HANDLE FACET
798 // ===========================================================
799 
800 // PUBLIC MEMBER FUNCTIONS
801 
802 // PROTECTED MEMBER FUNCTIONS
803 
804 // PRIVATE MEMBER FUNCTIONS
805 
806 
807 // ===========================================================
808 // EXPLICIT_INDEX_SPACE_HANDLE FACET
809 // ===========================================================
810 
811 // PUBLIC MEMBER FUNCTIONS
812 
813 // PROTECTED MEMBER FUNCTIONS
814 
815 // PRIVATE MEMBER FUNCTIONS
816 
817 
818 // ===========================================================
819 // INDEX_SPACE_HANDLE FACET
820 // ===========================================================
821 
822 // PUBLIC MEMBER FUNCTIONS
823 
827 {
828  // Preconditions:
829 
830  require(xother.is_attached() ? conforms_to_state(xother) : true);
831 
832  // Body:
833 
834  attach_to(xother);
835 
836  // Postconditions:
837 
838  ensure(invariant());
839  ensure((*this) == xother);
840 
841  // Exit:
842 
843  return *this;
844 }
845 
848 clone() const
849 {
850  // Preconditions:
851 
852  // Body:
853 
854  hub_index_space_handle* result =
855  new hub_index_space_handle(*this);
856 
857  // Postconditions:
858 
859  ensure(result != 0);
860  ensure(is_same_type(result));
861  ensure(*result == *this);
862 
863  // Exit:
864 
865  return result;
866 }
867 
868 // PROTECTED MEMBER FUNCTIONS
869 
870 // PRIVATE MEMBER FUNCTIONS
871 
872 
873 // ===========================================================
874 // HANDLE FACET
875 // ===========================================================
876 
877 // PUBLIC MEMBER FUNCTIONS
878 
879 bool
882  pod_type xlocal_id) const
883 {
884  // Preconditions:
885 
886  require(xhost.contains(xlocal_id));
887 
888  // Body:
889 
890  bool result =
891  (dynamic_cast<primary_sum_index_space_state*>(state(xhost, xlocal_id)) != 0);
892 
893  // Postconditions:
894 
895  ensure(is_basic_query);
896 
897  // Exit:
898 
899  return result;
900 }
901 
902 // PROTECTED MEMBER FUNCTIONS
903 
904 // PRIVATE MEMBER FUNCTIONS
905 
906 
907 // ===========================================================
908 // ANY FACET
909 // ===========================================================
910 
911 // PUBLIC MEMBER FUNCTIONS
912 
913 bool
915 is_ancestor_of(const any *other) const
916 {
917  // Preconditions:
918 
919  require(other != 0);
920 
921  // Body:
922 
923  // True if other conforms to this
924 
925  bool result =
926  dynamic_cast<const hub_index_space_handle*>(other) != 0;
927 
928  // Postconditions:
929 
930  // Exit:
931 
932  return result;
933 }
934 
935 bool
937 invariant() const
938 {
939  bool result = true;
940 
941  if(invariant_check())
942  {
943  // Prevent recursive calls to invariant
944 
946 
947  // Must satisfy base class invariant
948 
949  invariance(sum_index_space_handle::invariant());
950 
951  // Invariances for this class:
952 
953  // Finished, turn invariant checking back on.
954 
956  }
957 
958  // Exit
959 
960  return result;
961 }
962 
963 // PROTECTED MEMBER FUNCTIONS
964 
965 // PRIVATE MEMBER FUNCTIONS
966 
967 
968 // ===========================================================
969 // NON-MEMBER FUNCTIONS
970 // ===========================================================
971 
972 
virtual pod_type glued_hub_pod(pod_type xid) const
The pod index in the hub id space equivalent to xid in this id space. synonym for unglued_hub_pod(xid...
bool interval_is_empty(pod_type xbegin, pod_type xend) const
True if all ids in the interval [xbegin, xend) are not in this space.
hub_index_space_handle()
Default constructor.
pod_type next_id() const
The next available id.
pod_type term_id_begin() const
Beginning index of the terms in this sum.
virtual void attach_to(pod_type xindex)
Attach to the state with index xindex in the id space family id_spaces().
virtual pod_type index() const
Index of this space.
void clear_ids()
Deallocate all non-standard ids.
pod_type term_id_end() const
Ending index of the terms in this sum.
void unglue_all(pod_type xrep_id)
Unglue all ids glued to representative xrep_id; makes each id in the equivalence class of xrep_id its...
bool has_only_standard_ids() const
True if and only if there are only standard ids.
void extend_last_term(size_type xct)
Extends the last term to ct() == xct.
pod_type next_id() const
The next available id.
void glue(pod_type xid, pod_type xrep)
Glues xid to xrep; adds xid to the equivalence class with representative member xrep.
hub_index_space_handle & operator=(const hub_index_space_handle &xother)
Assignment operator; attach this handle to the state of xother. synonym for attach_to(xother).
bool is_valid_reserved_id(pod_type xid) const
True if and only if the reserved term containing xid is already a reserved term or is available for a...
bool interval_is_empty(pod_type xbegin, pod_type xend) const
True if all ids in the interval [xbegin, xend) are not in this space.
primary_sum_index_space_state & state()
The primary sum id space state (mutable version).
bool contains_unique_rep(pod_type xhub_id) const
True if and only if hub id xhub_id is the only member of its equivalence class.
void update_gathered_id_space()
Update the gathered id space.
An abstract handle to a space of alternate integer identifiers (aliases) for a subset of a hub set of...
virtual const index_space_family & id_spaces() const
The id space family for this (const version).
bool interval_is_full(pod_type xbegin, pod_type xend) const
True if all ids in the interval [xbegin, xend) are in this space.
const index_space_handle & new_gathered_id_space(bool xexclude_bottom)
Construct a gathered id space from this id space. If xexclude_bottom, construct the id space without ...
virtual bool is_attached() const =0
True if this handle is attached to a state.
An implementation of class sum_index_space_handle that has a primary sum id space state...
void unglue_all(pod_type xrep_id)
Unglue all ids glued to representative xrep_id; makes each id in the equivalence class of xrep_id its...
virtual bool invariant() const
Class invariant.
virtual bool invariant() const
Class invariant.
Abstract base class with useful features for all objects.
Definition: any.h:39
bool interval_is_available(pod_type xbegin, pod_type xend) const
True if the ids in the interval [xbegin, xend) are available in this space.
pod_type new_primary_term(size_type xct)
Create a new primary term [next_id(), next_id()+xct). Returns the index of the term created...
pod_type term_end(pod_type xi) const
Ending id of the xi-th term.
const index_space_handle & new_gathered_id_space(bool xexclude_bottom)
Construct a gathered id space from this id space. If xexclude_bottom, construct the id space without ...
void glue(pod_type xid, pod_type xrep)
Glues xid to xrep; adds xid to the equivalence class with representative member xrep.
void extend_last_term(size_type xct)
Extends the last term to ct() == xct.
void delete_id(pod_type xid)
Deallocate the id xid in this space.
void unglue(pod_type xid)
Unglues xid; makes xid its own representative.
pod_type new_primary_term(size_type xct)
Create a new primary term [next_id(), next_id()+xct). Returns the index of the term created...
void unglue(pod_type xid)
Unglues xid; makes xid its own representative.
std::string name() const
Name of this space.
pod_index_type pod_type
The "plain old data" index type for this.
bool gathered_id_space_excludes_bottom() const
True, if the gathered id space excludes BOTTOM_INDEX.
virtual bool is_attached() const
True if this handle is attached to a state.
pod_type term_begin(pod_type xi) const
Beginning id of the xi-th term.
bool is_gathered() const
True if begin() == 0 and end() == ct().
const index_space_handle & gathered_id_space() const
The gathered id space.
unsigned long size_type
An unsigned integral type used to represent sizes and capacities.
Definition: sheaf.h:52
void update_gathered_id_space()
Update the gathered id space.
pod_type term_id(pod_type xid) const
The id of the term containing id xid.
void update_standard_ids()
Make end() the standard id end.
bool has_only_standard_ids() const
True if and only if there are only standard ids.
void clear_ids()
Deallocate all non-standard ids.
A collection of id space states. This is a virtual class with provides an interface for accessing the...
pod_type new_id()
Allocate the next available id in this space.
void disable_invariant_check() const
Disable invariant check. Intended for preventing recursive calls to invariant and for suppressing inv...
Definition: any.h:97
bool contains_term_id(pod_type xi) const
True if this map contains the xi-th term.
bool interval_is_full(pod_type xbegin, pod_type xend) const
True if all ids in the interval [xbegin, xend) are in this space.
virtual bool contains(pod_type xlocal_id) const =0
True if this collection contains the id space with local id xlocal_id.
An implemenation of class explicit_index_space_handle that has a sum id space state.
bool is_valid_reserved_id(pod_type xid) const
True if and only if the reserved term containing xid is already a reserved term or is available for a...
void delete_id(pod_type xid)
Deallocate the id xid in this space.
pod_type new_id()
Allocate the next available id in this space.
const index_space_handle & last_term() const
The last term.
bool gathered_id_space_excludes_bottom() const
True, if the gathered id space excludes BOTTOM_INDEX.
bool has_gathered_id_space() const
True, if the gathered id space exists.
bool invariant_check() const
True if invariant checking is enabled.
Definition: any.h:79
const index_space_handle & term(pod_type xi) const
The xi-th term.
bool has_gathered_id_space() const
True, if the gathered id space exists.
int_type pod_index_type
The plain old data index type.
Definition: pod_types.h:49
virtual ~hub_index_space_handle()
Destructor.
void remove_term(pod_type xi)
Remove xi-th term of this sum.
bool contains(pod_type xid) const
True, if this contains an id space with id xid.
virtual bool conforms_to_state(const index_space_collection &xhost, pod_type xlocal_id) const
True if this conforms to the handle type required by the state with local scope id xlocal_id in the h...
void update_standard_ids()
Make end() the standard id end.
virtual size_type ct() const
The number of members.
An implementation of class sum_index_space_state intended for use as the sum of the primary id spaces...
bool interval_is_available(pod_type xbegin, pod_type xend) const
True if the ids in the internal [xbegin, xend) are available in this space.
virtual hub_index_space_handle * clone() const
Virtual constructor, makes a new instance of the same type as this. If the handle is attached...
Factory and container for a family of id spaces.
bool contains_rep(pod_type xhub_id) const
True if and only if hub id xhub_id is the representative member of its equivalence class...
void remove_term(pod_type xi)
Remove xi-th term of this sum.
const index_space_handle & gathered_id_space() const
The gathered id space.
bool has_gluing() const
Ture if there is any gluing.
bool is_same_type(const any *other) const
True if other is the same type as this.
Definition: any.cc:79
virtual bool is_ancestor_of(const any *other) const
Conformance test; true if other conforms to this.
void enable_invariant_check() const
Enable invariant checking.
Definition: any.h:87
bool has_gluing() const
Ture if there is any gluing.
virtual bool contains(pod_type xid) const
True if this space contains id xid.