/* * AtomDescriptor.hpp * * Created on: Feb 5, 2010 * Author: crueger */ #ifndef ATOMDESCRIPTOR_HPP_ #define ATOMDESCRIPTOR_HPP_ #include #include #include #include "World.hpp" class World; class atom; // internal implementation, allows assignment, copying etc class AtomDescripter_impl; class AtomDescriptor { // close coupling to the world to allow access friend atom* World::getAtom(AtomDescriptor descriptor); friend std::vector World::getAllAtoms(AtomDescriptor descriptor); friend class World::AtomIterator; friend AtomDescriptor operator&&(const AtomDescriptor &lhs, const AtomDescriptor &rhs); friend AtomDescriptor operator||(const AtomDescriptor &lhs, const AtomDescriptor &rhs); friend AtomDescriptor operator!(const AtomDescriptor &arg); public: typedef boost::shared_ptr impl_ptr; AtomDescriptor(impl_ptr); AtomDescriptor(const AtomDescriptor&); ~AtomDescriptor(); AtomDescriptor &operator=(AtomDescriptor &); protected: atom* find(); std::vector findAll(); impl_ptr get_impl() const; private: impl_ptr impl; }; // Functions to construct actual descriptors AtomDescriptor AllAtoms(); AtomDescriptor NoAtoms(); // no true short circuit, but the test of the second descriptor wont be done AtomDescriptor operator&&(const AtomDescriptor &lhs, const AtomDescriptor &rhs); AtomDescriptor operator||(const AtomDescriptor &lhs, const AtomDescriptor &rhs); AtomDescriptor operator!(const AtomDescriptor &arg); #endif /* ATOMDESCRIPTOR_HPP_ */