| [8688ef] | 1 | /*
 | 
|---|
 | 2 |  * ObservedValue_UpdateAtoms.hpp
 | 
|---|
 | 3 |  *
 | 
|---|
 | 4 |  *  Created on: Oct 17, 2015
 | 
|---|
 | 5 |  *      Author: heber
 | 
|---|
 | 6 |  */
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | 
 | 
|---|
 | 9 | #ifndef OBSERVEDVALUE_UPDATEATOMS_HPP_
 | 
|---|
 | 10 | #define OBSERVEDVALUE_UPDATEATOMS_HPP_
 | 
|---|
 | 11 | 
 | 
|---|
 | 12 | // include config.h
 | 
|---|
 | 13 | #ifdef HAVE_CONFIG_H
 | 
|---|
 | 14 | #include <config.h>
 | 
|---|
 | 15 | #endif
 | 
|---|
 | 16 | 
 | 
|---|
 | 17 | #include <set>
 | 
|---|
 | 18 | 
 | 
|---|
 | 19 | #include <boost/function.hpp>
 | 
|---|
 | 20 | 
 | 
|---|
 | 21 | #include "ObservedValue_wCallback.hpp"
 | 
|---|
 | 22 | 
 | 
|---|
 | 23 | #include "Descriptors/MoleculeIdDescriptor.hpp"
 | 
|---|
 | 24 | #include "types.hpp"
 | 
|---|
 | 25 | #include "World.hpp"
 | 
|---|
 | 26 | 
 | 
|---|
 | 27 | /** This is a specialization of ObservedValue_wCallback for a set of atomic ids.
 | 
|---|
 | 28 |  *
 | 
|---|
 | 29 |  * The problem is that on an update signal we only get a single id. However, get()
 | 
|---|
 | 30 |  * requires us to return a set of ids (namely all contained atoms by id and update
 | 
|---|
 | 31 |  * only gives left or added ones).
 | 
|---|
 | 32 |  *
 | 
|---|
 | 33 |  * Hence, we need to add a member variable storing the current set.
 | 
|---|
 | 34 |  *
 | 
|---|
 | 35 |  */
 | 
|---|
| [026bef] | 36 | class ObservedValue_UpdateAtoms : public ObservedValue_wCallback< std::set<atomId_t>, moleculeId_t >
 | 
|---|
| [8688ef] | 37 | {
 | 
|---|
 | 38 |   typedef std::set<atomId_t> atoms_t;
 | 
|---|
 | 39 | 
 | 
|---|
 | 40 | public:
 | 
|---|
 | 41 |   ObservedValue_UpdateAtoms(
 | 
|---|
 | 42 |     const Observable * const _owner,
 | 
|---|
 | 43 |     const std::string &_name,
 | 
|---|
 | 44 |     const Observable::channels_t &_channels,
 | 
|---|
| [026bef] | 45 |     const boost::function<void(moleculeId_t)> &_callback,
 | 
|---|
| [8688ef] | 46 |     const boost::function<const moleculeId_t ()> &_getMolIndex
 | 
|---|
 | 47 |     ) :
 | 
|---|
| [026bef] | 48 |       ObservedValue_wCallback<atoms_t, moleculeId_t>(
 | 
|---|
| [8688ef] | 49 |           _owner,
 | 
|---|
 | 50 |           boost::bind(&ObservedValue_UpdateAtoms::updateAtoms,
 | 
|---|
 | 51 |               this), _name,
 | 
|---|
 | 52 |               atoms_t(),
 | 
|---|
 | 53 |               _channels,
 | 
|---|
| [026bef] | 54 |               _callback,
 | 
|---|
 | 55 |               _getMolIndex),
 | 
|---|
| [8688ef] | 56 |       getMolIndex(_getMolIndex)
 | 
|---|
 | 57 |     {}
 | 
|---|
 | 58 | 
 | 
|---|
 | 59 |   virtual ~ObservedValue_UpdateAtoms ()
 | 
|---|
 | 60 |   {}
 | 
|---|
 | 61 | 
 | 
|---|
 | 62 | protected:
 | 
|---|
 | 63 |   atoms_t updateAtoms()
 | 
|---|
 | 64 |   {
 | 
|---|
 | 65 |     atoms_t current_atomset = get();
 | 
|---|
 | 66 |     const molecule * const mol = const_cast<const World &>(World::getInstance()).
 | 
|---|
 | 67 |         getMolecule(MoleculeById(getMolIndex()));
 | 
|---|
 | 68 |     if (mol != NULL) {
 | 
|---|
 | 69 |       const atomId_t id = mol->lastChangedAtomId();
 | 
|---|
 | 70 |       if (mol->containsAtom(id))
 | 
|---|
 | 71 |         current_atomset.insert(id);
 | 
|---|
 | 72 |       else
 | 
|---|
 | 73 |         current_atomset.erase(id);
 | 
|---|
 | 74 |     }
 | 
|---|
 | 75 |     return current_atomset;
 | 
|---|
 | 76 |   }
 | 
|---|
 | 77 | 
 | 
|---|
 | 78 | private:
 | 
|---|
 | 79 | 
 | 
|---|
 | 80 |   //!> contains the set of atoms displayed
 | 
|---|
 | 81 |   atoms_t DisplayedAtoms;
 | 
|---|
 | 82 | 
 | 
|---|
 | 83 |   //!> getter function for the molecule index whose current set of atoms we observe
 | 
|---|
 | 84 |   const boost::function<const moleculeId_t ()> getMolIndex;
 | 
|---|
 | 85 | };
 | 
|---|
 | 86 | 
 | 
|---|
 | 87 | #endif /* OBSERVEDVALUE_UPDATEATOMS_HPP_ */
 | 
|---|