source: src/LinkedCell/LinkedCell_Model_changeModel.cpp@ 13e5be

stable v1.7.0
Last change on this file since 13e5be was f3eb6a, checked in by Frederik Heber <frederik.heber@…>, 5 years ago

FIX: LinkedCell_model executes deletes right away.

  • we use the memory address as key in the queue map. If an atom is removed and another new one happens to land at the same address, this will confuse the queue and end in an assertion failure as the update will be overriden and the atom is already present.
  • Property mode set to 100644
File size: 3.6 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2012 University of Bonn. All rights reserved.
5 *
6 *
7 * This file is part of MoleCuilder.
8 *
9 * MoleCuilder is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * MoleCuilder is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with MoleCuilder. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23/*
24 * LinkedCell_Model_changeModel.cpp
25 *
26 * Created on: Dec 20, 2011
27 * Author: heber
28 */
29
30// include config.h
31#ifdef HAVE_CONFIG_H
32#include <config.h>
33#endif
34
35//#include "CodePatterns/MemDebug.hpp"
36
37#include "LinkedCell_Model_changeModel.hpp"
38
39#include "CodePatterns/Log.hpp"
40#include "CodePatterns/toString.hpp"
41
42#include "Atom/TesselPoint.hpp"
43
44/** Constructor of LinkedCell_Model::changeModel.
45 *
46 */
47LinkedCell::LinkedCell_Model::changeModel::changeModel(const double distance) :
48 Observable(std::string("LinkedCell_Model("+toString(distance)+")::changeModel"))
49{}
50
51/** Destructor of LinkedCell_Model::changeModel.
52 *
53 */
54LinkedCell::LinkedCell_Model::changeModel::~changeModel()
55{
56 // remove all remaining updates in the queue
57 for (UpdateQueueMap::iterator iter = queue.begin();
58 !queue.empty();
59 iter = queue.begin()) {
60 delete iter->second;
61 queue.erase(iter);
62 }
63}
64
65/** Adds an Update instance to the internal queue.
66 *
67 * @param Walker node which is the update object
68 * @param _updateMethod bound function (to LinkedCell_Model instance) of the update function
69 */
70void LinkedCell::LinkedCell_Model::changeModel::addUpdate(
71 const TesselPoint *Walker,
72 const LinkedCell_Model::Update::PriorityLevel priority,
73 boost::function<void (const TesselPoint *)> _updateMethod,
74 const std::string name
75 )
76{
77 UpdateQueueMap::iterator iter = queue.find(Walker);
78 if (iter != queue.end()) {
79 if(iter->second->getPriority() >= priority) {
80 // replace present update with new one
81 OBSERVE;
82 delete iter->second;
83 iter->second = new Update(_updateMethod, Walker, priority, name);
84 } else {
85 LOG(2, "INFO: Rejecting update '" << name << "' for LinkedCell_Model as higher prioritized one is present.");
86 }
87 } else {
88 // insert new update
89 LOG(2, "INFO: Placing new update '" << name << "' into queue for LinkedCell_Model.");
90 OBSERVE;
91 queue.insert( std::make_pair(Walker, new Update(_updateMethod, Walker, priority, name)) );
92 }
93}
94
95/**
96 * Removes all contained updates for a specific tesselpoint.
97 *
98 */
99void LinkedCell::LinkedCell_Model::changeModel::removeUpdates(const TesselPoint *Walker)
100{
101 queue.erase(Walker);
102}
103
104/** Empties changeModel::queue by performing all update functions.
105 *
106 */
107void LinkedCell::LinkedCell_Model::changeModel::performUpdates()
108{
109 LOG(2, "INFO: Performing "+toString(queue.size())+" updates on LinkedCell_Model.");
110 for (UpdateQueueMap::iterator iter = queue.begin();
111 !queue.empty();
112 iter = queue.begin()) {
113 LOG(2, "INFO: Performing update '"+iter->second->getName()+"' on "
114 +toString(iter->first)+"...");
115 // perform update
116 (*iter->second)();
117 // remove update
118 delete iter->second;
119 queue.erase(iter);
120 }
121}
Note: See TracBrowser for help on using the repository browser.