23  explicit Complex(
FirOpBuilder &builder, mlir::Location loc)
 
   24      : builder(builder), loc(loc) {}
 
   25  Complex(
const Complex &) = 
delete;
 
   29  enum class Part { Real = 0, Imag = 1 };
 
   36  mlir::Value 
createComplex(mlir::Type complexType, mlir::Value real,
 
   40  mlir::Value 
createComplex(mlir::Value real, mlir::Value imag);
 
   44    return isImagPart ? extract<Part::Imag>(cplx) : extract<Part::Real>(cplx);
 
 
   48  std::pair<mlir::Value, mlir::Value> 
extractParts(mlir::Value cplx) {
 
   49    return {extract<Part::Real>(cplx), extract<Part::Imag>(cplx)};
 
 
   52  mlir::Value insertComplexPart(mlir::Value cplx, mlir::Value part,
 
   54    return isImagPart ? insert<Part::Imag>(cplx, part)
 
   55                      : insert<Part::Real>(cplx, part);
 
   59  template <Part partId>
 
   60  mlir::Value extract(mlir::Value cplx) {
 
   61    return fir::ExtractValueOp::create(
 
   63        builder.getArrayAttr({builder.getIntegerAttr(
 
   64            builder.getIndexType(), static_cast<int>(partId))}));
 
   67  template <Part partId>
 
   68  mlir::Value insert(mlir::Value cplx, mlir::Value part) {
 
   69    return fir::InsertValueOp::create(
 
   70        builder, loc, cplx.getType(), cplx, part,
 
   71        builder.getArrayAttr({builder.getIntegerAttr(
 
   72            builder.getIndexType(), static_cast<int>(partId))}));
 
   75  template <Part partId>
 
   76  mlir::Value createPartId() {
 
   77    return builder.createIntegerConstant(loc, builder.getIndexType(),
 
   78                                         static_cast<int>(partId));
 
   82  FirOpBuilder &builder;