Teuchos Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
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
50const int A_g_return = 1;
51const int A_f_return = 2;
52const int B1_g_return = 3;
53const int B1_f_return = 4;
54const int B2_g_return = 5;
55const int B2_f_return = 6;
56const int C_g_return = 7;
57const int C_f_return = 8;
58const int D_g_return = 9;
59const int D_f_return = 10;
60const int E_g_return = 11;
61const 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
89class C;
90
91
92class A {
93 int A_g_, A_f_;
94public:
95 A() : A_g_(A_g_return), A_f_(A_f_return) {}
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();
102private:
104public:
105 void set_C(const Teuchos::RCP<C> &c ) { c_ = c; }
106};
107
108
109class B1 : virtual public A {
111public:
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
120class B2 : virtual public A {
122public:
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
131class C : virtual public B1, virtual public B2
132{
133 int C_g_, C_f_;
134public:
135 C() : C_g_(C_g_return), C_f_(C_f_return)
136 {
137 A_g_on_delete_ = -2;
138 }
139 static Teuchos::RCP<C> create() { return Teuchos::rcp(new 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_; }
148private:
150 static int A_g_on_delete_;
151public:
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
159inline
160A::~A() TEUCHOS_NOEXCEPT_FALSE { A_g_ = -1; A_f_ = -1; }
161
162
163inline
164int A::call_C_f() { return c_->C_f(); }
165
166
168 const A *a_;
171public:
172 Get_A_f_return( const A *a, int *a_f_return ) : a_(a), a_f_return_(a_f_return) {}
174};
175
176
177void deallocA(A* ptr);
178
179
180void 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
199class D
200{
201 int D_g_, D_f_;
202public:
204 int D_g() { return D_g_; }
205 int D_f() const { return D_f_; }
206};
207
208
209class E : public D
210{
211 int E_g_, E_f_;
212public:
214 int E_g() { return E_g_; }
215 int E_f() const { return E_f_; }
216};
217
218
219/*
220
221Typedef to pointer for undefined struct as an opaque object type without a
222specialization of TypeNameTraits.
223
224This simulates what happens with a lot of MPI implementations.
225
226*/
227
228struct UndefinedType; // Forward declared but never defined!
233int getOpaqueValue( Opaque_handle opaque );
234void destroyOpaque( Opaque_handle * opaque );
235
236
237/*
238
239Typedef to pointer for an undefiend struct as an opaque object type out a
240specialization of TypeNameTraits of the actually type.
241
242This allows it to be stored in an RCP object itself.
243
244*/
245
246struct UndefinedType2; // Forward declared but never defined!
251int getOpaque2Value( Opaque2_handle opaque );
252void destroyOpaque2( Opaque2_handle * opaque );
253
254
255namespace Teuchos {
256
257
258// Here we define the traits for the underlying type itself.
259template<>
261public:
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
273Typedef to pointer for an undefiend struct as an opaque object type out a
274specialization of TypeNameTraits of the actually type.
275
276This allows handles to the type be used with Array, ArrayRCP, and ArrayView.
277However, this type can *not* be used with RCP since it does not define a
278TypeNameTraits specialization for the underlying undefined type.
279
280This simulates what can happen with MPI implementations.
281
282*/
283
284struct UndefinedType3; // Forward declared but never defined!
285typedef UndefinedType3* Opaque3_handle;
287
288
289namespace 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).
294template<>
296public:
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
const int D_g_return
void destroyOpaque(Opaque_handle *opaque)
UndefinedType2 * Opaque2_handle
UndefinedType3 * Opaque3_handle
Opaque_handle createOpaque()
const Opaque_handle OPAQUE_HANDLE_NULL
const int D_f_return
int getOpaqueValue(Opaque_handle opaque)
const int getOpaque2Value_return
const int E_g_return
const int A_f_return
const int C_f_return
const int getOpaqueValue_return
void deallocA(A *ptr)
const int B1_f_return
const Opaque3_handle OPAQUE3_HANDLE_NULL
int getOpaque2Value(Opaque2_handle opaque)
Opaque2_handle createOpaque2()
void destroyOpaque2(Opaque2_handle *opaque)
const int B2_f_return
UndefinedType * Opaque_handle
const int A_g_return
const Opaque2_handle OPAQUE2_HANDLE_NULL
const int B2_g_return
const int C_g_return
const int E_f_return
const int B1_g_return
void deallocHandleA(A **handle)
#define TEUCHOS_NOEXCEPT_FALSE
Reference-counted pointer class and non-member templated function implementations.
virtual ~A() TEUCHOS_NOEXCEPT_FALSE
Teuchos::RCP< C > c_
virtual int A_g()
int call_C_f()
int A_g_
void set_C(const Teuchos::RCP< C > &c)
virtual int A_f() const
A(const int A_g, const int A_f)
int A_f_
static Teuchos::RCP< A > create()
virtual int B1_f() const
virtual int B1_g()
int B1_f_
int B1_g_
static Teuchos::RCP< B1 > create()
virtual int B2_f() const
int B2_f_
int B2_g_
virtual int B2_g()
static Teuchos::RCP< B2 > create()
int C_g_
Teuchos::RCP< A > get_A()
int C_f_
Teuchos::RCP< A > a_
static int get_A_g_on_delete()
static int A_g_on_delete_
void set_A(const Teuchos::RCP< A > &a)
int call_A_g()
static Teuchos::RCP< C > create()
virtual int C_g()
virtual int C_f() const
int D_g()
int D_f_
int D_g_
int D_f() const
int E_f() const
int E_g_
int E_f_
int E_g()
Get_A_f_return(const A *a, int *a_f_return)
Concrete serial communicator subclass.
static std::string concreteName(Opaque3_handle)
static std::string concreteName(const UndefinedType2 &)
Default traits class that just returns typeid(T).name().
Definition PackageA.cpp:3
Definition PackageC.cpp:3
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.