1 #ifndef CPPAD_CG_EXPRESSION_NODE_INCLUDED 2 #define CPPAD_CG_EXPRESSION_NODE_INCLUDED 28 friend class CodeHandler<Base>;
30 using iterator =
typename std::vector<Argument<Base> >::iterator;
31 using const_iterator =
typename std::vector<Argument<Base> >::const_iterator;
32 using const_reverse_iterator =
typename std::vector<Argument<Base> >::const_reverse_iterator;
33 using reverse_iterator =
typename std::vector<Argument<Base> >::reverse_iterator;
35 static const std::set<CGOpCode> CUSTOM_NODE_CLASS;
41 CodeHandler<Base>* handler_;
49 std::vector<size_t> info_;
55 std::vector<Argument<Base> > arguments_;
63 std::unique_ptr<std::string> name_;
70 CPPADCG_ASSERT_UNKNOWN(CUSTOM_NODE_CLASS.find(operation_) == CUSTOM_NODE_CLASS.end());
72 operation_ = CGOpCode::Alias;
74 arguments_[0] = other;
105 CPPADCG_ASSERT_UNKNOWN(op == operation_ || CUSTOM_NODE_CLASS.find(op) == CUSTOM_NODE_CLASS.end());
108 arguments_ = arguments;
133 inline const std::vector<size_t>&
getInfo()
const {
158 inline void setName(
const std::string& name) {
159 if (name_ !=
nullptr)
162 name_.reset(
new std::string(name));
186 inline iterator begin() {
187 return arguments_.begin();
190 inline const_iterator begin()
const {
191 return arguments_.begin();
194 inline iterator end() {
195 return arguments_.end();
198 inline const_iterator end()
const {
199 return arguments_.end();
202 inline reverse_iterator rbegin() {
203 return arguments_.rbegin();
206 inline const_reverse_iterator rbegin()
const {
207 return arguments_.rbegin();
210 inline reverse_iterator rend() {
211 return arguments_.rend();
214 inline const_reverse_iterator rend()
const {
215 return arguments_.rend();
218 inline const_iterator cbegin()
const noexcept {
219 return arguments_.cbegin();
222 inline const_iterator cend()
const noexcept {
223 return arguments_.cend();
226 inline const_reverse_iterator crbegin()
const noexcept {
227 return arguments_.crbegin();
230 inline const_reverse_iterator crend()
const noexcept {
231 return arguments_.crend();
239 handler_(orig.handler_),
240 operation_(orig.operation_),
242 arguments_(orig.arguments_),
243 pos_(std::numeric_limits<size_t>::max()),
244 name_(orig.name_ !=
nullptr ?
new std::string(*orig.name_) :
nullptr) {
251 pos_(std::numeric_limits<size_t>::max()) {
260 pos_(std::numeric_limits<size_t>::max()) {
268 arguments_(std::move(args)),
269 pos_(std::numeric_limits<size_t>::max()) {
274 std::vector<size_t>&& info,
278 info_(std::move(info)),
279 arguments_(std::move(args)),
280 pos_(std::numeric_limits<size_t>::max()) {
285 const std::vector<size_t>& info,
291 pos_(std::numeric_limits<size_t>::max()) {
294 inline void setHandlerPosition(
size_t pos) {
306 const std::vector<size_t>& info,
308 return std::unique_ptr<OperationNode<Base>> (
new OperationNode<Base>(
nullptr, op, info, args));
312 static inline std::set<CGOpCode> makeCustomNodeClassesSet();
318 std::set<CGOpCode> s;
319 s.insert(CGOpCode::IndexAssign);
320 s.insert(CGOpCode::Index);
321 s.insert(CGOpCode::LoopStart);
322 s.insert(CGOpCode::LoopEnd);
323 s.insert(CGOpCode::Pri);
331 inline std::ostream& operator<<(
334 CGOpCode op = c.getOperationType();
336 case CGOpCode::ArrayCreation:
337 os <<
"new $1[" << c.getArguments().size() <<
"]";
339 case CGOpCode::SparseArrayCreation:
340 os <<
"new $1[" << c.getInfo()[0] <<
"]";
342 case CGOpCode::ArrayElement:
343 os <<
"$1[" << c.getInfo()[0] <<
"]";
345 case CGOpCode::AtomicForward:
346 os <<
"atomicFunction.forward(" << c.getInfo()[0] <<
", " << c.getInfo()[1] <<
", vx, vy, $1, $2)";
348 case CGOpCode::AtomicReverse:
349 os <<
"atomicFunction.reverse(" << c.getInfo()[0] <<
", $1, $2, $3, $4)";
352 os <<
"if($1 > 0) { 1 } else if($1 == 0) { 0 } else { -1 }";
std::vector< size_t > & getInfo()
std::vector< Argument< Base > > & getArguments()
const std::string * getName() const
const std::vector< Argument< Base > > & getArguments() const
size_t getHandlerPosition() const
CGOpCode getOperationType() const
void makeAlias(const Argument< Base > &other)
void setName(const std::string &name)
CodeHandler< Base > * getCodeHandler() const
void setOperation(CGOpCode op, const std::vector< Argument< Base > > &arguments=std::vector< Argument< Base > >())
static std::unique_ptr< OperationNode< Base > > makeTemporaryNode(CGOpCode op, const std::vector< size_t > &info, const std::vector< Argument< Base > > &args)
const std::vector< size_t > & getInfo() const