EpetraExt  Development
EpetraExt_Transform.h
Go to the documentation of this file.
1 //@HEADER
2 // ***********************************************************************
3 //
4 // EpetraExt: Epetra Extended - Linear Algebra Services Package
5 // Copyright (2011) Sandia Corporation
6 //
7 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8 // the U.S. Government retains certain rights in this software.
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 //-----------------------------------------------------------------------
43 // EpetraExt_Transform.h
44 //-----------------------------------------------------------------------
45 
46 #ifndef EPETRAEXT_TRANSFORM_H
47 #define EPETRAEXT_TRANSFORM_H
48 
49 #include <EpetraExt_ConfigDefs.h>
50 
51 #include <Teuchos_RCP.hpp>
52 
53 namespace EpetraExt {
54 
56 
63 template<typename T, typename U>
64 class Transform
65 {
66  public:
67 
70 
71  typedef T OriginalType;
72  typedef T* OriginalTypePtr;
73  typedef Teuchos::RCP<T> OriginalTypeRCP;
74  typedef T& OriginalTypeRef;
75 
76  typedef U NewType;
77  typedef U* NewTypePtr;
78  typedef Teuchos::RCP<U> NewTypeRCP;
79  typedef U& NewTypeRef;
80 
82 
84  virtual ~Transform() {}
85 
88 
90 
106  virtual NewTypeRef operator()( OriginalTypeRef orig ) = 0;
107 
109 
124  virtual bool fwd() = 0;
125 
127 
141  virtual bool rvs() = 0;
142 
144 
148 
150 
166  virtual bool analyze( OriginalTypeRef orig );
167 
169 
182  virtual NewTypeRef construct();
183 
185 
199  virtual bool isConstructed();
200 
202 
203  protected:
204 
206 
212  : origObj_(0),
213  newObj_(0)
214  {}
215 
217 
219 
220  private:
221  Transform(const Transform<T,U>& src)
222  :origObj_(src.origObj_), newObj_(src.newObj_) {}
223 
224  Transform<T,U>& operator=(const Transform<T,U>& src)
225  {
226  //not currently supported
227  abort();
228  return(*this);
229  }
230 
231 }; // end class Transform
232 
233 template<typename T,typename U>
234 bool
237 {
238  origObj_ = &orig;
239  newObj_ = &((*this)( *origObj_ ));
240  return true;
241 }
242 
243 template<typename T,typename U>
247 {
248  return *newObj_;
249 }
250 
251 template<typename T,typename U>
252 bool
255 {
256  return ( newObj_ != 0 );
257 }
258 
259 template<typename T, typename U>
260 class StructuralTransform : public Transform<T,U>
261 {
262  public:
263  bool fwd() { return true; }
264  bool rvs() { return true; }
265 
266  virtual ~StructuralTransform() {}
267 };
268 
269 template<typename T>
270 class SameTypeTransform : public Transform<T,T>
271 {
272  public:
273  typedef T TransformType;
274  typedef T* TransformTypePtr;
275  typedef T& TransformTypeRef;
276 
277  virtual ~SameTypeTransform() {}
278 };
279 
280 template<typename T>
282 {
283  public:
284  bool fwd() { return true; }
285  bool rvs() { return true; }
286 
288 };
289 
290 template<typename T>
292 {
293  public:
295  operator()
297  { this->origObj_ = &orig;
298  this->newObj_ = &orig;
299  return orig;
300  }
301 
302  virtual ~InPlaceTransform() {}
303 };
304 
305 template<typename T>
307 {
308  public:
309  bool fwd() { return true; }
310  bool rvs() { return true; }
311 
312  virtual ~ViewTransform() {}
313 };
314 
315 } //namespace EpetraExt
316 
317 #endif //EPETRAEXT_TRANSFORM_H
EpetraExt::Transform::NewTypeRef
U & NewTypeRef
Definition: EpetraExt_Transform.h:79
EpetraExt::StructuralSameTypeTransform::~StructuralSameTypeTransform
virtual ~StructuralSameTypeTransform()
Definition: EpetraExt_Transform.h:287
EpetraExt::StructuralTransform
Definition: EpetraExt_Transform.h:260
EpetraExt::SameTypeTransform::TransformType
T TransformType
Definition: EpetraExt_Transform.h:273
EpetraExt::Transform::fwd
virtual bool fwd()=0
Forward transfer of data from orig object input in the operator() method call to the new object creat...
EpetraExt::InPlaceTransform
Definition: EpetraExt_Transform.h:291
EpetraExt::Transform::origObj_
OriginalTypePtr origObj_
Definition: EpetraExt_Transform.h:216
EpetraExt::ViewTransform::fwd
bool fwd()
Forward transfer of data from orig object input in the operator() method call to the new object creat...
Definition: EpetraExt_Transform.h:309
EpetraExt::SameTypeTransform
Definition: EpetraExt_Transform.h:270
EpetraExt::ViewTransform
Definition: EpetraExt_Transform.h:306
EpetraExt::ViewTransform::rvs
bool rvs()
Reverse transfer of data from new object created in the operator() method call to the orig object inp...
Definition: EpetraExt_Transform.h:310
EpetraExt::Transform::rvs
virtual bool rvs()=0
Reverse transfer of data from new object created in the operator() method call to the orig object inp...
EpetraExt::Transform::~Transform
virtual ~Transform()
Definition: EpetraExt_Transform.h:84
EpetraExt::StructuralSameTypeTransform::fwd
bool fwd()
Forward transfer of data from orig object input in the operator() method call to the new object creat...
Definition: EpetraExt_Transform.h:284
EpetraExt::StructuralTransform::rvs
bool rvs()
Reverse transfer of data from new object created in the operator() method call to the orig object inp...
Definition: EpetraExt_Transform.h:264
EpetraExt_ConfigDefs.h
EpetraExt::Transform::isConstructed
virtual bool isConstructed()
Check for whether transformed object has been constructed.
Definition: EpetraExt_Transform.h:254
EpetraExt::Transform::NewTypePtr
U * NewTypePtr
Definition: EpetraExt_Transform.h:77
EpetraExt::SameTypeTransform::~SameTypeTransform
virtual ~SameTypeTransform()
Definition: EpetraExt_Transform.h:277
EpetraExt::StructuralTransform::fwd
bool fwd()
Forward transfer of data from orig object input in the operator() method call to the new object creat...
Definition: EpetraExt_Transform.h:263
EpetraExt::SameTypeTransform::TransformTypeRef
T & TransformTypeRef
Definition: EpetraExt_Transform.h:275
EpetraExt::Transform::OriginalTypeRef
T & OriginalTypeRef
Definition: EpetraExt_Transform.h:74
EpetraExt::Transform::newObj_
NewTypePtr newObj_
Definition: EpetraExt_Transform.h:218
EpetraExt::Transform
Base Class for all Epetra Transform Operators.
Definition: EpetraExt_Transform.h:64
EpetraExt::InPlaceTransform::~InPlaceTransform
virtual ~InPlaceTransform()
Definition: EpetraExt_Transform.h:302
EpetraExt::Transform::operator()
virtual NewTypeRef operator()(OriginalTypeRef orig)=0
Analysis of transform operation on original object and construction of new object.
EpetraExt::ViewTransform::~ViewTransform
virtual ~ViewTransform()
Definition: EpetraExt_Transform.h:312
EpetraExt::Transform::OriginalTypePtr
T * OriginalTypePtr
Definition: EpetraExt_Transform.h:72
Epetra_MultiVector
EpetraExt::Transform::NewType
U NewType
Definition: EpetraExt_Transform.h:76
EpetraExt::Transform::OriginalType
T OriginalType
Definition: EpetraExt_Transform.h:71
EpetraExt::Transform::OriginalTypeRCP
Teuchos::RCP< T > OriginalTypeRCP
Definition: EpetraExt_Transform.h:73
EpetraExt::Transform::NewTypeRCP
Teuchos::RCP< U > NewTypeRCP
Definition: EpetraExt_Transform.h:78
EpetraExt
EpetraExt::BlockCrsMatrix: A class for constructing a distributed block matrix.
Definition: EpetraExt_BlockCrsMatrix.cpp:46
EpetraExt::StructuralSameTypeTransform::rvs
bool rvs()
Reverse transfer of data from new object created in the operator() method call to the orig object inp...
Definition: EpetraExt_Transform.h:285
EpetraExt::Transform::analyze
virtual bool analyze(OriginalTypeRef orig)
Initial analysis phase of transform.
Definition: EpetraExt_Transform.h:236
EpetraExt::Transform::construct
virtual NewTypeRef construct()
Construction of new object as a result of the transform.
Definition: EpetraExt_Transform.h:246
EpetraExt::StructuralTransform::~StructuralTransform
virtual ~StructuralTransform()
Definition: EpetraExt_Transform.h:266
EpetraExt::SameTypeTransform::TransformTypePtr
T * TransformTypePtr
Definition: EpetraExt_Transform.h:274
EpetraExt::StructuralSameTypeTransform
Definition: EpetraExt_Transform.h:281
EpetraExt::Transform::Transform
Transform()
Default constructor, protected to allow only derived classes to use.
Definition: EpetraExt_Transform.h:211