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.hpp

    r973c03 r323177  
    1717class atom;
    1818
    19 class AtomDescriptor
    20 {
     19// internal implementation, allows assignment, copying etc
     20class AtomDescripter_impl;
     21
     22class AtomDescriptor {
     23  friend atom* World::getAtom(AtomDescriptor descriptor);
     24  friend std::vector<atom*> World::getAllAtoms(AtomDescriptor descriptor);
     25
     26  friend AtomDescriptor operator&&(const AtomDescriptor &lhs, const AtomDescriptor &rhs);
     27  friend AtomDescriptor operator||(const AtomDescriptor &lhs, const AtomDescriptor &rhs);
     28  friend AtomDescriptor operator!(const AtomDescriptor &arg);
     29
    2130public:
     31  typedef boost::shared_ptr<AtomDescriptor_impl> impl_ptr;
    2232
    23   typedef boost::shared_ptr<AtomDescriptor> desc_ptr;
     33  AtomDescriptor(impl_ptr);
     34  AtomDescriptor(const AtomDescriptor&);
     35  ~AtomDescriptor();
    2436
    25   friend atom* World::getAtom(AtomDescriptor& descriptor);
    26   friend std::vector<atom*> World::getAllAtoms(AtomDescriptor& descriptor);
    27 
    28   AtomDescriptor();
    29   virtual ~AtomDescriptor();
    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;
     37  AtomDescriptor &operator=(AtomDescriptor &);
    3538
    3639protected:
    37   virtual atom* find();
    38   virtual std::vector<atom*> findAll();
    39   std::map<int,atom*>& getAtoms();
     40  atom* find();
     41  std::vector<atom*> findAll();
     42  impl_ptr get_impl() const;
     43
     44private:
     45  impl_ptr impl;
    4046};
    4147
    42 class AtomAndDescriptor : public AtomDescriptor
    43 {
    44   friend AtomAndDescriptor operator&&(const AtomDescriptor &lhs, const AtomDescriptor &rhs);
    45 public:
    46   AtomAndDescriptor(const AtomAndDescriptor&);
    47   ~AtomAndDescriptor();
    48 
    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);
    58 };
    59 
    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 };
     48// Functions to construct actual descriptors
     49AtomDescriptor AllAtoms();
     50AtomDescriptor NoAtoms();
    9451
    9552// 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);
     53AtomDescriptor operator&&(const AtomDescriptor &lhs, const AtomDescriptor &rhs);
     54AtomDescriptor operator||(const AtomDescriptor &lhs, const AtomDescriptor &rhs);
     55AtomDescriptor operator!(const AtomDescriptor &arg);
    9956
    10057#endif /* ATOMDESCRIPTOR_HPP_ */
Note: See TracChangeset for help on using the changeset viewer.