DEADSOFTWARE

Testing odcread against a bunch of existing .odc files
[odcread.git] / fold.cc
diff --git a/fold.cc b/fold.cc
index 5cdbbb46ec12e89c40c4d1be530c937f5505e7e8..b88d24b66a303e2b0602e755cfd01c6cbcdff707 100644 (file)
--- a/fold.cc
+++ b/fold.cc
@@ -4,20 +4,12 @@
 namespace odc {
 
 const std::string View::TYPENAME("Views.View^");
-const TypeProxy<View> View::PROXY;
+const TypeProxy<View, Store> View::PROXY;
 
 View::View(INTEGER id) : Store(id) {}
 
-const std::string &View::getType() {
-       return TYPENAME;
-}
-
-const std::string *View::getSuper() {
-       return &Store::getType();
-}
-
 const std::string &View::getTypeName() const {
-       return getType();
+       return TYPENAME;
 }
 
 void View::internalize(Reader &reader) {
@@ -27,20 +19,12 @@ void View::internalize(Reader &reader) {
 }
 
 const std::string Fold::TYPENAME("StdFolds.Fold^");
-const TypeProxy<Fold> Fold::PROXY;
+const TypeProxy<Fold, View> Fold::PROXY;
 
 Fold::Fold(INTEGER id) : View(id) {}
 
-const std::string &Fold::getType() {
-       return TYPENAME;
-}
-
-const std::string *Fold::getSuper() {
-       return &View::getType();
-}
-
 const std::string &Fold::getTypeName() const {
-       return getType();
+       return TYPENAME;
 }
 
 void Fold::internalize(Reader &reader) {
@@ -51,16 +35,33 @@ void Fold::internalize(Reader &reader) {
 //             rd.ReadXInt(xint);fold.leftSide := xint = 0;
        reader.readSInt();
 //             rd.ReadXInt(xint); fold.collapsed := xint = 0;
-       reader.readSInt();
+       SHORTINT c = reader.readSInt();
+       d_collapsed = (c == 0);
 //             rd.ReadXString(fold.label);
-       SHORTCHAR label[32];
-       reader.readSString(label); // the label
+       d_label = new SHORTCHAR[32];
+       reader.readSString(d_label); // the label
 //             rd.ReadStore(store);
-       reader.readStore(); // the hidden part
+       d_hidden = reader.readStore(); // the hidden part
 //             IF store # NIL THEN fold.hidden := store(TextModels.Model); Stores.Join(fold.hidden, fold)
 //             ELSE fold.hidden := NIL
 //             END;
 //             fold.leftSide := store # NIL
 }
 
+std::string Fold::toString() {
+       if (d_hidden == 0) {
+               return std::string("Fold(right)");
+       }
+       return std::string("Fold(left) \"") + std::string(d_label) + std::string("\" { ") + d_hidden->toString() + std::string("  }");
+}
+
+void Fold::accept(Visitor &visitor) const {
+       if (d_hidden == 0) { // right part
+               visitor.foldRight();
+       } else { // left part
+               visitor.foldLeft(d_collapsed);
+               d_hidden->accept(visitor);
+       }
+}
+
 } // namespace odc