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>
47 class SharedLibraryReference
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  {}
58  SharedLibraryReference(const SharedLibraryReference<T>& arg)
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>
65  SharedLibraryReference(const SharedLibraryReference<U>& arg)
66  : m_sharedLib(arg.m_sharedLib), m_obj(arg.m_obj)
67  {
68  }
70  : m_sharedLib(), m_obj()
71  {}
72  SharedLibraryReference<T>& operator=(const SharedLibraryReference<T>& arg)
73  {
74  m_obj = arg.m_obj;
75  m_sharedLib = arg.m_sharedLib;
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 
103  typedef T SharedLibraryReference::*safe_bool;
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
BLOCXX_NAMESPACE::Select::BLOCXX_DEPRECATED
const UInt32 INFINITE_TIMEOUT BLOCXX_DEPRECATED
Value that means infinite timeout.
Definition: Select.hpp:101
BLOCXX_NAMESPACE::SharedLibraryReference::operator!
bool operator!() const
Definition: SharedLibraryReference.hpp:166
BLOCXX_NAMESPACE::IntrusiveReference< SharedLibrary >
BLOCXX_NAMESPACE::SharedLibraryReference::operator=
SharedLibraryReference< T > & operator=(const SharedLibraryReference< T > &arg)
Definition: SharedLibraryReference.hpp:132
BLOCXX_NAMESPACE::SharedLibraryReference::safe_bool
T SharedLibraryReference::* safe_bool
Definition: SharedLibraryReference.hpp:163
BLOCXX_NAMESPACE
Taken from RFC 1321.
Definition: AppenderLogger.cpp:48
SharedLibrary.hpp
BLOCXX_NAMESPACE::SharedLibraryReference::~SharedLibraryReference
~SharedLibraryReference()
Definition: SharedLibraryReference.hpp:138
BLOCXX_NAMESPACE::SharedLibraryReference::m_sharedLib
SharedLibraryRef m_sharedLib
Definition: SharedLibraryReference.hpp:195
BLOCXX_NAMESPACE::SharedLibraryReference
Definition: SharedLibraryReference.hpp:78
BLOCXX_NAMESPACE::SharedLibraryReference::m_obj
T m_obj
Definition: SharedLibraryReference.hpp:196
BLOCXX_NAMESPACE::SharedLibraryReference::getLibRef
SharedLibraryRef getLibRef() const
Definition: SharedLibraryReference.hpp:150
BLOCXX_NAMESPACE::SharedLibraryReference::isNull
BLOCXX_DEPRECATED bool isNull() const
Definition: SharedLibraryReference.hpp:183
BLOCXX_NAMESPACE::SharedLibraryRef
IntrusiveReference< SharedLibrary > SharedLibraryRef
Definition: CommonFwd.hpp:156
BLOCXX_NAMESPACE::SharedLibraryReference::cast_to
SharedLibraryReference< U > cast_to() const
Definition: SharedLibraryReference.hpp:175
BLOCXX_NAMESPACE::SharedLibraryReference::SharedLibraryReference
friend class SharedLibraryReference
Definition: SharedLibraryReference.hpp:190
BLOCXX_NAMESPACE::SharedLibraryReference::setNull
void setNull()
Definition: SharedLibraryReference.hpp:168
BLOCXX_NAMESPACE::SharedLibraryReference::operator->
T::element_type * operator->() const
Definition: SharedLibraryReference.hpp:154
BLOCXX_NAMESPACE::SharedLibraryReference::element_type
T element_type
Definition: SharedLibraryReference.hpp:110
BLOCXX_NAMESPACE::SharedLibraryReference::get
T get() const
Definition: SharedLibraryReference.hpp:158