Teuchos - Trilinos Tools Package Version of the Day
Loading...
Searching...
No Matches
Teuchos_OpaqueWrapper.hpp
1// @HEADER
2// *****************************************************************************
3// Teuchos: Common Tools Package
4//
5// Copyright 2004 NTESS and the Teuchos contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef TEUCHOS_OPAQUE_WRAPPER_HPP
11#define TEUCHOS_OPAQUE_WRAPPER_HPP
12
13
14#include "Teuchos_RCP.hpp"
15
16
17//#define TEUCHOS_OPAQUE_WRAPPER_ANNOUNCE_FREE
18
19#ifdef TEUCHOS_OPAQUE_WRAPPER_ANNOUNCE_FREE
20# include "Teuchos_VerboseObject.hpp"
21#endif // TEUCHOS_OPAQUE_WRAPPER_ANNOUNCE_FREE
22
23
24namespace Teuchos {
25
26
207template <class Opaque>
209public:
231 operator Opaque () const
232 { return opaque_; }
239 { return opaque_; }
240protected:
248private:
249 OpaqueWrapper(); // Not defined
250 OpaqueWrapper(const OpaqueWrapper&); // Not defined
251 OpaqueWrapper& operator=(const OpaqueWrapper&); // Not defined
252};
253
279template <class Opaque, class OpaqueFree>
280class OpaqueWrapperWithFree : public OpaqueWrapper<Opaque> {
281public:
288 {
289 // FIXME (mfh 10 Sep 2012) This only works if the free function is
290 // a raw function pointer, not if it is a general "function object"
291 // (i.e., something callable via operator()).
292 if(opaqueFree_) {
293#ifdef TEUCHOS_OPAQUE_WRAPPER_ANNOUNCE_FREE
296 Teuchos::OSTab tab(out);
297 *out << "\nOpaqueWrapperWithFree::~OpaqueWrapperWithFree(): Freeing opaque object"
298 << " of type " << TypeNameTraits<Opaque>::name() << "!\n";
299#endif // TEUCHOS_OPAQUE_WRAPPER_ANNOUNCE_FREE
300 opaqueFree_(&this->opaque_);
301 }
302 }
303private:
305 OpaqueFree opaqueFree_;
306 OpaqueWrapperWithFree(); // Not defined
307 OpaqueWrapperWithFree(const OpaqueWrapperWithFree&); // Not defined
308 OpaqueWrapperWithFree& operator=(const OpaqueWrapperWithFree&); // Not defined
309};
310
311
319template <class Opaque>
320inline
321RCP<OpaqueWrapper<Opaque> >
326
327
335template <class Opaque, class OpaqueFree>
336inline
342
343
344} // namespace Teuchos
345
346
347#endif // TEUCHOS_OPAQUE_WRAPPER_HPP
Reference-counted pointer class and non-member templated function implementations.
Subclass for wrapped opaque objects with a free function.
~OpaqueWrapperWithFree()
Destructor: invokes the free function.
OpaqueWrapperWithFree(Opaque opaque, OpaqueFree opaqueFree)
Constructor: takes the opaque handle, and its free function.
Base class for wrapped opaque objects.
Opaque operator()() const
Explicit type conversion from wrapper to raw handle.
OpaqueWrapper(Opaque opaque)
Constructor that accepts and wraps a raw handle.
RCP< OpaqueWrapper< Opaque > > opaqueWrapper(Opaque opaque)
Create a new OpaqueWrapper object without a free function.
Opaque opaque_
The actual handle.
RCP< OpaqueWrapper< Opaque > > opaqueWrapper(Opaque opaque, OpaqueFree opaqueFree)
Create a new OpaqueWrapper object with a free function.
Smart reference counting pointer class for automatic garbage collection.
static RCP< FancyOStream > getDefaultOStream()
Get the default output stream object.
Tabbing class for helping to create formated, indented output for a basic_FancyOStream object.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.