Teuchos Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
TestClasses.hpp
Go to the documentation of this file.
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_TEST_CLASSES_HPP
43 #define TEUCHOS_TEST_CLASSES_HPP
44 
45 
46 #include "Teuchos_RCP.hpp"
47 
48 
49 // Return constants from class functions
50 const int A_g_return = 1;
51 const int A_f_return = 2;
52 const int B1_g_return = 3;
53 const int B1_f_return = 4;
54 const int B2_g_return = 5;
55 const int B2_f_return = 6;
56 const int C_g_return = 7;
57 const int C_f_return = 8;
58 const int D_g_return = 9;
59 const int D_f_return = 10;
60 const int E_g_return = 11;
61 const int E_f_return = 12;
62 
63 
64 /*
65 
66  Polymorphic multiple inheritance example
67 
68  -----
69  | A |
70  -----
71  /|\
72  |
73  ------------
74  | |
75  ----- ------
76  | B1 | | B2 |
77  ----- ------
78  /|\ /|\
79  | |
80  ------------
81  |
82  -----
83  | C |
84  -----
85 
86 */
87 
88 
89 class C;
90 
91 
92 class A {
93  int A_g_, A_f_;
94 public:
96  A(const int A_g, const int A_f) : A_g_(A_g), A_f_(A_f) {}
97  static Teuchos::RCP<A> create() { return Teuchos::rcp(new A); }
98  virtual ~A() TEUCHOS_NOEXCEPT_FALSE; // See below
99  virtual int A_g() { return A_g_; }
100  virtual int A_f() const { return A_f_; }
101  int call_C_f();
102 private:
104 public:
105  void set_C(const Teuchos::RCP<C> &c ) { c_ = c; }
106 };
107 
108 
109 class B1 : virtual public A {
110  int B1_g_, B1_f_;
111 public:
113  ~B1() { B1_g_ = -1; B1_f_ = -1; }
114  static Teuchos::RCP<B1> create() { return Teuchos::rcp(new B1); }
115  virtual int B1_g() { return B1_g_; }
116  virtual int B1_f() const { return B1_f_; }
117 };
118 
119 
120 class B2 : virtual public A {
121  int B2_g_, B2_f_;
122 public:
124  static Teuchos::RCP<B2> create() { return Teuchos::rcp(new B2); }
125  ~B2() { B2_g_ = -1; B2_f_ = -1; }
126  virtual int B2_g() { return B2_g_; }
127  virtual int B2_f() const { return B2_f_; }
128 };
129 
130 
131 class C : virtual public B1, virtual public B2
132 {
133  int C_g_, C_f_;
134 public:
136  {
137  A_g_on_delete_ = -2;
138  }
139  static Teuchos::RCP<C> create() { return Teuchos::rcp(new C); }
140  ~C()
141  {
142  C_g_ = -1; C_f_ = -1;
143  }
144  virtual int C_g() { return C_g_; }
145  virtual int C_f() const { return C_f_; }
146  int call_A_g() { return a_->A_g(); }
147  static int get_A_g_on_delete() { return A_g_on_delete_; }
148 private:
150  static int A_g_on_delete_;
151 public:
152  void set_A(const Teuchos::RCP<A> &a ) { a_ = a; }
153  Teuchos::RCP<A> get_A() { return a_; }
154 };
155 
156 
157 // Need to put these here if we have circular references
158 
159 inline
160 A::~A() TEUCHOS_NOEXCEPT_FALSE { A_g_ = -1; A_f_ = -1; }
161 
162 
163 inline
164 int A::call_C_f() { return c_->C_f(); }
165 
166 
168  const A *a_;
170  Get_A_f_return();
171 public:
172  Get_A_f_return( const A *a, int *a_f_return ) : a_(a), a_f_return_(a_f_return) {}
174 };
175 
176 
177 void deallocA(A* ptr);
178 
179 
180 void deallocHandleA(A** handle);
181 
182 
183 /*
184 
185  Non-polymophic classes hiearchy examlpe
186 
187  -----
188  | D |
189  -----
190  /|\
191  |
192  -----
193  | E |
194  -----
195 
196 */
197 
198 
199 class D
200 {
201  int D_g_, D_f_;
202 public:
204  int D_g() { return D_g_; }
205  int D_f() const { return D_f_; }
206 };
207 
208 
209 class E : public D
210 {
211  int E_g_, E_f_;
212 public:
214  int E_g() { return E_g_; }
215  int E_f() const { return E_f_; }
216 };
217 
218 
219 /*
220 
221 Typedef to pointer for undefined struct as an opaque object type without a
222 specialization of TypeNameTraits.
223 
224 This simulates what happens with a lot of MPI implementations.
225 
226 */
227 
228 struct UndefinedType; // Forward declared but never defined!
232 const int getOpaqueValue_return = 5;
233 int getOpaqueValue( Opaque_handle opaque );
234 void destroyOpaque( Opaque_handle * opaque );
235 
236 
237 /*
238 
239 Typedef to pointer for an undefiend struct as an opaque object type out a
240 specialization of TypeNameTraits of the actually type.
241 
242 This allows it to be stored in an RCP object itself.
243 
244 */
245 
246 struct UndefinedType2; // Forward declared but never defined!
251 int getOpaque2Value( Opaque2_handle opaque );
252 void destroyOpaque2( Opaque2_handle * opaque );
253 
254 
255 namespace Teuchos {
256 
257 
258 // Here we define the traits for the underlying type itself.
259 template<>
261 public:
262  static std::string name() { return "UndefinedType2"; }
263  static std::string concreteName(const UndefinedType2&)
264  { return name(); }
265 };
266 
267 
268 } // namespace Teuchos
269 
270 
271 /*
272 
273 Typedef to pointer for an undefiend struct as an opaque object type out a
274 specialization of TypeNameTraits of the actually type.
275 
276 This allows handles to the type be used with Array, ArrayRCP, and ArrayView.
277 However, this type can *not* be used with RCP since it does not define a
278 TypeNameTraits specialization for the underlying undefined type.
279 
280 This simulates what can happen with MPI implementations.
281 
282 */
283 
284 struct UndefinedType3; // Forward declared but never defined!
285 typedef UndefinedType3* Opaque3_handle;
287 
288 
289 namespace Teuchos {
290 
291 // Here we only define the traits class for the handle type and we don't even
292 // need to worry about what the underlying type is (unless we already have a
293 // speicalization defined for it).
294 template<>
296 public:
297  static std::string name() { return "Opaque3_handle"; }
298  static std::string concreteName(Opaque3_handle)
299  { return name(); }
300 };
301 
302 
303 } // namespace Teuchos
304 
305 
306 #endif // TEUCHOS_TEST_CLASSES_HPP
int E_f_
~C()
void destroyOpaque(Opaque_handle *opaque)
Definition: TestClasses.cpp:83
void set_C(const Teuchos::RCP< C > &c)
static Teuchos::RCP< B1 > create()
const int E_f_return
Definition: TestClasses.hpp:61
const int B2_g_return
Definition: TestClasses.hpp:54
virtual int B2_g()
int B2_f_
int B1_g_
virtual int A_g()
Definition: TestClasses.hpp:99
const Opaque_handle OPAQUE_HANDLE_NULL
A(const int A_g, const int A_f)
Definition: TestClasses.hpp:96
int call_C_f()
static Teuchos::RCP< C > create()
virtual int C_f() const
A()
Definition: TestClasses.hpp:95
const int C_g_return
Definition: TestClasses.hpp:56
int C_g_
static Teuchos::RCP< A > create()
Definition: TestClasses.hpp:97
const int C_f_return
Definition: TestClasses.hpp:57
const int A_f_return
Definition: TestClasses.hpp:51
int D_f() const
const int getOpaqueValue_return
void destroyOpaque2(Opaque2_handle *opaque)
const Opaque2_handle OPAQUE2_HANDLE_NULL
UndefinedType2 * Opaque2_handle
int A_f_
Definition: TestClasses.hpp:93
int A_g_
Definition: TestClasses.hpp:93
const int getOpaque2Value_return
static int A_g_on_delete_
Teuchos::RCP< A > get_A()
void deallocHandleA(A **handle)
Definition: TestClasses.cpp:55
const int D_f_return
Definition: TestClasses.hpp:59
int call_A_g()
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.
int E_f() const
int getOpaqueValue(Opaque_handle opaque)
Definition: TestClasses.cpp:77
virtual int B2_f() const
virtual int B1_g()
int B1_f_
int D_g_
Opaque2_handle createOpaque2()
Definition: TestClasses.cpp:96
const Opaque3_handle OPAQUE3_HANDLE_NULL
static std::string concreteName(const UndefinedType2 &)
static Teuchos::RCP< B2 > create()
Teuchos::RCP< A > a_
void set_A(const Teuchos::RCP< A > &a)
static std::string concreteName(Opaque3_handle)
static int get_A_g_on_delete()
UndefinedType * Opaque_handle
Get_A_f_return(const A *a, int *a_f_return)
#define TEUCHOS_NOEXCEPT_FALSE
Ptr< T > ptr(T *p)
Create a pointer to an object from a raw pointer.
const int D_g_return
Definition: TestClasses.hpp:58
const int B1_f_return
Definition: TestClasses.hpp:53
int D_g()
Teuchos::RCP< C > c_
Default traits class that just returns typeid(T).name().
UndefinedType3 * Opaque3_handle
const int B1_g_return
Definition: TestClasses.hpp:52
int getOpaque2Value(Opaque2_handle opaque)
Opaque_handle createOpaque()
Definition: TestClasses.cpp:69
int C_f_
int E_g_
virtual int A_f() const
virtual int B1_f() const
int D_f_
int E_g()
Reference-counted pointer class and non-member templated function implementations.
const int A_g_return
Definition: TestClasses.hpp:50
const int E_g_return
Definition: TestClasses.hpp:60
const int B2_f_return
Definition: TestClasses.hpp:55
virtual int C_g()
int B2_g_
void deallocA(A *ptr)
Definition: TestClasses.cpp:48