#if !defined( INCLUDED_GENERIC_REFERENCE_H ) #define INCLUDED_GENERIC_REFERENCE_H /// \file /// \brief Wrappers to allow storing objects in templated containers using 'reference' semantics. /// \brief A reference to a mutable object. /// Has 'reference' semantics, except for \c 'operator==' and \c 'operator.'. /// \param Type The type of the referenced object. template class Reference { Type* m_contained; public: explicit Reference( Type& contained ) : m_contained( &contained ){ } Type& operator*() const { return *m_contained; } Type* operator->() const { return m_contained; } operator Type&() const { return *m_contained; } Type& get() const { return *m_contained; } Type* get_pointer() const { return m_contained; } }; template bool operator<( const Reference& self, const Reference& other ){ return self.get() < other.get(); } template bool operator==( const Reference& self, const Reference& other ){ return self.get() == other.get(); } /// \brief construct a reference to a mutable object. template inline Reference makeReference( Type& value ){ return Reference( value ); } /// \brief A reference to a non-mutable object. /// Has 'reference' semantics, except for \c 'operator==' and \c 'operator.'. /// \param Type The type of the referenced object. template class ConstReference { const Type* m_contained; public: explicit ConstReference( const Type& contained ) : m_contained( &contained ){ } const Type& operator*() const { return *m_contained; } const Type* operator->() const { return m_contained; } operator const Type&() const { return *m_contained; } const Type& get() const { return *m_contained; } const Type* get_pointer() const { return m_contained; } }; template bool operator<( const ConstReference& self, const ConstReference& other ){ return self.get() < other.get(); } template bool operator==( const ConstReference& self, const ConstReference& other ){ return self.get() == other.get(); } /// \brief construct a reference to a non-mutable object. template inline ConstReference makeReference( const Type& value ){ return ConstReference( value ); } #endif