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.
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.
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.
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.