source: molecuilder/src/Descriptors/AtomDescriptor.cpp@ 3db67e

Last change on this file since 3db67e was 323177, checked in by Tillmann Crueger <crueger@…>, 16 years ago

Rebuilt AtomDescriptors using PIMPL-Idiom and added unittest for descriptors

  • Property mode set to 100644
File size: 4.0 KB
RevLine 
[86b917]1/*
2 * AtomDescriptor.cpp
3 *
4 * Created on: Feb 5, 2010
5 * Author: crueger
6 */
7
[323177]8#include "Descriptors/AtomDescriptor.hpp"
9#include "Descriptors/AtomDescriptor_impl.hpp"
[86b917]10
11#include "World.hpp"
12
[323177]13#include "atom.hpp"
14
[86b917]15#include <boost/bind.hpp>
[973c03]16#include <cassert>
[323177]17#include <iostream>
[86b917]18
19using namespace std;
20
21typedef map<int,atom*> atoms_t;
22typedef atoms_t::iterator atoms_iter_t;
23
[323177]24/************************ Forwarding object **************************************/
25
26
27AtomDescriptor::AtomDescriptor(impl_ptr _impl) :
28 impl(_impl)
29{}
30
31AtomDescriptor::AtomDescriptor(const AtomDescriptor& src) :
32 impl(src.get_impl())
33{}
34
35AtomDescriptor::~AtomDescriptor()
36{}
37
38AtomDescriptor& AtomDescriptor::operator=(AtomDescriptor &src){
39 if(&src!=this) {
40 impl=src.get_impl();
41 }
42 return *this;
[86b917]43}
44
[323177]45atom* AtomDescriptor::find(){
46 return impl->find();
[973c03]47}
48
[323177]49std::vector<atom*> AtomDescriptor::findAll(){
50 return impl->findAll();
51}
52
53AtomDescriptor::impl_ptr AtomDescriptor::get_impl() const{
54 return impl;
55}
56
57
58
59
60/**************************** implementation ********************/
61
62AtomDescriptor_impl::AtomDescriptor_impl()
[86b917]63{
64}
65
[323177]66AtomDescriptor_impl::~AtomDescriptor_impl()
67{
68}
[86b917]69
[323177]70atoms_t& AtomDescriptor_impl::getAtoms(){
[86b917]71 return World::get()->atoms;
72}
73
[323177]74atom* AtomDescriptor_impl::find() {
[86b917]75 atoms_t atoms = getAtoms();
[323177]76 atoms_iter_t res = find_if(atoms.begin(),atoms.end(),boost::bind(&AtomDescriptor_impl::predicate,this,_1));
[86b917]77 return (res!=atoms.end())?((*res).second):0;
78}
79
[323177]80vector<atom*> AtomDescriptor_impl::findAll() {
[86b917]81 vector<atom*> res;
82 atoms_t atoms = getAtoms();
83 atoms_iter_t iter;
84 for(iter=atoms.begin();iter!=atoms.end();++iter) {
[323177]85 if(predicate(*iter)){
[86b917]86 res.push_back((*iter).second);
[323177]87 }
[86b917]88 }
[323177]89 return res;
[86b917]90}
[973c03]91
[323177]92/************************** Universe and Emptyset *****************/
[973c03]93
[323177]94AtomAllDescriptor_impl::AtomAllDescriptor_impl()
95{}
[973c03]96
[323177]97AtomAllDescriptor_impl::~AtomAllDescriptor_impl()
98{}
[973c03]99
[323177]100bool AtomAllDescriptor_impl::predicate(std::pair<int,atom*>){
101 return true;
[973c03]102}
103
[323177]104AtomDescriptor AllAtoms(){
105 return AtomDescriptor(AtomDescriptor::impl_ptr(new AtomAllDescriptor_impl));
[973c03]106}
107
[323177]108AtomNoneDescriptor_impl::AtomNoneDescriptor_impl()
109{}
110
111AtomNoneDescriptor_impl::~AtomNoneDescriptor_impl()
112{}
113
114bool AtomNoneDescriptor_impl::predicate(std::pair<int,atom*>){
115 return false;
[973c03]116}
117
[323177]118AtomDescriptor NoAtoms(){
119 return AtomDescriptor(AtomDescriptor::impl_ptr(new AtomNoneDescriptor_impl));
[973c03]120}
121
[323177]122/************************** Operator stuff ************************/
[973c03]123
[323177]124// AND
125AtomAndDescriptor_impl::AtomAndDescriptor_impl(AtomDescriptor::impl_ptr _lhs, AtomDescriptor::impl_ptr _rhs) :
126 lhs(_lhs), rhs(_rhs)
127{}
[973c03]128
[323177]129AtomAndDescriptor_impl::~AtomAndDescriptor_impl()
130{}
[973c03]131
[323177]132bool AtomAndDescriptor_impl::predicate(std::pair<int,atom*> atom){
133 return lhs->predicate(atom) && rhs->predicate(atom);
134}
135AtomDescriptor 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);
[973c03]138}
139
[323177]140// OR
141AtomOrDescriptor_impl::AtomOrDescriptor_impl(AtomDescriptor::impl_ptr _lhs ,AtomDescriptor::impl_ptr _rhs) :
142 lhs(_lhs), rhs(_rhs)
143{}
144
145AtomOrDescriptor_impl::~AtomOrDescriptor_impl(){
[973c03]146}
147
[323177]148bool AtomOrDescriptor_impl::predicate(std::pair<int,atom*> atom){
149 return lhs->predicate(atom) || rhs->predicate(atom);
[973c03]150}
151
[323177]152AtomDescriptor 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);
[973c03]155}
156
157// NOT
158
[323177]159AtomNotDescriptor_impl::AtomNotDescriptor_impl(AtomDescriptor::impl_ptr _arg) :
160 arg(_arg)
161{}
[973c03]162
163
[323177]164AtomNotDescriptor_impl::~AtomNotDescriptor_impl()
[973c03]165{
166}
167
[323177]168bool AtomNotDescriptor_impl::predicate(std::pair<int,atom*> atom){
[973c03]169 return !(arg->predicate(atom));
170}
171
[323177]172AtomDescriptor operator!(const AtomDescriptor &arg){
173 AtomDescriptor::impl_ptr newImpl = AtomDescriptor::impl_ptr(new AtomNotDescriptor_impl(arg.get_impl()));
174 return AtomDescriptor(newImpl);
[973c03]175}
Note: See TracBrowser for help on using the repository browser.