EpetraExt  Development
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 #if defined(EpetraExt_SHOW_DEPRECATED_WARNINGS)
50 #ifdef __GNUC__
51 #warning "The EpetraExt package is deprecated"
52 #endif
53 #endif
54 
55 #include <EpetraExt_ConfigDefs.h>
56 
57 #include <Teuchos_RCP.hpp>
58 
59 namespace EpetraExt {
60 
62 
69 template<typename T, typename U>
70 class Transform
71 {
72  public:
73 
76 
77  typedef T OriginalType;
78  typedef T* OriginalTypePtr;
79  typedef Teuchos::RCP<T> OriginalTypeRCP;
80  typedef T& OriginalTypeRef;
81 
82  typedef U NewType;
83  typedef U* NewTypePtr;
84  typedef Teuchos::RCP<U> NewTypeRCP;
85  typedef U& NewTypeRef;
86 
88 
90  virtual ~Transform() {}
91 
94 
96 
112  virtual NewTypeRef operator()( OriginalTypeRef orig ) = 0;
113 
115 
130  virtual bool fwd() = 0;
131 
133 
147  virtual bool rvs() = 0;
148 
150 
154 
156 
172  virtual bool analyze( OriginalTypeRef orig );
173 
175 
188  virtual NewTypeRef construct();
189 
191 
205  virtual bool isConstructed();
206 
208 
209  protected:
210 
212 
218  : origObj_(0),
219  newObj_(0)
220  {}
221 
223 
225 
226  private:
227  Transform(const Transform<T,U>& src)
228  :origObj_(src.origObj_), newObj_(src.newObj_) {}
229 
230  Transform<T,U>& operator=(const Transform<T,U>& src)
231  {
232  //not currently supported
233  abort();
234  return(*this);
235  }
236 
237 }; // end class Transform
238 
239 template<typename T,typename U>
240 bool
243 {
244  origObj_ = &orig;
245  newObj_ = &((*this)( *origObj_ ));
246  return true;
247 }
248 
249 template<typename T,typename U>
253 {
254  return *newObj_;
255 }
256 
257 template<typename T,typename U>
258 bool
261 {
262  return ( newObj_ != 0 );
263 }
264 
265 template<typename T, typename U>
266 class StructuralTransform : public Transform<T,U>
267 {
268  public:
269  bool fwd() { return true; }
270  bool rvs() { return true; }
271 
272  virtual ~StructuralTransform() {}
273 };
274 
275 template<typename T>
276 class SameTypeTransform : public Transform<T,T>
277 {
278  public:
279  typedef T TransformType;
280  typedef T* TransformTypePtr;
281  typedef T& TransformTypeRef;
282 
283  virtual ~SameTypeTransform() {}
284 };
285 
286 template<typename T>
288 {
289  public:
290  bool fwd() { return true; }
291  bool rvs() { return true; }
292 
294 };
295 
296 template<typename T>
298 {
299  public:
301  operator()
303  { this->origObj_ = &orig;
304  this->newObj_ = &orig;
305  return orig;
306  }
307 
308  virtual ~InPlaceTransform() {}
309 };
310 
311 template<typename T>
313 {
314  public:
315  bool fwd() { return true; }
316  bool rvs() { return true; }
317 
318  virtual ~ViewTransform() {}
319 };
320 
321 } //namespace EpetraExt
322 
323 #endif //EPETRAEXT_TRANSFORM_H
Base Class for all Epetra Transform Operators.
virtual bool isConstructed()
Check for whether transformed object has been constructed.
virtual NewTypeRef construct()
Construction of new object as a result of the transform.
virtual bool fwd()=0
Forward transfer of data from orig object input in the operator() method call to the new object creat...
Transform< T, T >::NewTypeRef Transform_Composite< T >typename Transform< T, T >::OriginalTypeRef orig this origObj_
bool fwd()
Forward transfer of data from orig object input in the operator() method call to the new object creat...
bool fwd()
Forward transfer of data from orig object input in the operator() method call to the new object creat...
virtual bool rvs()=0
Reverse transfer of data from new object created in the operator() method call to the orig object inp...
Transform()
Default constructor, protected to allow only derived classes to use.
bool rvs()
Reverse transfer of data from new object created in the operator() method call to the orig object inp...
virtual NewTypeRef operator()(OriginalTypeRef orig)=0
Analysis of transform operation on original object and construction of new object.
bool rvs()
Reverse transfer of data from new object created in the operator() method call to the orig object inp...
bool rvs()
Reverse transfer of data from new object created in the operator() method call to the orig object inp...
Teuchos::RCP< T > OriginalTypeRCP
Teuchos::RCP< U > NewTypeRCP
bool fwd()
Forward transfer of data from orig object input in the operator() method call to the new object creat...
virtual bool analyze(OriginalTypeRef orig)
Initial analysis phase of transform.