iterative-solver 0.0
ArrayHandlers.h
1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITERATIVESOLVER_ARRAYHANDLERS_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITERATIVESOLVER_ARRAYHANDLERS_H
3#include <molpro/linalg/array/default_handler.h>
4
5namespace molpro::linalg {
6
7namespace itsolv {
8namespace util {
9
10struct ArrayHandlersError : public std::logic_error {
11 using std::logic_error::logic_error;
12};
13
14} // namespace util
15
24template <typename R, typename Q = R, typename P = std::map<size_t, typename R::value_type>>
26protected:
27 class Builder;
28
29public:
31 std::shared_ptr<array::ArrayHandler<P, P>> pp, std::shared_ptr<array::ArrayHandler<R, Q>> rq,
32 std::shared_ptr<array::ArrayHandler<R, P>> rp, std::shared_ptr<array::ArrayHandler<Q, R>> qr,
33 std::shared_ptr<array::ArrayHandler<Q, P>> qp)
34 : m_rr{rr}, m_qq{qq}, m_pp{pp}, m_rq{rq}, m_rp{rp}, m_qr{qr}, m_qp{qp} {}
35
38
39 auto& rr() { return *m_rr; }
40 auto& qq() { return *m_qq; }
41 auto& pp() { return *m_pp; }
42 auto& rq() { return *m_rq; }
43 auto& qr() { return *m_qr; } // TODO qr is not needed, by copy is implemented the wrong way around
44 auto& rp() { return *m_rp; }
45 auto& qp() { return *m_qp; }
46
57 static Builder create() { return {}; }
58
59protected:
60 class Builder {
61 public:
62 Builder() : rr(this), qq(this), pp(this), rq(this), rp(this), qr(this), qp(this) {}
63
66 rp.handler(), qr.handler(), qp.handler()};
67 };
68
69 protected:
70 template <class T, class S>
71 class Proxy {
72 public:
73 Proxy() = default;
74 explicit Proxy(Builder* b) : builder(b) {}
75
77 Builder& operator()(const std::shared_ptr<array::ArrayHandler<T, S>>& h) {
78 m_handler = h;
79 return *builder;
80 }
81
83 std::shared_ptr<array::ArrayHandler<T, S>> handler() const {
84 if (!m_handler)
85 return array::create_default_handler<T, S>();
86 else
87 return m_handler;
88 }
89
90 protected:
91 Builder* builder = nullptr;
92 std::shared_ptr<array::ArrayHandler<T, S>> m_handler;
93 };
94
95 public:
103 };
104
105 std::shared_ptr<array::ArrayHandler<R, R>> m_rr;
106 std::shared_ptr<array::ArrayHandler<Q, Q>> m_qq;
107 std::shared_ptr<array::ArrayHandler<P, P>> m_pp;
108 std::shared_ptr<array::ArrayHandler<R, Q>> m_rq;
109 std::shared_ptr<array::ArrayHandler<R, P>> m_rp;
110 std::shared_ptr<array::ArrayHandler<Q, R>> m_qr;
111 std::shared_ptr<array::ArrayHandler<Q, P>> m_qp;
112};
113
114} // namespace itsolv
115namespace iterativesolver {
117} // namespace iterativesolver
118} // namespace molpro::linalg
119
120#endif // LINEARALGEBRA_SRC_MOLPRO_LINALG_ITERATIVESOLVER_ARRAYHANDLERS_H
Enhances various operations between pairs of arrays and allows dynamic code injection with uniform in...
Definition: ArrayHandler.h:162
Proxy(Builder *b)
Definition: ArrayHandlers.h:74
Builder & operator()(const std::shared_ptr< array::ArrayHandler< T, S > > &h)
assigns a handler to the proxy
Definition: ArrayHandlers.h:77
Builder * builder
Definition: ArrayHandlers.h:91
std::shared_ptr< array::ArrayHandler< T, S > > m_handler
Definition: ArrayHandlers.h:92
std::shared_ptr< array::ArrayHandler< T, S > > handler() const
Definition: ArrayHandlers.h:83
Proxy< P, P > pp
Definition: ArrayHandlers.h:98
Proxy< Q, Q > qq
Definition: ArrayHandlers.h:97
Proxy< R, P > rp
Definition: ArrayHandlers.h:100
Builder()
Definition: ArrayHandlers.h:62
Proxy< R, R > rr
Definition: ArrayHandlers.h:96
Proxy< R, Q > rq
Definition: ArrayHandlers.h:99
ArrayHandlers build()
Definition: ArrayHandlers.h:64
Proxy< Q, R > qr
Definition: ArrayHandlers.h:101
Proxy< Q, P > qp
Definition: ArrayHandlers.h:102
Class, containing a collection of array handlers used in IterativeSolver Provides a Builder sub-class...
Definition: ArrayHandlers.h:25
auto & qr()
Definition: ArrayHandlers.h:43
std::shared_ptr< array::ArrayHandler< Q, P > > m_qp
Definition: ArrayHandlers.h:111
std::shared_ptr< array::ArrayHandler< Q, R > > m_qr
Definition: ArrayHandlers.h:110
std::shared_ptr< array::ArrayHandler< P, P > > m_pp
Definition: ArrayHandlers.h:107
static Builder create()
Utility for creating Array handlers with some user specified handlers.
Definition: ArrayHandlers.h:57
auto & qq()
Definition: ArrayHandlers.h:40
std::shared_ptr< array::ArrayHandler< R, R > > m_rr
Definition: ArrayHandlers.h:105
std::shared_ptr< array::ArrayHandler< R, Q > > m_rq
Definition: ArrayHandlers.h:108
auto & pp()
Definition: ArrayHandlers.h:41
auto & qp()
Definition: ArrayHandlers.h:45
ArrayHandlers(std::shared_ptr< array::ArrayHandler< R, R > > rr, std::shared_ptr< array::ArrayHandler< Q, Q > > qq, std::shared_ptr< array::ArrayHandler< P, P > > pp, std::shared_ptr< array::ArrayHandler< R, Q > > rq, std::shared_ptr< array::ArrayHandler< R, P > > rp, std::shared_ptr< array::ArrayHandler< Q, R > > qr, std::shared_ptr< array::ArrayHandler< Q, P > > qp)
Definition: ArrayHandlers.h:30
std::shared_ptr< array::ArrayHandler< Q, Q > > m_qq
Definition: ArrayHandlers.h:106
auto & rp()
Definition: ArrayHandlers.h:44
auto & rr()
Definition: ArrayHandlers.h:39
ArrayHandlers()
Uses default handlers.
Definition: ArrayHandlers.h:37
auto & rq()
Definition: ArrayHandlers.h:42
std::shared_ptr< array::ArrayHandler< R, P > > m_rp
Definition: ArrayHandlers.h:109
Definition: helper.h:10