Teuchos - Trilinos Tools Package  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Teuchos_OpaqueWrapper.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_OPAQUE_WRAPPER_HPP
43 #define TEUCHOS_OPAQUE_WRAPPER_HPP
44 
45 
46 #include "Teuchos_RCP.hpp"
47 
48 
49 //#define TEUCHOS_OPAQUE_WRAPPER_ANNOUNCE_FREE
50 
51 #ifdef TEUCHOS_OPAQUE_WRAPPER_ANNOUNCE_FREE
52 # include "Teuchos_VerboseObject.hpp"
53 #endif // TEUCHOS_OPAQUE_WRAPPER_ANNOUNCE_FREE
54 
55 
56 namespace Teuchos {
57 
58 
239 template <class Opaque>
241 public:
246  OpaqueWrapper( Opaque opaque )
247  : opaque_(opaque)
248  {}
263  operator Opaque () const
264  { return opaque_; }
270  Opaque operator()() const
271  { return opaque_; }
272 protected:
279  Opaque opaque_;
280 private:
281  OpaqueWrapper(); // Not defined
282  OpaqueWrapper(const OpaqueWrapper&); // Not defined
283  OpaqueWrapper& operator=(const OpaqueWrapper&); // Not defined
284 };
285 
311 template <class Opaque, class OpaqueFree>
312 class OpaqueWrapperWithFree : public OpaqueWrapper<Opaque> {
313 public:
315  OpaqueWrapperWithFree( Opaque opaque, OpaqueFree opaqueFree )
316  : OpaqueWrapper<Opaque>(opaque), opaqueFree_(opaqueFree)
317  {}
320  {
321  // FIXME (mfh 10 Sep 2012) This only works if the free function is
322  // a raw function pointer, not if it is a general "function object"
323  // (i.e., something callable via operator()).
324  if(opaqueFree_) {
325 #ifdef TEUCHOS_OPAQUE_WRAPPER_ANNOUNCE_FREE
328  Teuchos::OSTab tab(out);
329  *out << "\nOpaqueWrapperWithFree::~OpaqueWrapperWithFree(): Freeing opaque object"
330  << " of type " << TypeNameTraits<Opaque>::name() << "!\n";
331 #endif // TEUCHOS_OPAQUE_WRAPPER_ANNOUNCE_FREE
332  opaqueFree_(&this->opaque_);
333  }
334  }
335 private:
337  OpaqueFree opaqueFree_;
338  OpaqueWrapperWithFree(); // Not defined
339  OpaqueWrapperWithFree(const OpaqueWrapperWithFree&); // Not defined
340  OpaqueWrapperWithFree& operator=(const OpaqueWrapperWithFree&); // Not defined
341 };
342 
343 
351 template <class Opaque>
352 inline
353 RCP<OpaqueWrapper<Opaque> >
354 opaqueWrapper( Opaque opaque)
355 {
356  return rcp(new OpaqueWrapper<Opaque>(opaque));
357 }
358 
359 
367 template <class Opaque, class OpaqueFree>
368 inline
370 opaqueWrapper( Opaque opaque, OpaqueFree opaqueFree)
371 {
372  return rcp(new OpaqueWrapperWithFree<Opaque,OpaqueFree>(opaque,opaqueFree));
373 }
374 
375 
376 } // namespace Teuchos
377 
378 
379 #endif // TEUCHOS_OPAQUE_WRAPPER_HPP
RCP< OpaqueWrapper< Opaque > > opaqueWrapper(Opaque opaque, OpaqueFree opaqueFree)
Create a new OpaqueWrapper object with a free function.
Opaque operator()() const
Explicit type conversion from wrapper to raw handle.
OpaqueWrapper(Opaque opaque)
Constructor that accepts and wraps a raw handle.
~OpaqueWrapperWithFree()
Destructor: invokes the free function.
Tabbing class for helping to create formated, indented output for a basic_FancyOStream object...
RCP< OpaqueWrapper< Opaque > > opaqueWrapper(Opaque opaque)
Create a new OpaqueWrapper object without a free function.
Base class for wrapped opaque objects.
Opaque opaque_
The actual handle.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.
Subclass for wrapped opaque objects with a free function.
OpaqueWrapperWithFree(Opaque opaque, OpaqueFree opaqueFree)
Constructor: takes the opaque handle, and its free function.
static RCP< FancyOStream > getDefaultOStream()
Get the default output stream object.
Smart reference counting pointer class for automatic garbage collection.
Reference-counted pointer class and non-member templated function implementations.