mec_state::mec_state() { AscribeMembers(); std::vector<std::string>::const_iterator i; for(i = member_names().begin(); i != member_names().end(); ++i) { operator[](*i) = "0"; } }
DispValue *DispValue::_update(DispValue *source, bool& was_changed, bool& was_initialized) { if (source == this) { // We're updated from ourselves -- ignore it all. // This happens when a cluster is updated from the values of // the clustered dislays. if (descendant_changed()) was_changed = true; return this; } if (changed) { // Clear `changed' flag changed = false; was_changed = true; } if (source->enabled() != enabled()) { myenabled = source->enabled(); was_changed = true; // We don't set CHANGED to true since enabled/disabled changes // are merely a change in the view, not a change in the data. } if (source->full_name() == full_name() && source->type() == type()) { switch (type()) { case Simple: case Text: case Pointer: // Atomic values if (_value != source->value()) { _value = source->value(); changed = was_changed = true; } return this; case Array: // Array. Check for 1st element, too. if (_have_index_base != source->_have_index_base && (_have_index_base && _index_base != source->_index_base)) break; // FALL THROUGH case Reference: case Sequence: // Numbered children. If size changed, we assume // the whole has been changed. if (nchildren() == source->nchildren()) { for (int i = 0; i < nchildren(); i++) { // Update each child _children[i] = child(i)->update(source->child(i), was_changed, was_initialized); } return this; } break; case List: case Struct: { // Named children. Check whether names are the same. bool same_members = (nchildren() == source->nchildren()); for (int i = 0; same_members && i < nchildren(); i++) { if (child(i)->full_name() != source->child(i)->full_name()) same_members = false; } if (same_members) { // Update each child for (int i = 0; i < nchildren(); i++) { _children[i] = child(i)->update(source->child(i), was_changed, was_initialized); } return this; } // Members have changed. // Be sure to mark only those members that actually have changed // (i.e. don't mark the entire struct and don't mark new members) // We do so by creating a new list of children. `Old' children // that still are reported get updated; `new' children are added. DispValueArray new_children; DispValueArray processed_children; for (int j = 0; j < source->nchildren(); j++) { DispValue *c = 0; for (int i = 0; c == 0 && i < nchildren(); i++) { bool processed = false; for (int k = 0; k < processed_children.size(); k++) { if (child(i) == processed_children[k]) processed = true; } if (processed) continue; if (child(i)->full_name() == source->child(j)->full_name()) { c = child(i)->update(source->child(j), was_changed, was_initialized); processed_children += child(i); } } if (c == 0) { // Child not found -- use source child instead c = source->child(j)->link(); } new_children += c; } _children = new_children; was_changed = was_initialized = true; return this; } case UnknownType: assert(0); abort(); } } // Type, name or structure have changed -- use SOURCE instead of original DispValue *ret = source->link(); ret->changed = was_changed = was_initialized = true; // Copy the basic settings ret->myexpanded = expanded(); ret->dereference(dereferenced()); ret->set_orientation(orientation()); ret->set_member_names(member_names()); // Have new DispValue take over the plotter if (ret->plotter() == 0) { ret->_plotter = plotter(); _plotter = 0; } unlink(); return ret; }