| [bcf653] | 1 | /*
 | 
|---|
 | 2 |  * Project: MoleCuilder
 | 
|---|
 | 3 |  * Description: creates and alters molecular systems
 | 
|---|
| [0aa122] | 4 |  * Copyright (C)  2010-2012 University of Bonn. All rights reserved.
 | 
|---|
| [bcf653] | 5 |  * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
 | 
|---|
 | 6 |  */
 | 
|---|
 | 7 | 
 | 
|---|
| [ab4b55] | 8 | /*
 | 
|---|
| [765f16] | 9 |  * FormatParser_common_common.cpp
 | 
|---|
| [ab4b55] | 10 |  *
 | 
|---|
 | 11 |  *  Created on: Mar 1, 2010
 | 
|---|
 | 12 |  *      Author: metzler
 | 
|---|
 | 13 |  */
 | 
|---|
 | 14 | 
 | 
|---|
| [bf3817] | 15 | // include config.h
 | 
|---|
 | 16 | #ifdef HAVE_CONFIG_H
 | 
|---|
 | 17 | #include <config.h>
 | 
|---|
 | 18 | #endif
 | 
|---|
 | 19 | 
 | 
|---|
| [ad011c] | 20 | #include "CodePatterns/MemDebug.hpp"
 | 
|---|
| [112b09] | 21 | 
 | 
|---|
| [9131f3] | 22 | #include <iostream>
 | 
|---|
| [ab4b55] | 23 | 
 | 
|---|
| [02ce36] | 24 | #include "CodePatterns/Observer/Notification.hpp"
 | 
|---|
| [765f16] | 25 | #include "World.hpp"
 | 
|---|
 | 26 | #include "ChangeTracker.hpp"
 | 
|---|
 | 27 | #include "FormatParser_common.hpp"
 | 
|---|
 | 28 | 
 | 
|---|
| [ab4b55] | 29 | using namespace std;
 | 
|---|
 | 30 | 
 | 
|---|
 | 31 | /**
 | 
|---|
 | 32 |  * Constructor.
 | 
|---|
 | 33 |  */
 | 
|---|
| [765f16] | 34 | FormatParser_common::FormatParser_common(FormatParser_Parameters *_parameters) :
 | 
|---|
| [091838] | 35 |   Observer("FormatParser_common"),
 | 
|---|
 | 36 |   saveStream(NULL)
 | 
|---|
| [cd5047] | 37 | {
 | 
|---|
| [765f16] | 38 |   parameters = _parameters;
 | 
|---|
| [2f40c0e] | 39 |   ChangeTracker::getInstance().signOn(this);
 | 
|---|
| [02ce36] | 40 |   World::getInstance().signOn(this, World::AtomInserted);
 | 
|---|
 | 41 |   World::getInstance().signOn(this, World::AtomRemoved);
 | 
|---|
| [ab4b55] | 42 | }
 | 
|---|
 | 43 | 
 | 
|---|
 | 44 | /**
 | 
|---|
 | 45 |  * Destructor.
 | 
|---|
 | 46 |  */
 | 
|---|
| [765f16] | 47 | FormatParser_common::~FormatParser_common() 
 | 
|---|
 | 48 | {
 | 
|---|
| [2f40c0e] | 49 |   ChangeTracker::getInstance().signOff(this);
 | 
|---|
| [02ce36] | 50 |   World::getInstance().signOff(this, World::AtomInserted);
 | 
|---|
 | 51 |   World::getInstance().signOff(this, World::AtomRemoved);
 | 
|---|
| [765f16] | 52 |   if (parameters != NULL)
 | 
|---|
 | 53 |     delete parameters;
 | 
|---|
| [c0e28c] | 54 |   // clear id translation maps
 | 
|---|
 | 55 |   LocaltoGobalIdMap.clear();
 | 
|---|
 | 56 |   GlobaltoLocalIdMap.clear();
 | 
|---|
| [ab4b55] | 57 | }
 | 
|---|
 | 58 | 
 | 
|---|
 | 59 | /**
 | 
|---|
 | 60 |  * Update operation which can be invoked by the observable (which should be the
 | 
|---|
 | 61 |  * change tracker here).
 | 
|---|
 | 62 |  */
 | 
|---|
| [765f16] | 63 | void FormatParser_common::update(Observable *publisher) {
 | 
|---|
| [091838] | 64 |   if (saveStream != NULL) { // only store when a saveStream is given
 | 
|---|
 | 65 |     std::vector<atom *> atoms = World::getInstance().getAllAtoms();
 | 
|---|
 | 66 |     save(saveStream, atoms);
 | 
|---|
| [ab4b55] | 67 |   }
 | 
|---|
 | 68 | }
 | 
|---|
 | 69 | 
 | 
|---|
| [38f991] | 70 | /**
 | 
|---|
 | 71 |  * With this, each format parser is informed about specific changes in the World.
 | 
|---|
 | 72 |  */
 | 
