| 1 | /*
 | 
|---|
| 2 |  * CopyAtoms_withBonds.hpp
 | 
|---|
| 3 |  *
 | 
|---|
| 4 |  *  Created on: Mar 17, 2012
 | 
|---|
| 5 |  *      Author: heber
 | 
|---|
| 6 |  */
 | 
|---|
| 7 | 
 | 
|---|
| 8 | #ifndef COPYATOMS_WITHBONDS_HPP_
 | 
|---|
| 9 | #define COPYATOMS_WITHBONDS_HPP_
 | 
|---|
| 10 | 
 | 
|---|
| 11 | 
 | 
|---|
| 12 | // include config.h
 | 
|---|
| 13 | #ifdef HAVE_CONFIG_H
 | 
|---|
| 14 | #include <config.h>
 | 
|---|
| 15 | #endif
 | 
|---|
| 16 | 
 | 
|---|
| 17 | #include <map>
 | 
|---|
| 18 | 
 | 
|---|
| 19 | #include "Atom/CopyAtoms/CopyAtoms_Simple.hpp"
 | 
|---|
| 20 | #include "CodePatterns/Assert.hpp"
 | 
|---|
| 21 | 
 | 
|---|
| 22 | class atom;
 | 
|---|
| 23 | 
 | 
|---|
| 24 | /** This is an extented implementation of CopyAtoms_Simple that also copies the bonds.
 | 
|---|
| 25 |  *
 | 
|---|
| 26 |  */
 | 
|---|
| 27 | class CopyAtoms_withBonds : public CopyAtoms_Simple
 | 
|---|
| 28 | {
 | 
|---|
| 29 | public:
 | 
|---|
| 30 |   /** Destructor.
 | 
|---|
| 31 |    *
 | 
|---|
| 32 |    */
 | 
|---|
| 33 |   virtual ~CopyAtoms_withBonds()
 | 
|---|
| 34 |   {}
 | 
|---|
| 35 | 
 | 
|---|
| 36 |   /** In this function we add to the copied atoms also the bonds.
 | 
|---|
| 37 |    *
 | 
|---|
| 38 |    * @param _atoms atoms to copy
 | 
|---|
| 39 |    */
 | 
|---|
| 40 |   virtual void operator()(const AtomVector &_atoms);
 | 
|---|
| 41 | 
 | 
|---|
| 42 | private:
 | 
|---|
| 43 |   //!> type for lookup up man from original atoms to copied ones.
 | 
|---|
| 44 |   typedef std::map< const atom *,  atom *> LookupMap_t;
 | 
|---|
| 45 | 
 | 
|---|
| 46 |   /** Internal helper to create a lookup map from original atoms to copies.
 | 
|---|
| 47 |    *
 | 
|---|
| 48 |    * This fills LookupMap.
 | 
|---|
| 49 |    *
 | 
|---|
| 50 |    * @param _atoms vector with original atoms
 | 
|---|
| 51 |    */
 | 
|---|
| 52 |   LookupMap_t createLookup(const AtomVector &_atoms)
 | 
|---|
| 53 |   {
 | 
|---|
| 54 |     LookupMap_t LookupMap;
 | 
|---|
| 55 |     AtomVector::const_iterator original_iter = _atoms.begin();
 | 
|---|
| 56 |     AtomVector::iterator copy_iter = CopiedAtoms.begin();
 | 
|---|
| 57 |     for (; original_iter != _atoms.end(); ++original_iter, ++copy_iter) {
 | 
|---|
| 58 |       ASSERT( copy_iter != CopiedAtoms.end(),
 | 
|---|
| 59 |           "CopyAtoms_withBonds::createLookup() - the number of copied atoms is insufficient.");
 | 
|---|
| 60 |   #ifndef NDEBUG
 | 
|---|
| 61 |       std::pair< LookupMap_t::iterator, bool> inserter =
 | 
|---|
| 62 |   #endif
 | 
|---|
| 63 |       LookupMap.insert( std::make_pair( *original_iter, *copy_iter ) );
 | 
|---|
| 64 |       ASSERT( (inserter.second) || (inserter.first->second == *copy_iter),
 | 
|---|
| 65 |           "CopyAtoms_withBonds::createLookup() - There is twice the same original atom for two distinct copies.");
 | 
|---|
| 66 |     }
 | 
|---|
| 67 |     ASSERT( copy_iter == CopiedAtoms.end(),
 | 
|---|
| 68 |         "CopyAtoms_withBonds::createLookup() - the number of copied atoms exceeds number of original ones.");
 | 
|---|
| 69 |     return LookupMap;
 | 
|---|
| 70 |   }
 | 
|---|
| 71 | };
 | 
|---|
| 72 | 
 | 
|---|
| 73 | 
 | 
|---|
| 74 | #endif /* COPYATOMS_WITHBONDS_HPP_ */
 | 
|---|