OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
ADeferred.h
Go to the documentation of this file.
1#ifndef OPAL_ADeferred_HH
2#define OPAL_ADeferred_HH
3
4// ------------------------------------------------------------------------
5// $RCSfile: ADeferred.h,v $
6// ------------------------------------------------------------------------
7// $Revision: 1.3.4.1 $
8// ------------------------------------------------------------------------
9// Copyright: see Copyright.readme
10// ------------------------------------------------------------------------
11//
12// Template class: ADeferred<T>
13//
14// ------------------------------------------------------------------------
15//
16// $Date: 2004/11/18 22:52:40 $
17// $Author: jsberg $
18//
19// ------------------------------------------------------------------------
20
21#include <exception>
22#include <iosfwd>
23#include <vector>
26#include "Expressions/AList.h"
27#include "Expressions/AValue.h"
30
31namespace Expressions {
32
33 // Template class ADeferred
34 // ----------------------------------------------------------------------
36 // A deferred expression is always re-evaluated when its value is
37 // required. This is notably needed to implement random generators.
38
39 template <class T>
40 class ADeferred : public AValue<T> {
41 public:
43 // Construct empty array.
44 ADeferred();
45
47 // From array expression.
48 explicit ADeferred(PtrToArray<T> expr);
49
51 // From array constant.
52 explicit ADeferred(const std::vector<T>& val);
53
55 // From array of scalar expressions.
56 explicit ADeferred(ArrayOfPtrs<T> expr);
57
58 ADeferred(const ADeferred<T>&);
59 virtual ~ADeferred();
60
62 virtual ADeferred<T>* clone() const;
63
65 // The expression is always re-evaluated.
66 virtual std::vector<T> evaluate();
67
69 virtual bool isExpression() const;
70
72 virtual void print(std::ostream&) const;
73
75 void setComponent(int i, const PtrToScalar<T> expr);
76
77 protected:
79 // This expression is used first to evaluate all components of
80 // the expression. Individual values may be overwritten using
81 // [b]itsOverrides[b].
83
85 // After applying [b]itsLaw[/b] to evaluate all components, any
86 // scalar expression defined in this array is used to overwrite
87 // the corresponding component.
89
90 private:
91 // Not implemented.
92 void operator=(const ADeferred<T>&);
93
94 // Guard against recursive definition.
95 mutable bool in_evaluation;
96 };
97
98 // Implementation
99 // ----------------------------------------------------------------------
100
101 template <class T>
102 ADeferred<T>::ADeferred() : AValue<T>(), itsLaw(), itsOverrides(), in_evaluation(false) {}
103
104 template <class T>
106 : AValue<T>(),
107 itsLaw(rhs.itsLaw->clone()),
108 itsOverrides(rhs.itsOverrides.size()),
109 in_evaluation(false) {
110 for (typename ArrayOfPtrs<T>::size_type i = 0; i < rhs.itsOverrides.size(); ++i) {
111 itsOverrides[i] = rhs.itsOverrides[i]->clone();
112 }
113 }
114
115 template <class T>
116 ADeferred<T>::ADeferred(const std::vector<T>& val)
117 : AValue<T>(val), itsLaw(0), itsOverrides(0), in_evaluation(false) {}
118
119 template <class T>
121 : AValue<T>(), itsLaw(expr), itsOverrides(), in_evaluation(false) {}
122
123 template <class T>
125 : AValue<T>(), itsLaw(), itsOverrides(expr), in_evaluation(false) {}
126
127 template <class T>
129
130 template <class T>
132 return new ADeferred<T>(*this);
133 }
134
135 template <class T>
136 std::vector<T> ADeferred<T>::evaluate() {
137 if (in_evaluation) {
138 throw LogicalError("ADeferred::evaluate()", "Recursive expression definitions found.");
139 } else {
140 in_evaluation = true;
141
142 try {
143 if (itsLaw.isValid()) this->value = itsLaw->evaluate();
144 in_evaluation = false;
145 if (this->value.size() < itsOverrides.size()) {
146 this->value.resize(itsOverrides.size());
147 }
148
149 for (typename ArrayOfPtrs<T>::size_type i = 0; i < itsOverrides.size(); ++i) {
150 if (itsOverrides[i].isValid()) {
151 this->value[i] = itsOverrides[i]->evaluate();
152 }
153 }
154 } catch (OpalException& ex) {
155 in_evaluation = false;
156 throw LogicalError(
157 ex.where(),
158 "Evaluating expression \"" + this->getImage() + "\": " + ex.what());
159 } catch (std::exception& ex) {
160 in_evaluation = false;
161 throw LogicalError(
162 "ADeferred::evaluate()", "Standard C++ exception while evaluating \""
163 + this->getImage() + "\": " + ex.what());
164 } catch (...) {
165 in_evaluation = false;
166 throw LogicalError(
167 "ADeferred::evaluate()",
168 "Unknown exception while evaluating \"" + this->getImage() + "\": ");
169 }
170 }
171
172 return this->value;
173 }
174
175 template <class T>
177 return itsLaw.isValid() || (!itsOverrides.empty());
178 }
179
180 template <class T>
181 void ADeferred<T>::print(std::ostream& os) const {
182 // Print the generating law, if any.
183 if (itsLaw.isValid()) itsLaw->print(os, 0);
184
185 // Print the overrides.
186 if (!itsOverrides.empty()) {
187 os << "; overrides: {";
188 typename ArrayOfPtrs<T>::const_iterator i = itsOverrides.begin();
189
190 while (i != itsOverrides.end()) {
191 if (i->isValid()) (*i)->print(os);
192 if (++i == itsOverrides.end()) break;
193 os << ',';
194 }
195
196 os << '}';
197 }
198
199 return;
200 }
201
202 template <class T>
203 void ADeferred<T>::setComponent(int index, const PtrToScalar<T> expr) {
204 while (int(itsOverrides.size()) < index) {
205 itsOverrides.push_back(PtrToScalar<T>());
206 }
207
208 itsOverrides[index - 1] = expr;
209 }
210
211} // namespace Expressions
212
213#endif // OPAL_ADeferred_HH
double T
Definition OPALTypes.h:8
Object attribute with a `‘deferred’' array value.
Definition ADeferred.h:40
void operator=(const ADeferred< T > &)
ArrayOfPtrs< T > itsOverrides
Overrides for single components.
Definition ADeferred.h:88
virtual void print(std::ostream &) const
Print the attribute value.
Definition ADeferred.h:181
virtual std::vector< T > evaluate()
Evaluate.
Definition ADeferred.h:136
virtual bool isExpression() const
Get expression flag.
Definition ADeferred.h:176
ADeferred()
Default constructor.
Definition ADeferred.h:102
PtrToArray< T > itsLaw
The generating law for the array expression.
Definition ADeferred.h:82
virtual ADeferred< T > * clone() const
Make clone.
Definition ADeferred.h:131
void setComponent(int i, const PtrToScalar< T > expr)
Set a component of the value.
Definition ADeferred.h:203
Object attribute with a constant array value.
Definition AValue.h:35
An array of pointers to scalar expressions.
A pointer to an array expression.
A pointer to a scalar expression.
Logical error exception.
virtual const std::string & what() const
Return the message string for the exception.
virtual const std::string & where() const
Return the name of the method or function which detected the exception.
Representation objects and parsers for attribute expressions.