| [fc1b24] | 1 | /*
 | 
|---|
 | 2 |  * AtomDescriptor.hpp
 | 
|---|
 | 3 |  *
 | 
|---|
 | 4 |  *  Created on: Feb 5, 2010
 | 
|---|
 | 5 |  *      Author: crueger
 | 
|---|
 | 6 |  */
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | #ifndef ATOMDESCRIPTOR_HPP_
 | 
|---|
 | 9 | #define ATOMDESCRIPTOR_HPP_
 | 
|---|
 | 10 | 
 | 
|---|
| [d1c5e2] | 11 | 
 | 
|---|
 | 12 | #include <vector>
 | 
|---|
 | 13 | #include <map>
 | 
|---|
 | 14 | #include <boost/shared_ptr.hpp>
 | 
|---|
| [fc1b24] | 15 | #include "World.hpp"
 | 
|---|
 | 16 | 
 | 
|---|
 | 17 | class atom;
 | 
|---|
 | 18 | 
 | 
|---|
 | 19 | class AtomDescriptor
 | 
|---|
 | 20 | {
 | 
|---|
 | 21 | public:
 | 
|---|
| [d1c5e2] | 22 | 
 | 
|---|
 | 23 |   typedef boost::shared_ptr<AtomDescriptor> desc_ptr;
 | 
|---|
 | 24 | 
 | 
|---|
| [fc1b24] | 25 |   friend atom* World::getAtom(AtomDescriptor& descriptor);
 | 
|---|
 | 26 |   friend std::vector<atom*> World::getAllAtoms(AtomDescriptor& descriptor);
 | 
|---|
 | 27 | 
 | 
|---|
 | 28 |   AtomDescriptor();
 | 
|---|
 | 29 |   virtual ~AtomDescriptor();
 | 
|---|
| [d1c5e2] | 30 |   AtomDescriptor(const AtomDescriptor&);
 | 
|---|
 | 31 | 
 | 
|---|
 | 32 |   virtual bool predicate(std::pair<int,atom*>)=0;
 | 
|---|
 | 33 |   // clone is only used internally to generate operators
 | 
|---|
 | 34 |   virtual desc_ptr clone() const=0;
 | 
|---|
| [fc1b24] | 35 | 
 | 
|---|
 | 36 | protected:
 | 
|---|
| [d1c5e2] | 37 |   virtual atom* find();
 | 
|---|
 | 38 |   virtual std::vector<atom*> findAll();
 | 
|---|
| [fc1b24] | 39 |   std::map<int,atom*>& getAtoms();
 | 
|---|
 | 40 | };
 | 
|---|
 | 41 | 
 | 
|---|
| [d1c5e2] | 42 | class AtomAndDescriptor : public AtomDescriptor
 | 
|---|
 | 43 | {
 | 
|---|
 | 44 |   friend AtomAndDescriptor operator&&(const AtomDescriptor &lhs, const AtomDescriptor &rhs);
 | 
|---|
| [fc1b24] | 45 | public:
 | 
|---|
| [d1c5e2] | 46 |   AtomAndDescriptor(const AtomAndDescriptor&);
 | 
|---|
 | 47 |   ~AtomAndDescriptor();
 | 
|---|
| [fc1b24] | 48 | 
 | 
|---|
| [d1c5e2] | 49 |   virtual desc_ptr clone() const;
 | 
|---|
 | 50 |   virtual bool predicate(std::pair<int,atom*>);
 | 
|---|
 | 51 | 
 | 
|---|
 | 52 | private:
 | 
|---|
 | 53 |   desc_ptr lhs;
 | 
|---|
 | 54 |   desc_ptr rhs;
 | 
|---|
 | 55 | 
 | 
|---|
 | 56 |   // private constructor to enforce construction through operators
 | 
|---|
 | 57 |   AtomAndDescriptor(const AtomDescriptor &_lhs, const AtomDescriptor &_rhs);
 | 
|---|
| [fc1b24] | 58 | };
 | 
|---|
 | 59 | 
 | 
|---|
| [d1c5e2] | 60 | class AtomOrDescriptor : public AtomDescriptor
 | 
|---|
 | 61 | {
 | 
|---|
 | 62 |   friend AtomOrDescriptor  operator||(const AtomDescriptor &lhs, const AtomDescriptor &rhs);
 | 
|---|
 | 63 | public:
 | 
|---|
 | 64 |   AtomOrDescriptor(const AtomOrDescriptor &);
 | 
|---|
 | 65 |   ~AtomOrDescriptor();
 | 
|---|
 | 66 | 
 | 
|---|
 | 67 |   virtual desc_ptr clone() const;
 | 
|---|
 | 68 |   virtual bool predicate(std::pair<int,atom*>);
 | 
|---|
 | 69 | 
 | 
|---|
 | 70 | private:
 | 
|---|
 | 71 |   desc_ptr lhs;
 | 
|---|
 | 72 |   desc_ptr rhs;
 | 
|---|
 | 73 | 
 | 
|---|
 | 74 |   // private constructor to enforce construction through operators
 | 
|---|
 | 75 |   AtomOrDescriptor(const AtomDescriptor &_lhs, const AtomDescriptor &_rhs);
 | 
|---|
 | 76 | };
 | 
|---|
 | 77 | 
 | 
|---|
 | 78 | class AtomNotDescriptor : public AtomDescriptor
 | 
|---|
 | 79 | {
 | 
|---|
 | 80 |   friend AtomNotDescriptor operator!(const AtomDescriptor &arg);
 | 
|---|
 | 81 | public:
 | 
|---|
 | 82 |   AtomNotDescriptor(const AtomNotDescriptor &);
 | 
|---|
 | 83 |   ~AtomNotDescriptor();
 | 
|---|
 | 84 | 
 | 
|---|
 | 85 |   virtual desc_ptr clone() const;
 | 
|---|
 | 86 |   virtual bool predicate(std::pair<int,atom*>);
 | 
|---|
 | 87 | 
 | 
|---|
 | 88 | private:
 | 
|---|
 | 89 |   desc_ptr arg;
 | 
|---|
 | 90 | 
 | 
|---|
 | 91 |   // protected constructor to enforce construction through operators
 | 
|---|
 | 92 |   AtomNotDescriptor(const AtomDescriptor &_arg);
 | 
|---|
 | 93 | };
 | 
|---|
 | 94 | 
 | 
|---|
 | 95 | // no true short circuit, but the test of the second descriptor wont be done
 | 
|---|
 | 96 | AtomAndDescriptor operator&&(const AtomDescriptor &lhs, const AtomDescriptor &rhs);
 | 
|---|
 | 97 | AtomOrDescriptor  operator||(const AtomDescriptor &lhs, const AtomDescriptor &rhs);
 | 
|---|
 | 98 | AtomNotDescriptor operator!(const AtomDescriptor &arg);
 | 
|---|
 | 99 | 
 | 
|---|
| [fc1b24] | 100 | #endif /* ATOMDESCRIPTOR_HPP_ */
 | 
|---|