Teuchos - Trilinos Tools Package Version of the Day
Loading...
Searching...
No Matches
Teuchos_ConstNonconstObjectContainer.hpp
1// @HEADER
2// ***********************************************************************
3//
4// Teuchos: Common Tools Package
5// Copyright (2004) Sandia Corporation
6//
7// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8// license for use of this work by or on behalf of the U.S. Government.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38//
39// ***********************************************************************
40// @HEADER
41
42#ifndef TEUCHOS_CONST_NONCONST_OBJECT_CONTAINER_HPP
43#define TEUCHOS_CONST_NONCONST_OBJECT_CONTAINER_HPP
44
45#include "Teuchos_RCP.hpp"
46
47
48namespace Teuchos {
49
50
274template<class ObjType>
276public:
279 :constObj_(null),isConst_(true) {}
282 { initialize(obj); }
285 { initialize(obj); }
288 void initialize( const RCP<ObjType> &obj )
289 {
291 constObj_ = obj;
292 isConst_ = false;
293 }
297 {
299 constObj_ = obj;
300 isConst_ = true;
301 }
304 { constObj_=null; isConst_=true; }
307 { uninitialize(); return *this; }
309 bool isConst() const
310 { return isConst_; }
326 {
328 constObj_.get() && isConst_, NonconstAccessError,
329 "Error, the object of reference type \""<<TypeNameTraits<ObjType>::name()
330 <<"\" was given as a const-only object and non-const access is not allowed."
331 );
332 return rcp_const_cast<ObjType>(constObj_);
333 }
340 { return constObj_; }
343 { return getConstObj(); }
350 const ObjType* operator->() const
351 { return &*getConstObj(); } // Does assert also!
358 const ObjType& operator*() const
359 { return *getConstObj(); }
361 operator RCP<const ObjType>() const
362 { return getConstObj(); }
364 int count() const
365 { return constObj_.count(); }
366
367private:
368 RCP<const ObjType> constObj_;
369 bool isConst_;
370};
371
372
377template<class T>
379{ return is_null(p.getConstObj()); }
380
381
386template<class T>
388{ return nonnull(p.getConstObj()); }
389
390
391} // namespace Teuchos
392
393
394#endif // TEUCHOS_CONST_NONCONST_OBJECT_CONTAINER_HPP
Reference-counted pointer class and non-member templated function implementations.
Simple class supporting the "runtime protection of const" idiom.
const ObjType & operator*() const
Dereference the underlying object.
ConstNonconstObjectContainer< ObjType > & operator=(ENull)
RCP< const ObjType > operator()() const
Perform shorthand for getConstObj().
RCP< ObjType > getNonconstObj() const
Get an RCP to the non-const contained object.
bool is_null(const ConstNonconstObjectContainer< T > &p)
Returns true if p.get()==NULL.
ConstNonconstObjectContainer(const RCP< ObjType > &obj)
. Calls initialize() with a non-const object.
RCP< const ObjType > getConstObj() const
Get an RCP to the const contained object.
ConstNonconstObjectContainer(const RCP< const ObjType > &obj)
. Calls initialize() with a const object.
void initialize(const RCP< const ObjType > &obj)
. Initialize using a const object. Allows only const access enforced with a runtime check.
bool isConst() const
Returns true if const-only access to the object is allowed.
void initialize(const RCP< ObjType > &obj)
. Initialize using a non-const object. Allows both const and non-const access to the contained object...
const ObjType * operator->() const
Pointer (->) access to underlying const object.
bool nonnull(const ConstNonconstObjectContainer< T > &p)
Returns true if p.get()!=NULL.
Null reference error exception class.
Null reference error exception class.
Smart reference counting pointer class for automatic garbage collection.
T * get() const
Get the raw C++ pointer to the underlying object.
Default traits class that just returns typeid(T).name().
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
bool is_null(const std::shared_ptr< T > &p)
Returns true if p.get()==NULL.
bool nonnull(const std::shared_ptr< T > &p)
Returns true if p.get()!=NULL.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...