source: molecuilder/src/Descriptors/AtomDescriptor.cpp@ 90c4460

Last change on this file since 90c4460 was 4c60ef, checked in by Tillmann Crueger <crueger@…>, 16 years ago

Added generic singleton Pattern that can be inherited to any class making that class a singleton.

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