62 ConstantBounds() =
default;
63 explicit ConstantBounds(
const ConstantSubscripts &shape);
64 explicit ConstantBounds(ConstantSubscripts &&shape);
66 const ConstantSubscripts &shape()
const {
return shape_; }
67 int Rank()
const {
return GetRank(shape_); }
68 static constexpr int Corank() {
return 0; }
80 const ConstantSubscripts &lbounds()
const {
return lbounds_; }
81 ConstantSubscripts ComputeUbounds(std::optional<int> dim)
const;
82 void set_lbounds(ConstantSubscripts &&);
83 void SetLowerBoundsToOne();
84 bool HasNonDefaultLowerBound()
const;
91 bool IncrementSubscripts(
92 ConstantSubscripts &,
const std::vector<int> *dimOrder =
nullptr)
const;
95 ConstantSubscript SubscriptsToOffset(
const ConstantSubscripts &)
const;
98 ConstantSubscripts shape_;
99 ConstantSubscripts lbounds_;
106class ConstantBase :
public ConstantBounds {
107 static_assert(RESULT::category != TypeCategory::Character);
110 using Result = RESULT;
111 using Element = ELEMENT;
115 template <
typename A,
116 typename = std::enable_if_t<std::is_convertible_v<A, Element>>>
117 ConstantBase(
const A &x, Result res = Result{}) : result_{res}, values_{x} {}
119 ConstantBase(ELEMENT &&x, Result res = Result{})
120 : result_{res}, values_{std::move(x)} {}
122 std::vector<Element> &&, ConstantSubscripts &&, Result = Result{});
124 DEFAULT_CONSTRUCTORS_AND_ASSIGNMENTS(ConstantBase)
127 bool operator==(
const ConstantBase &)
const;
128 bool empty()
const {
return values_.empty(); }
129 std::size_t size()
const {
return values_.size(); }
130 const std::vector<Element> &values()
const {
return values_; }
131 Result &result() {
return result_; }
132 const Result &result()
const {
return result_; }
134 constexpr DynamicType GetType()
const {
return result_.GetType(); }
135 llvm::raw_ostream &AsFortran(llvm::raw_ostream &)
const;
136 std::string AsFortran()
const;
139 std::vector<Element> Reshape(
const ConstantSubscripts &)
const;
140 std::size_t CopyFrom(
const ConstantBase &source, std::size_t count,
141 ConstantSubscripts &resultSubscripts,
const std::vector<int> *dimOrder);
144 std::vector<Element> values_;
147template <
typename T>
class Constant :
public ConstantBase<T> {
150 using Base = ConstantBase<T>;
151 using Element = Scalar<T>;
156 std::optional<Scalar<T>> GetScalarValue()
const {
157 if (ConstantBounds::Rank() == 0) {
158 return Base::values_.at(0);
166 Element At(
const ConstantSubscripts &)
const;
168 Constant Reshape(ConstantSubscripts &&)
const;
169 std::size_t CopyFrom(
const Constant &source, std::size_t count,
170 ConstantSubscripts &resultSubscripts,
const std::vector<int> *dimOrder);
174class Constant<
Type<TypeCategory::Character, KIND>> :
public ConstantBounds {
177 using Element = Scalar<Result>;
179 CLASS_BOILERPLATE(Constant)
180 explicit Constant(
const Scalar<Result> &);
181 explicit Constant(Scalar<Result> &&);
183 ConstantSubscript length, std::vector<Element> &&, ConstantSubscripts &&);
186 bool operator==(
const Constant &that)
const {
187 return LEN() == that.LEN() && shape() == that.shape() &&
188 values_ == that.values_;
191 std::size_t size()
const;
193 const Scalar<Result> &values()
const {
return values_; }
194 ConstantSubscript LEN()
const {
return length_; }
195 bool wasHollerith()
const {
return wasHollerith_; }
196 void set_wasHollerith(
bool yes =
true) { wasHollerith_ = yes; }
198 std::optional<Scalar<Result>> GetScalarValue()
const {
207 Scalar<Result> At(
const ConstantSubscripts &)
const;
210 std::optional<Constant> Substring(ConstantSubscript, ConstantSubscript)
const;
212 Constant Reshape(ConstantSubscripts &&)
const;
213 llvm::raw_ostream &AsFortran(llvm::raw_ostream &)
const;
214 std::string AsFortran()
const;
215 DynamicType GetType()
const {
return {KIND, length_}; }
216 std::size_t CopyFrom(
const Constant &source, std::size_t count,
217 ConstantSubscripts &resultSubscripts,
const std::vector<int> *dimOrder);
220 Scalar<Result> values_;
221 ConstantSubscript length_;
222 bool wasHollerith_{
false};
233class Constant<SomeDerived>
234 :
public ConstantBase<SomeDerived, StructureConstructorValues> {
236 using Result = SomeDerived;
237 using Element = StructureConstructorValues;
238 using Base = ConstantBase<SomeDerived, StructureConstructorValues>;
243 std::vector<StructureConstructorValues> &&, ConstantSubscripts &&);
245 std::vector<StructureConstructor> &&, ConstantSubscripts &&);
246 CLASS_BOILERPLATE(Constant)
248 std::optional<StructureConstructor> GetScalarValue()
const;
251 bool operator==(
const Constant &)
const;
252 Constant Reshape(ConstantSubscripts &&)
const;
253 std::size_t CopyFrom(
const Constant &source, std::size_t count,
254 ConstantSubscripts &resultSubscripts,
const std::vector<int> *dimOrder);