Teuchos Package Browser (Single Doxygen Collection) Version of the Day
RCP_ForwardDeclUnitTests.cpp
Go to the documentation of this file.
00001 /*
00002 // @HEADER
00003 // ***********************************************************************
00004 //
00005 //                    Teuchos: Common Tools Package
00006 //                 Copyright (2004) Sandia Corporation
00007 //
00008 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00009 // license for use of this work by or on behalf of the U.S. Government.
00010 //
00011 // Redistribution and use in source and binary forms, with or without
00012 // modification, are permitted provided that the following conditions are
00013 // met:
00014 //
00015 // 1. Redistributions of source code must retain the above copyright
00016 // notice, this list of conditions and the following disclaimer.
00017 //
00018 // 2. Redistributions in binary form must reproduce the above copyright
00019 // notice, this list of conditions and the following disclaimer in the
00020 // documentation and/or other materials provided with the distribution.
00021 //
00022 // 3. Neither the name of the Corporation nor the names of the
00023 // contributors may be used to endorse or promote products derived from
00024 // this software without specific prior written permission.
00025 //
00026 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00027 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00028 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00029 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00030 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00031 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00032 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00033 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00034 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00035 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00036 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00037 //
00038 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
00039 //
00040 // ***********************************************************************
00041 // @HEADER
00042 */
00043 
00044 #include "Teuchos_RCP.hpp"
00045 #include "Teuchos_UnitTestHarness.hpp"
00046 
00047 
00048 /*
00049  * This test checks that you can use non-owning Teuchos::RCP with pointers to
00050  * types that are only forward declared and not defined.
00051  */
00052 
00053 namespace DummyNS {class UndefinedType;}
00054 
00055 namespace Teuchos {
00056 TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(DummyNS::UndefinedType);
00057 } // namespace Teuchos
00058 
00059 
00060 namespace {
00061 
00062 
00063 using Teuchos::rcp;
00064 using Teuchos::rcpFromRef;
00065 using Teuchos::rcpFromUndefRef;
00066 using Teuchos::RCP;
00067 
00068 using DummyNS::UndefinedType;
00069 
00070 
00071 TEUCHOS_UNIT_TEST( RCP, ForwardDeclaredUndefined )
00072 {
00073   // This test ensures that you can declare a null RCP object to an undefined
00074   // type without trouble.
00075   RCP<UndefinedType> ut_rcp;
00076 }
00077 
00078 
00079 TEUCHOS_UNIT_TEST( RCP, ForwardDeclaredUndefined_rcp )
00080 {
00081   // This test ensures that you can set a pointer to an undefined type without
00082   // trouble.  Note that this has to be a non-owning RCP otherwise there will
00083   // be issues with the destructor call.
00084   UndefinedType *ut_ptr = 0;
00085   RCP<UndefinedType> ut_rcp =
00086 #if defined(HAS_TEUCHOS_GET_BASE_OBJ_VOID_PTR) 
00087     rcpFromUndefRef(*ut_ptr)
00088   // In this case, you have to use rcpFromUndefRef(...) in this case instead
00089   // of rcpFromRef() because the latter requires the object to be defined in
00090   // order to call dynamic_cast<const void*>(...) in order to get the base
00091   // object address needed for RCPNode tracing.
00092 #else
00093     rcpFromRef(*ut_ptr)
00094     // In this case, you can use rcpFromRef(...) because the object's baseq
00095     // address will not be looked up using dynamic_cast and no deallocator
00096     // needing to know the object's will be compiled.
00097 #endif
00098     ;
00099 }
00100 
00101 
00102 } // namespace
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines