summaryrefslogtreecommitdiff
path: root/lib/omega/src/pres_form.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/omega/src/pres_form.cc')
-rw-r--r--lib/omega/src/pres_form.cc147
1 files changed, 147 insertions, 0 deletions
diff --git a/lib/omega/src/pres_form.cc b/lib/omega/src/pres_form.cc
new file mode 100644
index 0000000..82b710b
--- /dev/null
+++ b/lib/omega/src/pres_form.cc
@@ -0,0 +1,147 @@
+#include <omega/pres_form.h>
+#include <omega/pres_tree.h>
+#include <omega/pres_conj.h>
+#include <omega/Relation.h>
+#include <omega/omega_i.h>
+
+namespace omega {
+
+//
+// Children and parents.
+//
+void Formula::remove_child(Formula *kid) {
+ assert(&kid->parent() == this);
+ if (myChildren.front() == kid)
+ myChildren.del_front();
+ else {
+ List_Iterator<Formula*> j,k;
+ for(j=List_Iterator<Formula*>(myChildren); *j != kid && j; k=j, j++)
+ ;
+
+ if (k)
+ myChildren.del_after(k);
+ else
+ assert(0 && "Child to be removed not found in child list");
+ }
+}
+
+
+void Formula::add_child(Formula *kid) {
+ assert(can_add_child());
+ myChildren.append(kid);
+ kid->myParent = this;
+ kid->myRelation = this->relation();
+}
+
+void Formula::replace_child(Formula *child, Formula* new_child) {
+ assert(&child->parent() == this);
+ for(List_Iterator<Formula *> LI(myChildren); LI; LI++)
+ if(*LI == child) {
+ *LI = new_child;
+ new_child->myParent = this;
+ new_child->myRelation = this->relation();
+ break;
+ }
+}
+
+void Formula::set_parent(Formula *parent, Rel_Body *reln) {
+ myParent = parent;
+ myRelation = reln;
+ for(List_Iterator<Formula*> c(myChildren); c; c++)
+ (*c)->set_parent(this,reln);
+}
+
+//
+// Function that sets myRelation pointers in a tree.
+//
+void Formula::set_relation(Rel_Body *r) {
+ myRelation = r;
+ for(List_Iterator<Formula *> FI(myChildren); FI; FI++)
+ (*FI)->set_relation(r);
+}
+
+
+//
+// Function that descends to conjuncts to merge columns
+//
+void Formula::combine_columns() {
+ foreach(child,Formula *,myChildren,child->combine_columns());
+}
+
+
+void Formula::finalize() {
+ for(List_Iterator<Formula*> c(children()); c; c++)
+ (*c)->finalize();
+}
+
+bool Formula::can_add_child() {
+ return true;
+}
+
+
+
+Conjunct *Formula::really_conjunct() {
+ assert(0 && "really_conjunct() called on something that wasn't");
+ return NULL;
+}
+
+Formula::Formula(Formula *p, Rel_Body *r): myParent(p), myRelation(r) {
+}
+
+
+void Formula::verify_tree() { // should be const
+#if ! defined NDEBUG
+ Any_Iterator<Formula*> c = myChildren.any_iterator();
+ for (; c; c++) {
+ assert((*c)->myParent==this);
+ assert((*c)->myRelation==this->myRelation);
+ (*c)->verify_tree();
+ }
+#endif
+}
+
+Formula *Formula::copy(Formula *, Rel_Body *) {
+ assert(0);
+ return NULL;
+}
+
+Formula::~Formula() {
+ for(List_Iterator<Formula*> c(myChildren); c; c++) {
+ delete *c;
+ }
+ myChildren.clear();
+}
+
+void Formula::assert_not_finalized() {
+ if (!skip_finalization_check) {
+ assert(! relation()->is_finalized());
+ assert(! relation()->is_shared());
+ }
+}
+
+void Formula::reverse_leading_dir_info() {
+ for(List_Iterator<Formula*> c(myChildren); c; c++)
+ (*c)->reverse_leading_dir_info();
+}
+
+void Formula::invalidate_leading_info(int changed) {
+ for(List_Iterator<Formula*> c(myChildren); c; c++)
+ (*c)->invalidate_leading_info(changed);
+}
+
+void Formula::enforce_leading_info(int guaranteed, int possible, int dir) {
+ for(List_Iterator<Formula*> c(myChildren); c; c++)
+ (*c)->enforce_leading_info(guaranteed, possible, dir);
+}
+
+//
+// Push_exists functions.
+// Push exists takes responsibility for the Variable_ID's in the Tuple.
+// It should:
+// * Re-use them, or
+// * Delete them.
+void Formula::push_exists(Variable_ID_Tuple &) {
+ assert(0);
+}
+
+} // namespace