Teuchos - Trilinos Tools Package Version of the Day
Teuchos_Handle.hpp
00001 // @HEADER
00002 // ***********************************************************************
00003 //
00004 //                    Teuchos: Common Tools Package
00005 //                 Copyright (2004) Sandia Corporation
00006 //
00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00008 // license for use of this work by or on behalf of the U.S. Government.
00009 //
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
00038 //
00039 // ***********************************************************************
00040 // @HEADER
00041 
00042 #ifndef TEUCHOS_HANDLE_HPP
00043 #define TEUCHOS_HANDLE_HPP
00044 
00045 #include "Teuchos_ConfigDefs.hpp"
00046 #include "Teuchos_RCP.hpp"
00047 #include "Teuchos_Describable.hpp"
00048 #include "Teuchos_Handleable.hpp"
00049 
00050 namespace Teuchos 
00051 {
00052 
00078   template <typename PointerType> 
00079   class ConstHandle : public virtual Describable
00080   {
00081   public:
00083     ConstHandle(const RCP<const PointerType>& ptr) : ptr_(ptr) {;}
00086     explicit ConstHandle(const ConstHandleable<PointerType>* ptr) : ptr_(ptr->getConstRcp()) {;}
00088     const RCP<const PointerType>& constPtr() const {return ptr_;}
00090     const PointerType * const rawPtr() {return this->constPtr().get();}
00091   protected:
00093     explicit ConstHandle() : ptr_() {;}
00098     void setRcp(const RCP<PointerType>& ptr) 
00099     {ptr_=rcp_const_cast<const PointerType>(ptr);}
00104     RCP<PointerType> nonConstPtr() const
00105     {return rcp_const_cast<PointerType>(ptr_);}
00106   private:
00108     RCP<const PointerType> ptr_;
00109   };
00110 
00134   template <typename PointerType> 
00135   class Handle : public virtual ConstHandle<PointerType>
00136   {
00137   public:
00139     Handle()
00140       : ConstHandle<PointerType>() {}
00142     Handle(const RCP<PointerType>& smartPtr)
00143       : ConstHandle<PointerType>() 
00144     {
00145       /* \brief We need to set the rcp in the base class */
00146       setRcp(smartPtr);
00147     }
00153     explicit Handle(Handleable<PointerType>* rawPtr)
00154       : ConstHandle<PointerType>()
00155     {
00156       /* \brief We need to set the rcp in the base class. */
00157       setRcp(rawPtr->getRcp());
00158     }
00161     RCP<PointerType> ptr() const {return this->nonConstPtr();}
00163     PointerType* rawPtr() const {return this->nonConstPtr().get();}
00164   };
00165 
00166 } // namespace Teuchos
00167 
00179 #define TEUCHOS_HANDLE_CTORS(handle, contents) \
00180 handle() : Teuchos::Handle<contents >() {;} \
00181 handle(Teuchos::Handleable<contents >* rawPtr) : Teuchos::Handle<contents >(rawPtr) {;} \
00182 handle(const Teuchos::RCP<contents >& smartPtr) : Teuchos::Handle<contents >(smartPtr){;}
00183 
00195 #define TEUCHOS_CONST_HANDLE_CTORS(handle, contents) \
00196 handle( Teuchos::ENull _null = Teuchos::null ) : Teuchos::ConstHandle<contents >() {;} \
00197 handle(const Teuchos::ConstHandleable<contents >* rawPtr) : Teuchos::ConstHandle<contents >(rawPtr) {;} \
00198 handle(const Teuchos::RCP<const contents >& smartPtr) : Teuchos::ConstHandle<contents >(smartPtr){;}
00199 
00200 #endif // TEUCHOS_CONSTHANDLE_HPP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines