Ignore:
Timestamp:
Feb 16, 2010, 4:24:07 PM (16 years ago)
Author:
Tillmann Crueger <crueger@…>
Children:
120f8b
Parents:
973c03
Message:

Rebuilt AtomDescriptors using PIMPL-Idiom and added unittest for descriptors

File:
1 edited

Legend:

Unmodified
Added
Removed
  • molecuilder/src/Descriptors/AtomDescriptor.cpp

    r973c03 r323177  
    66 */
    77
    8 #include "AtomDescriptor.hpp"
     8#include "Descriptors/AtomDescriptor.hpp"
     9#include "Descriptors/AtomDescriptor_impl.hpp"
    910
    1011#include "World.hpp"
    1112
     13#include "atom.hpp"
     14
    1215#include <boost/bind.hpp>
    1316#include <cassert>
     17#include <iostream>
    1418
    1519using namespace std;
     
    1822typedef atoms_t::iterator atoms_iter_t;
    1923
    20 AtomDescriptor::AtomDescriptor()
     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;
     43}
     44
     45atom* AtomDescriptor::find(){
     46  return impl->find();
     47}
     48
     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()
    2163{
    2264}
    2365
    24 AtomDescriptor::AtomDescriptor(const AtomDescriptor &desc) {
    25 }
    26 
    27 AtomDescriptor::~AtomDescriptor()
     66AtomDescriptor_impl::~AtomDescriptor_impl()
    2867{
    2968}
    3069
    31 
    32 atoms_t& AtomDescriptor::getAtoms(){
     70atoms_t& AtomDescriptor_impl::getAtoms(){
    3371  return World::get()->atoms;
    3472}
    3573
    36 atom* AtomDescriptor::find() {
     74atom* AtomDescriptor_impl::find() {
    3775  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));
    3977  return (res!=atoms.end())?((*res).second):0;
    4078}
    4179
    42 vector<atom*> AtomDescriptor::findAll() {
     80vector<atom*> AtomDescriptor_impl::findAll() {
    4381  vector<atom*> res;
    4482  atoms_t atoms = getAtoms();
    4583  atoms_iter_t iter;
    4684  for(iter=atoms.begin();iter!=atoms.end();++iter) {
    47     if(predicate(*iter))
     85    if(predicate(*iter)){
    4886      res.push_back((*iter).second);
     87    }
    4988  }
     89  return res;
    5090}
    5191
    52 // stuff for operators
     92/************************** Universe and Emptyset *****************/
     93
     94AtomAllDescriptor_impl::AtomAllDescriptor_impl()
     95{}
     96
     97AtomAllDescriptor_impl::~AtomAllDescriptor_impl()
     98{}
     99
     100bool AtomAllDescriptor_impl::predicate(std::pair<int,atom*>){
     101  return true;
     102}
     103
     104AtomDescriptor AllAtoms(){
     105  return AtomDescriptor(AtomDescriptor::impl_ptr(new AtomAllDescriptor_impl));
     106}
     107
     108AtomNoneDescriptor_impl::AtomNoneDescriptor_impl()
     109{}
     110
     111AtomNoneDescriptor_impl::~AtomNoneDescriptor_impl()
     112{}
     113
     114bool AtomNoneDescriptor_impl::predicate(std::pair<int,atom*>){
     115  return false;
     116}
     117
     118AtomDescriptor NoAtoms(){
     119  return AtomDescriptor(AtomDescriptor::impl_ptr(new AtomNoneDescriptor_impl));
     120}
     121
     122/************************** Operator stuff ************************/
    53123
    54124// AND
    55 AtomAndDescriptor::AtomAndDescriptor(const AtomDescriptor &_lhs,const AtomDescriptor &_rhs){
    56   lhs=_lhs.clone();
    57   rhs=_rhs.clone();
    58 }
     125AtomAndDescriptor_impl::AtomAndDescriptor_impl(AtomDescriptor::impl_ptr _lhs, AtomDescriptor::impl_ptr _rhs) :
     126    lhs(_lhs), rhs(_rhs)
     127{}
    59128
    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 }
     129AtomAndDescriptor_impl::~AtomAndDescriptor_impl()
     130{}
    73131
    74 AtomAndDescriptor::~AtomAndDescriptor(){
    75 }
    76 
    77 bool AtomAndDescriptor::predicate(std::pair<int,atom*> atom){
     132bool AtomAndDescriptor_impl::predicate(std::pair<int,atom*> atom){
    78133  return lhs->predicate(atom) && rhs->predicate(atom);
    79134}
    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);
     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);
    87138}
    88139
    89140// OR
     141AtomOrDescriptor_impl::AtomOrDescriptor_impl(AtomDescriptor::impl_ptr _lhs ,AtomDescriptor::impl_ptr _rhs) :
     142    lhs(_lhs), rhs(_rhs)
     143{}
    90144
    91 AtomOrDescriptor::AtomOrDescriptor(const AtomDescriptor &_lhs,const AtomDescriptor &_rhs){
    92   lhs=_lhs.clone();
    93   rhs=_rhs.clone();
     145AtomOrDescriptor_impl::~AtomOrDescriptor_impl(){
    94146}
    95147
    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){
     148bool AtomOrDescriptor_impl::predicate(std::pair<int,atom*> atom){
    114149  return lhs->predicate(atom) || rhs->predicate(atom);
    115150}
    116151
    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);
     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);
    123155}
    124156
    125157// NOT
    126158
    127 AtomNotDescriptor::AtomNotDescriptor(const AtomDescriptor &_arg){
    128   arg = _arg.clone();
    129 }
     159AtomNotDescriptor_impl::AtomNotDescriptor_impl(AtomDescriptor::impl_ptr _arg) :
     160    arg(_arg)
     161{}
    130162
    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 pointers
    134   // 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 sense
    139   AtomNotDescriptor &desc = const_cast<AtomNotDescriptor&>(_desc);
    140   arg = desc.arg;
    141 }
    142163
    143 AtomNotDescriptor::~AtomNotDescriptor()
     164AtomNotDescriptor_impl::~AtomNotDescriptor_impl()
    144165{
    145166}
    146167
    147 bool AtomNotDescriptor::predicate(std::pair<int,atom*> atom){
     168bool AtomNotDescriptor_impl::predicate(std::pair<int,atom*> atom){
    148169 return !(arg->predicate(atom));
    149170}
    150171
    151 AtomAndDescriptor::desc_ptr AtomNotDescriptor::clone() const{
    152   return desc_ptr(new AtomNotDescriptor(*arg));
     172AtomDescriptor operator!(const AtomDescriptor &arg){
     173  AtomDescriptor::impl_ptr newImpl = AtomDescriptor::impl_ptr(new AtomNotDescriptor_impl(arg.get_impl()));
     174  return AtomDescriptor(newImpl);
    153175}
    154 
    155 AtomNotDescriptor operator!(const AtomDescriptor &arg){
    156   return AtomNotDescriptor(arg);
    157 }
Note: See TracChangeset for help on using the changeset viewer.