9#ifndef FORTRAN_EVALUATE_FOLD_DESIGNATOR_H_
10#define FORTRAN_EVALUATE_FOLD_DESIGNATOR_H_
25#include "expression.h"
35using common::ConstantSubscript;
42 : symbol_{symbol}, size_{bytes} {}
45 const Symbol &symbol()
const {
return *symbol_; }
46 void set_symbol(
const Symbol &symbol) { symbol_ = symbol; };
47 ConstantSubscript offset()
const {
return offset_; }
48 void Augment(ConstantSubscript n) { offset_ += n; }
49 std::size_t size()
const {
return size_; }
50 void set_size(std::size_t bytes) { size_ = bytes; }
54 ConstantSubscript offset_{0};
64 : context_{c}, getLastComponent_{getLastComponent} {}
66 bool isEmpty()
const {
return isEmpty_; }
67 bool isOutOfRange()
const {
return isOutOfRange_; }
70 std::optional<OffsetSymbol> FoldDesignator(
const Expr<T> &expr) {
72 [&](
const auto &x) {
return FoldDesignator(x, elementNumber_++); },
77 std::optional<OffsetSymbol> FoldDesignator(
const Symbol &, ConstantSubscript);
78 std::optional<OffsetSymbol> FoldDesignator(
79 const SymbolRef &x, ConstantSubscript which) {
80 return FoldDesignator(*x, which);
82 std::optional<OffsetSymbol> FoldDesignator(
83 const ArrayRef &, ConstantSubscript);
84 std::optional<OffsetSymbol> FoldDesignator(
86 std::optional<OffsetSymbol> FoldDesignator(
88 std::optional<OffsetSymbol> FoldDesignator(
90 std::optional<OffsetSymbol> FoldDesignator(
91 const DataRef &, ConstantSubscript);
92 std::optional<OffsetSymbol> FoldDesignator(
94 std::optional<OffsetSymbol> FoldDesignator(
96 std::optional<OffsetSymbol> FoldDesignator(
100 std::optional<OffsetSymbol> FoldDesignator(
101 const Expr<T> &expr, ConstantSubscript which) {
102 return common::visit(
103 [&](
const auto &x) {
return FoldDesignator(x, which); }, expr.u);
106 template <
typename A>
107 std::optional<OffsetSymbol> FoldDesignator(
const A &, ConstantSubscript) {
111 template <
typename T>
112 std::optional<OffsetSymbol> FoldDesignator(
114 return common::visit(
115 [&](
const auto &x) {
return FoldDesignator(x, which); }, designator.u);
118 std::optional<OffsetSymbol> FoldDesignator(
120 ConstantSubscript which) {
121 return common::visit(
124 if (
const auto *dataRef{ss.GetParentIf<
DataRef>()}) {
125 if (
auto result{FoldDesignator(*dataRef, which)}) {
126 if (
auto start{ToInt64(ss.lower())}) {
127 std::optional<ConstantSubscript> end;
128 auto len{dataRef->LEN()};
130 end = ToInt64(*ss.upper());
136 isOutOfRange_ =
true;
138 result->Augment(KIND * (*start - 1));
140 *end >= *start ? KIND * (*end - *start + 1) : 0);
142 if (
auto lenVal{ToInt64(*len)}) {
143 if (*end > *lenVal) {
144 isOutOfRange_ =
true;
153 return std::optional<OffsetSymbol>{};
155 [&](
const auto &x) {
return FoldDesignator(x, which); },
161 bool getLastComponent_{
false};
162 ConstantSubscript elementNumber_{0};
163 bool isEmpty_{
false};
164 bool isOutOfRange_{
false};
168std::optional<Expr<SomeType>> OffsetToDesignator(
170std::optional<Expr<SomeType>> OffsetToDesignator(
177 ConstantSubscript byteStride;
178 ConstantSubscript extent;
180 using Dimensions = std::vector<Dimension>;
183 const Symbol &symbol, std::size_t size, Dimensions &&dims)
184 :
OffsetSymbol{symbol, size}, dimensions{std::move(dims)} {}
190 Dimensions dimensions;
Definition: variable.h:208
Definition: variable.h:255
Definition: variable.h:369
Definition: variable.h:74
Definition: fold-designator.h:61
Definition: variable.h:393
Definition: variable.h:104
Definition: fold-designator.h:39
Definition: variable.h:316
Definition: fold-designator.h:176
Definition: fold-designator.h:175
Definition: variable.h:300