Changeset 323177 for molecuilder/src/Descriptors/AtomDescriptor.cpp
- Timestamp:
- Feb 16, 2010, 4:24:07 PM (16 years ago)
- Children:
- 120f8b
- Parents:
- 973c03
- File:
-
- 1 edited
-
molecuilder/src/Descriptors/AtomDescriptor.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
molecuilder/src/Descriptors/AtomDescriptor.cpp
r973c03 r323177 6 6 */ 7 7 8 #include "AtomDescriptor.hpp" 8 #include "Descriptors/AtomDescriptor.hpp" 9 #include "Descriptors/AtomDescriptor_impl.hpp" 9 10 10 11 #include "World.hpp" 11 12 13 #include "atom.hpp" 14 12 15 #include <boost/bind.hpp> 13 16 #include <cassert> 17 #include <iostream> 14 18 15 19 using namespace std; … … 18 22 typedef atoms_t::iterator atoms_iter_t; 19 23 20 AtomDescriptor::AtomDescriptor() 24 /************************ Forwarding object **************************************/ 25 26 27 AtomDescriptor::AtomDescriptor(impl_ptr _impl) : 28 impl(_impl) 29 {} 30 31 AtomDescriptor::AtomDescriptor(const AtomDescriptor& src) : 32 impl(src.get_impl()) 33 {} 34 35 AtomDescriptor::~AtomDescriptor() 36 {} 37 38 AtomDescriptor& AtomDescriptor::operator=(AtomDescriptor &src){ 39 if(&src!=this) { 40 impl=src.get_impl(); 41 } 42 return *this; 43 } 44 45 atom* AtomDescriptor::find(){ 46 return impl->find(); 47 } 48 49 std::vector<atom*> AtomDescriptor::findAll(){ 50 return impl->findAll(); 51 } 52 53 AtomDescriptor::impl_ptr AtomDescriptor::get_impl() const{ 54 return impl; 55 } 56 57 58 59 60 /**************************** implementation ********************/ 61 62 AtomDescriptor_impl::AtomDescriptor_impl() 21 63 { 22 64 } 23 65 24 AtomDescriptor::AtomDescriptor(const AtomDescriptor &desc) { 25 } 26 27 AtomDescriptor::~AtomDescriptor() 66 AtomDescriptor_impl::~AtomDescriptor_impl() 28 67 { 29 68 } 30 69 31 32 atoms_t& AtomDescriptor::getAtoms(){ 70 atoms_t& AtomDescriptor_impl::getAtoms(){ 33 71 return World::get()->atoms; 34 72 } 35 73 36 atom* AtomDescriptor ::find() {74 atom* AtomDescriptor_impl::find() { 37 75 atoms_t atoms = getAtoms(); 38 atoms_iter_t res = find_if(atoms.begin(),atoms.end(),boost::bind(&AtomDescriptor ::predicate,this,_1));76 atoms_iter_t res = find_if(atoms.begin(),atoms.end(),boost::bind(&AtomDescriptor_impl::predicate,this,_1)); 39 77 return (res!=atoms.end())?((*res).second):0; 40 78 } 41 79 42 vector<atom*> AtomDescriptor ::findAll() {80 vector<atom*> AtomDescriptor_impl::findAll() { 43 81 vector<atom*> res; 44 82 atoms_t atoms = getAtoms(); 45 83 atoms_iter_t iter; 46 84 for(iter=atoms.begin();iter!=atoms.end();++iter) { 47 if(predicate(*iter)) 85 if(predicate(*iter)){ 48 86 res.push_back((*iter).second); 87 } 49 88 } 89 return res; 50 90 } 51 91 52 // stuff for operators 92 /************************** Universe and Emptyset *****************/ 93 94 AtomAllDescriptor_impl::AtomAllDescriptor_impl() 95 {} 96 97 AtomAllDescriptor_impl::~AtomAllDescriptor_impl() 98 {} 99 100 bool AtomAllDescriptor_impl::predicate(std::pair<int,atom*>){ 101 return true; 102 } 103 104 AtomDescriptor AllAtoms(){ 105 return AtomDescriptor(AtomDescriptor::impl_ptr(new AtomAllDescriptor_impl)); 106 } 107 108 AtomNoneDescriptor_impl::AtomNoneDescriptor_impl() 109 {} 110 111 AtomNoneDescriptor_impl::~AtomNoneDescriptor_impl() 112 {} 113 114 bool AtomNoneDescriptor_impl::predicate(std::pair<int,atom*>){ 115 return false; 116 } 117 118 AtomDescriptor NoAtoms(){ 119 return AtomDescriptor(AtomDescriptor::impl_ptr(new AtomNoneDescriptor_impl)); 120 } 121 122 /************************** Operator stuff ************************/ 53 123 54 124 // AND 55 AtomAndDescriptor::AtomAndDescriptor(const AtomDescriptor &_lhs,const AtomDescriptor &_rhs){ 56 lhs=_lhs.clone(); 57 rhs=_rhs.clone(); 58 } 125 AtomAndDescriptor_impl::AtomAndDescriptor_impl(AtomDescriptor::impl_ptr _lhs, AtomDescriptor::impl_ptr _rhs) : 126 lhs(_lhs), rhs(_rhs) 127 {} 59 128 60 AtomAndDescriptor::AtomAndDescriptor(const AtomAndDescriptor &_desc) 61 { 62 // the copy constructor needs it's parameter as const to work, 63 // however we need to be able to transfer the ownership of the pointers 64 // to the new method to avoid another cloning. 65 // 66 // the only place where the copy constructor is used for these classes, 67 // is when returning a temporary. 68 // this is one of the very rare cases when const_cast makes sense 69 AtomAndDescriptor &desc = const_cast<AtomAndDescriptor&>(_desc); 70 lhs = desc.lhs; 71 rhs = desc.rhs; 72 } 129 AtomAndDescriptor_impl::~AtomAndDescriptor_impl() 130 {} 73 131 74 AtomAndDescriptor::~AtomAndDescriptor(){ 75 } 76 77 bool AtomAndDescriptor::predicate(std::pair<int,atom*> atom){ 132 bool AtomAndDescriptor_impl::predicate(std::pair<int,atom*> atom){ 78 133 return lhs->predicate(atom) && rhs->predicate(atom); 79 134 } 80 81 AtomAndDescriptor::desc_ptr AtomAndDescriptor::clone() const{ 82 return desc_ptr(new AtomAndDescriptor(*lhs,*rhs)); 83 } 84 85 AtomAndDescriptor operator&&(const AtomDescriptor &lhs, const AtomDescriptor &rhs){ 86 return AtomAndDescriptor(lhs,rhs); 135 AtomDescriptor operator&&(const AtomDescriptor &lhs, const AtomDescriptor &rhs){ 136 AtomDescriptor::impl_ptr newImpl = AtomDescriptor::impl_ptr(new AtomAndDescriptor_impl(lhs.get_impl(),rhs.get_impl())); 137 return AtomDescriptor(newImpl); 87 138 } 88 139 89 140 // OR 141 AtomOrDescriptor_impl::AtomOrDescriptor_impl(AtomDescriptor::impl_ptr _lhs ,AtomDescriptor::impl_ptr _rhs) : 142 lhs(_lhs), rhs(_rhs) 143 {} 90 144 91 AtomOrDescriptor::AtomOrDescriptor(const AtomDescriptor &_lhs,const AtomDescriptor &_rhs){ 92 lhs=_lhs.clone(); 93 rhs=_rhs.clone(); 145 AtomOrDescriptor_impl::~AtomOrDescriptor_impl(){ 94 146 } 95 147 96 AtomOrDescriptor::AtomOrDescriptor(const AtomOrDescriptor &_desc) 97 { 98 // the copy constructor needs it's parameter as const to work, 99 // however we need to be able to transfer the ownership of the pointers 100 // to the new method to avoid another cloning. 101 // 102 // the only place where the copy constructor is used for these classes, 103 // is when returning a temporary. 104 // this is one of the very rare cases when const_cast makes sense 105 AtomOrDescriptor &desc = const_cast<AtomOrDescriptor&>(_desc); 106 lhs = desc.lhs; 107 rhs = desc.rhs; 108 } 109 110 AtomOrDescriptor::~AtomOrDescriptor(){ 111 } 112 113 bool AtomOrDescriptor::predicate(std::pair<int,atom*> atom){ 148 bool AtomOrDescriptor_impl::predicate(std::pair<int,atom*> atom){ 114 149 return lhs->predicate(atom) || rhs->predicate(atom); 115 150 } 116 151 117 AtomAndDescriptor::desc_ptr AtomOrDescriptor::clone() const{ 118 return desc_ptr(new AtomOrDescriptor(*lhs,*rhs)); 119 } 120 121 AtomOrDescriptor operator||(const AtomDescriptor &lhs, const AtomDescriptor &rhs){ 122 return AtomOrDescriptor(lhs,rhs); 152 AtomDescriptor operator||(const AtomDescriptor &lhs, const AtomDescriptor &rhs){ 153 AtomDescriptor::impl_ptr newImpl = AtomDescriptor::impl_ptr(new AtomOrDescriptor_impl(lhs.get_impl(),rhs.get_impl())); 154 return AtomDescriptor(newImpl); 123 155 } 124 156 125 157 // NOT 126 158 127 AtomNotDescriptor ::AtomNotDescriptor(const AtomDescriptor &_arg){128 arg = _arg.clone();129 }159 AtomNotDescriptor_impl::AtomNotDescriptor_impl(AtomDescriptor::impl_ptr _arg) : 160 arg(_arg) 161 {} 130 162 131 AtomNotDescriptor::AtomNotDescriptor(const AtomNotDescriptor &_desc) {132 // the copy constructor needs it's parameter as const to work,133 // however we need to be able to transfer the ownership of the pointers134 // to the new method to avoid another cloning.135 //136 // the only place where the copy constructor is used for these classes,137 // is when returning a temporary.138 // this is one of the very rare cases when const_cast makes sense139 AtomNotDescriptor &desc = const_cast<AtomNotDescriptor&>(_desc);140 arg = desc.arg;141 }142 163 143 AtomNotDescriptor ::~AtomNotDescriptor()164 AtomNotDescriptor_impl::~AtomNotDescriptor_impl() 144 165 { 145 166 } 146 167 147 bool AtomNotDescriptor ::predicate(std::pair<int,atom*> atom){168 bool AtomNotDescriptor_impl::predicate(std::pair<int,atom*> atom){ 148 169 return !(arg->predicate(atom)); 149 170 } 150 171 151 AtomAndDescriptor::desc_ptr AtomNotDescriptor::clone() const{ 152 return desc_ptr(new AtomNotDescriptor(*arg)); 172 AtomDescriptor operator!(const AtomDescriptor &arg){ 173 AtomDescriptor::impl_ptr newImpl = AtomDescriptor::impl_ptr(new AtomNotDescriptor_impl(arg.get_impl())); 174 return AtomDescriptor(newImpl); 153 175 } 154 155 AtomNotDescriptor operator!(const AtomDescriptor &arg){156 return AtomNotDescriptor(arg);157 }
Note:
See TracChangeset
for help on using the changeset viewer.
