00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef ITL_SOLVER_PROXY_INCLUDE
00013 #define ITL_SOLVER_PROXY_INCLUDE
00014
00015 #include <boost/mpl/bool.hpp>
00016
00017 namespace itl {
00018
00019
00020 template <typename Solver, typename VectorIn, bool adjoint= false>
00021 class solver_proxy
00022 {
00023 public:
00024 solver_proxy(const Solver& solver, const VectorIn& vector_in)
00025 : solver(solver), vector_in(vector_in)
00026 {}
00027
00028
00029 template <typename VectorOut>
00030 void solve(VectorOut& vector_out) const
00031 {
00032 solve(vector_out, boost::mpl::bool_<adjoint>());
00033 }
00034
00035 protected:
00036 template <typename VectorOut>
00037 void solve(VectorOut& vector_out, boost::mpl::true_) const
00038 {
00039 solver.adjoint_solve(vector_in, vector_out);
00040 }
00041
00042 template <typename VectorOut>
00043 void solve(VectorOut& vector_out, boost::mpl::false_) const
00044 {
00045 solver.solve(vector_in, vector_out);
00046 }
00047
00048 const Solver& solver;
00049 const VectorIn& vector_in;
00050 };
00051
00052
00053 }
00054
00055 #endif // ITL_SOLVER_PROXY_INCLUDE