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 #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
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.