/* * This file is part of rasdaman community. * * Rasdaman community is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Rasdaman community is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with rasdaman community. If not, see . * * Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / rasdaman GmbH. * * For more information please see * or contact Peter Baumann via . / /** * INCLUDE: ref.hh * * MODULE: rasodmg * CLASS: r_Ref, r_Ref_Any * * COMMENTS: * None */ #ifndef _D_REF_ #define _D_REF_ #include "raslib/error.hh" #include "raslib/oid.hh" class r_Object; class r_Point; class r_Sinterval; class r_Minterval; class r_Oid; class r_Scalar; class r_Primitive; class r_Structure; //@ManMemo: Module: {\bf rasodmg} /** The class \Ref{r_Ref_Any} is defined to support a reference to any type. Its primary purpose is to handle generic refernces and allow conversions of \Ref{r_Ref}s in the type hierarchy. A \Ref{r_Ref_Any} object can be used as an intermediary between any two types \Ref{r_Ref} and \Ref{r_Ref} where X and Y are different types. A \Ref{r_Ref} can always be converted to a \Ref{r_Ref_Any}; there is a function to perform the conversion in the \Ref{r_Ref} template. Each \Ref{r_Ref} class has a constructor and assignment operator that takes a reference to a \Ref{r_Ref_Any}. */ class r_Ref_Any { public: /// default constructor r_Ref_Any(); /// copy constructor r_Ref_Any( const r_Ref_Any& ); /// constructor for creating a reference with an oid r_Ref_Any( const r_OId& initOId ); /** Dereferencing the self object results in loading the object with {\tt initOId}. */ /// constructor getting a pointer to a persistent capable object r_Ref_Any( r_Object* ); /// constructor getting a general pointer r_Ref_Any( void* ); /// destructor deletes referenced object from main memory and database ~r_Ref_Any(); /// assignment operator for assigning a \Ref{r_Ref_Any} pointer r_Ref_Any& operator=( const r_Ref_Any& ); /// assignment operator for assigning a pointer to a persistent capable object r_Ref_Any& operator=( r_Object* ); /// delete from main memory void destroy(); /// deletes referenced object from main memory and database void delete_object(); //@Man: Cast operators: //@{ /// /// operator const void*() const; /// operator void*(); /// operator r_Point*(); /// operator r_Sinterval*(); /// operator r_Minterval*(); /// operator r_OId*(); /// operator r_Scalar*(); /// operator r_Structure*(); /// operator r_Primitive*(); /// //@} /// operator for validity test int operator!() const; /// method for reference validity test int is_null() const; /** The method delivers true iff the oid and/or the memory pointer are valid. */ //@Man: Comparison operators: //@{ /// /// int operator==( const r_Ref_Any& ) const; /// int operator!=( const r_Ref_Any& ) const; /// compares the memory pointer (does not load the object) int operator==( const r_Object* ) const; /// compares the memory pointer (does not load the object) int operator!=( const r_Object* ) const; /// //@} /// get oid inline const r_OId& get_oid() const; //@Man: Methods for internal use only //@{ /// /// constructor getting oid and memory pointer r_Ref_Any( const r_OId&, r_Object* ); /// inline unsigned int is_oid_valid() const; /// get memory pointer (without loading the object) void* get_memory_ptr() const; /// //@} private: /// main memory pointer void* memptr; /// object identifier r_OId oid; }; //@ManMemo: Module: {\bf rasodmg} /** References of type \Ref{r_Ref} in many respects behave like C++ pointers but provide an additional mechanism that guarantees integrity in references to persistent objects. \Ref{r_Ref} implements a so called {\bf smart pointer} which behaves like a C++ pointer but can do additional things in time of dereferencing the pointer. In case that no valid memory pointer is available, which means that the object is not present, and an oid is existing, the object belonging to the oid is read from the db and the new memory pointer is given back. */ template class r_Ref { public: /// default constructor r_Ref(); /// constructor for r_Ref_Any objects r_Ref( const r_Ref_Any& ); /// constructor for creating a reference with an oid r_Ref( const r_OId& initOId ); /** Dereferencing the self object results in loading the object with {\tt initOId}. */ /// copy constructor r_Ref( const r_Ref& ); /// destructor deletes referenced object from main memory and database ~r_Ref(); /// cast to \Ref{r_Ref_Any} operator r_Ref_Any() const; // cast to const \Ref{r_Ref_Any} // operator const r_Ref_Any() const; /// assignment operator for assigning a \Ref{r_Ref_Any} r_Ref& operator=( const r_Ref_Any& ); /// assignment operator for assigning a C pointer r_Ref& operator=( T* ); // assignment operator for assigning a r_Ref pointer // r_Ref& operator=( r_Ref& ); /// assignment operator for assigning a r_Ref pointer r_Ref& operator=( const r_Ref& ); /// dereference operator (error kinds: r_Error_RefNull, r_Error_RefInvalid) const T& operator*() const throw (r_Error); /// dereference operator (error kinds: r_Error_RefNull, r_Error_RefInvalid) T& operator*() throw( r_Error ); /** If the memory pointer is zero and the oid is valid, the object is loaded from the server and a reference to the object in memory is returned. */ const T* operator->() const throw (r_Error); /// operator for dereferencing the reference (error kinds: r_Error_RefNull, r_Error_RefInvalid) T* operator->() throw( r_Error ); /** If the memory pointer is zero and the oid is valid, the object is loaded from the server and the new memory location is returned. */ const T* ptr() const throw (r_Error); /// method for dereferencing the reference (error kinds: r_Error_RefNull, r_Error_RefInvalid) T* ptr() throw( r_Error ); /** If the memory pointer is zero and the oid is valid, the object is loaded from the server and the new memory location is returned. */ /// operator for validity test int operator!() const; /// method for reference validity test int is_null() const; /** The method delivers true iff the oid and/or the memory pointer are valid. */ //@Man: Comparison operators: //@{ /// /// int operator==( const r_Ref& refR ) const; /// int operator!=( const r_Ref& refR ) const; /// compares the memory pointer (does not load the object) int operator==( const T* ) const; /// compares the memory pointer (does not load the object) int operator!=( const T* ) const; /// //@} /// delete from main memory void destroy(); /// deletes referenced object from main memory and database void delete_object(); /// get oid inline const r_OId& get_oid() const; //@Man: Methods for internal use only //@{ /// /// constructor getting memory pointer r_Ref( T* ); /// constructor getting oid and memory pointer r_Ref( const r_OId&, T* ); /// get memory pointer (without loading the object) T* get_memory_ptr() const; /// inline unsigned int is_oid_valid() const; /// //@} private: /// loads an object from database void load_object() const; /// main memory pointer mutable T* memptr; /// object identifier r_OId oid; }; #include "rasodmg/ref.icc" #endif