blocxx
SharedLibraryReference.hpp
Go to the documentation of this file.
1 /*******************************************************************************
2 * Copyright (C) 2005, Vintela, Inc. All rights reserved.
3 * Copyright (C) 2006, Novell, Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of
14 * Vintela, Inc.,
15 * nor Novell, Inc.,
16 * nor the names of its contributors or employees may be used to
17 * endorse or promote products derived from this software without
18 * specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 *******************************************************************************/
32 
33 
38 #ifndef BLOCXX_SHARED_LIBRARY_REFERENCE_HPP_
39 #define BLOCXX_SHARED_LIBRARY_REFERENCE_HPP_
40 #include "blocxx/BLOCXX_config.h"
41 #include "blocxx/SharedLibrary.hpp"
42 
43 namespace BLOCXX_NAMESPACE
44 {
45 
46 template <class T>
48 {
49 public:
50  typedef T element_type;
51 
52  SharedLibraryReference(const SharedLibraryRef& lib, const T& obj)
53  : m_sharedLib(lib), m_obj(obj)
54  {}
55  SharedLibraryReference(const SharedLibraryRef& lib, typename T::element_type* obj)
56  : m_sharedLib(lib), m_obj(T(obj))
57  {}
59  : m_sharedLib(arg.m_sharedLib), m_obj(arg.m_obj)
60  {
61  }
62  /* construct out of a reference to a derived type. U should be
63  derived from T */
64  template <class U>
66  : m_sharedLib(arg.m_sharedLib), m_obj(arg.m_obj)
67  {
68  }
70  : m_sharedLib(), m_obj()
71  {}
73  {
74  m_obj = arg.m_obj;
76  return *this;
77  }
79  {
80  try
81  {
82  m_obj = 0;
83  m_sharedLib = 0;
84  }
85  catch (...)
86  {
87  // don't let exceptions escape
88  }
89  }
91  {
92  return m_sharedLib;
93  }
94  typename T::element_type* operator->() const
95  {
96  return &*m_obj;
97  }
98  T get() const
99  {
100  return m_obj;
101  }
102 
104  operator safe_bool () const
105  { return (m_obj) ? &SharedLibraryReference::m_obj : 0; }
106  bool operator!() const
107  { return !m_obj; }
108  void setNull()
109  {
110  m_obj = 0;
111  m_sharedLib = 0;
112  }
113 
114  template <class U>
116  {
118  rval.m_sharedLib = m_sharedLib;
119  rval.m_obj = m_obj.cast_to<U>();
120  return rval;
121  }
122 
123  BLOCXX_DEPRECATED bool isNull() const // in 3.1.0
124  {
125  return !m_obj;
126  }
127 
128 #if !defined(__GNUC__) || __GNUC__ > 2 // causes gcc 2.95 to ICE
129  /* This is so cast_to will work */
130  template <class U> friend class SharedLibraryReference;
131 
132 private:
133 #endif
134 
136  T m_obj;
137 };
138 
139 } // end namespace BLOCXX_NAMESPACE
140 
141 #endif