|---|
| [765f16] | 73 | void FormatParser_common::recieveNotification(Observable *publisher, Notification_ptr notification) {
 | 
|---|
| [38f991] | 74 |   switch (notification->getChannelNo()) {
 | 
|---|
 | 75 |     case World::AtomInserted:
 | 
|---|
 | 76 |       AtomInserted(World::getInstance().lastChanged<atom>()->getId());
 | 
|---|
 | 77 |       break;
 | 
|---|
 | 78 |     case World::AtomRemoved:
 | 
|---|
 | 79 |       AtomRemoved(World::getInstance().lastChanged<atom>()->getId());
 | 
|---|
 | 80 |       break;
 | 
|---|
 | 81 |     default:
 | 
|---|
 | 82 |       ASSERT(0,
 | 
|---|
| [765f16] | 83 |           "FormatParser_common::recieveNotification() - unknown notification "
 | 
|---|
| [38f991] | 84 |           +toString(notification->getChannelNo())+" received.");
 | 
|---|
 | 85 |       break;
 | 
|---|
 | 86 |   }
 | 
|---|
 | 87 | }
 | 
|---|
 | 88 | 
 | 
|---|
| [ab4b55] | 89 | /**
 | 
|---|
 | 90 |  * The observable can tell when it dies.
 | 
|---|
 | 91 |  */
 | 
|---|
| [765f16] | 92 | void FormatParser_common::subjectKilled(Observable *publisher) {}
 | 
|---|
| [ab4b55] | 93 | 
 | 
|---|
 | 94 | /**
 | 
|---|
 | 95 |  * Sets the output stream for save, so the save() method can be invoked on update
 | 
|---|
 | 96 |  * automatically.
 | 
|---|
 | 97 |  *
 | 
|---|
 | 98 |  * \param ostream where to save the World's state
 | 
|---|
 | 99 |  */
 | 
|---|
| [c0e28c] | 100 | void FormatParser_common::setOstream(ostream* output)
 | 
|---|
 | 101 | {
 | 
|---|
| [ab4b55] | 102 |   saveStream = output;
 | 
|---|
 | 103 | }
 | 
|---|
| [c0e28c] | 104 | 
 | 
|---|
 | 105 | /** Function to be called when beginning to parse a new file.
 | 
|---|
 | 106 |  *
 | 
|---|
 | 107 |  * Resets internal translation maps.
 | 
|---|
 | 108 |  *
 | 
|---|
 | 109 |  */
 | 
|---|
 | 110 | void FormatParser_common::resetIdAssociations()
 | 
|---|
 | 111 | {
 | 
|---|
 | 112 |   LocaltoGobalIdMap.clear();
 | 
|---|
 | 113 |   GlobaltoLocalIdMap.clear();
 | 
|---|
 | 114 | }
 | 
|---|
 | 115 | 
 | 
|---|
 | 116 | /** Installs an association between a local id from a parsed file and the
 | 
|---|
 | 117 |  * global, unique one.
 | 
|---|
 | 118 |  *
 | 
|---|
 | 119 |  * @param local local atom id
 | 
|---|
 | 120 |  * @param global global atom id
 | 
|---|
 | 121 |  */
 | 
|---|
 | 122 | void FormatParser_common::associateLocaltoGlobalId(const int local, const int global)
 | 
|---|
 | 123 | {
 | 
|---|
 | 124 |   ASSERT(LocaltoGobalIdMap.count(local) == 0,
 | 
|---|
 | 125 |       "FormatParser_common::associateLocaltoGlobalId() - local id "
 | 
|---|
 | 126 |       +toString(local)+" is already contained.");
 | 
|---|
 | 127 |   ASSERT(GlobaltoLocalIdMap.count(global) == 0,
 | 
|---|
 | 128 |       "FormatParser_common::associateLocaltoGlobalId() - global id "
 | 
|---|
 | 129 |       +toString(global)+" is already contained.");
 | 
|---|
 | 130 |   LocaltoGobalIdMap[local] = global;
 | 
|---|
 | 131 |   GlobaltoLocalIdMap[global] = local;
 | 
|---|
 | 132 | }
 | 
|---|
 | 133 | 
 | 
|---|
 | 134 | /** Getter for the global id to a given \a local one.
 | 
|---|
 | 135 |  *
 | 
|---|
 | 136 |  * @param local local atom id
 | 
|---|
 | 137 |  * @return global atom id, -1 if unknown
 | 
|---|
 | 138 |  */
 | 
|---|
 | 139 | int FormatParser_common::getGlobalId(const int local) const
 | 
|---|
 | 140 | {
 | 
|---|
 | 141 |   IdtoIdMap::const_iterator iter = LocaltoGobalIdMap.find(local);
 | 
|---|
 | 142 |   if(iter == LocaltoGobalIdMap.end())
 | 
|---|
 | 143 |     return -1;
 | 
|---|
 | 144 |   return iter->second;
 | 
|---|
 | 145 | }
 | 
|---|
 | 146 | 
 | 
|---|
 | 147 | /** Getter for the local id to a given \a global one.
 | 
|---|
 | 148 |  *
 | 
|---|
 | 149 |  * @param global global atom id
 | 
|---|
 | 150 |  * @return local atom id, -1 if unknown
 | 
|---|
 | 151 |  */
 | 
|---|
 | 152 | int FormatParser_common::getLocalId(const int global) const
 | 
|---|
 | 153 | {
 | 
|---|
 | 154 |   IdtoIdMap::const_iterator iter = GlobaltoLocalIdMap.find(global);
 | 
|---|
 | 155 |   if(iter == GlobaltoLocalIdMap.end())
 | 
|---|
 | 156 |     return -1;
 | 
|---|
 | 157 |   return iter->second;
 | 
|---|
 | 158 | }
 | 
|---|