Line data Source code
1 : // Copyright (C) 2015 Technische Universitaet Muenchen 2 : // This file is part of the Mamico project. For conditions of distribution 3 : // and use, please see the copyright notice in Mamico's main folder, or at 4 : // www5.in.tum.de/mamico 5 : #ifndef _MOLECULARDYNAMIC_COUPLING_INTERFACE_SIMPLEMDMOLECULEITERATOR_CPP_ 6 : #define _MOLECULARDYNAMIC_COUPLING_INTERFACE_SIMPLEMDMOLECULEITERATOR_CPP_ 7 : 8 : #include "coupling/interface/MoleculeIterator.h" 9 : #include "coupling/interface/impl/SimpleMD/SimpleMDMolecule.h" 10 : #include "coupling/interface/impl/SimpleMD/SimpleMDLinkedCellWrapper.h" 11 : #include "simplemd/services/MoleculeService.h" 12 : #include "simplemd/LinkedCell.h" 13 : #include "simplemd/Molecule.h" 14 : 15 : namespace coupling { 16 : namespace interface { 17 : 18 : /** iterates over molecules in a SimpleMD linked cell. 19 : * @author Philipp Neumann 20 : */ 21 : class SimpleMDMoleculeIterator : public MoleculeIterator<SimpleMDLinkedCellWrapper, MD_DIM> { 22 : public: 23 0 : SimpleMDMoleculeIterator(SimpleMDLinkedCellWrapper& cellWrapper, simplemd::services::MoleculeService& moleculeService) 24 0 : : coupling::interface::MoleculeIterator<SimpleMDLinkedCellWrapper, MD_DIM>(cellWrapper), _moleculeService(moleculeService), _moleculeIndex(0), 25 0 : _buffer(NULL) {} 26 0 : virtual ~SimpleMDMoleculeIterator() {} 27 : 28 : /** sets the iterator to the first element */ 29 0 : void begin() { _moleculeIndex = 0; } 30 : 31 : /** returns false, if the iterator reached the end of the molecule list */ 32 0 : bool continueIteration() const { 33 0 : auto cell = _moleculeService.getContainer()[_cell.getCellIndex()]; 34 0 : return (_moleculeIndex < cell.numMolecules()); 35 : } 36 : 37 : /** sets the iterator to the next molecule */ 38 0 : void next() { 39 : // check if we need to update molecule information and reset flag in this case 40 0 : _moleculeIndex++; 41 0 : } 42 : 43 : /** returns a reference to the molecule that this iterator currently points to */ 44 0 : coupling::interface::Molecule<MD_DIM>& get() { 45 0 : auto cell = _moleculeService.getContainer()[_cell.getCellIndex()]; 46 0 : auto molecule = &_moleculeService.getContainer().getMoleculeAt(cell.getIndex(), _moleculeIndex); 47 0 : _buffer.setMolecule(molecule); 48 0 : return _buffer; 49 : } 50 : 51 0 : const coupling::interface::Molecule<MD_DIM>& getConst() { return get(); } 52 : 53 : private: 54 : simplemd::services::MoleculeService& _moleculeService; 55 : size_t _moleculeIndex; 56 : coupling::interface::SimpleMDMolecule _buffer; 57 : }; 58 : 59 : } // namespace interface 60 : } // namespace coupling 61 : 62 : #endif // _MOLECULARDYNAMIC_COUPLING_INTERFACE_SIMPLEMDMOLECULEITERATOR_CPP_