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:
214 OpaqueWrapper( Opaque opaque )
215 : opaque_(opaque)
216 {}
217
231 operator Opaque () const
232 { return opaque_; }
233
238 Opaque operator()() const
239 { return opaque_; }
240protected:
247 Opaque opaque_;
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:
283 OpaqueWrapperWithFree( Opaque opaque, OpaqueFree opaqueFree )
284 : OpaqueWrapper<Opaque>(opaque), opaqueFree_(opaqueFree)
285 {}
286
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> >
322opaqueWrapper( Opaque opaque)
323{
324 return rcp(new OpaqueWrapper<Opaque>(opaque));
325}
326
327
335template <class Opaque, class OpaqueFree>
336inline
338opaqueWrapper( Opaque opaque, OpaqueFree opaqueFree)
339{
340 return rcp(new OpaqueWrapperWithFree<Opaque,OpaqueFree>(opaque,opaqueFree));
341}
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.
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.
RCP< basic_FancyOStream< CharT, Traits > > tab(const RCP< basic_FancyOStream< CharT, Traits > > &out, const int tabs=1, const std::basic_string< CharT, Traits > linePrefix="")
Create a tab for an RCP-wrapped basic_FancyOStream object to cause the indentation of all output auto...
basic_OSTab< char > OSTab
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.