Skip to content

Commit 5be80f1

Browse files
authored
Merge pull request #11551 from rjmccall/foreachoperation-functions
2 parents 75ebdba + bfd71a8 commit 5be80f1

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

stdlib/public/runtime/Metadata.cpp

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -613,22 +613,19 @@ static void tuple_destroyArray(OpaqueValue *array, size_t n,
613613

614614
// The operation doesn't have to be initializeWithCopy, but they all
615615
// have basically the same type.
616-
typedef value_witness_types::initializeWithCopy
617-
ValueWitnessTable::*forEachOperation;
616+
typedef value_witness_types::initializeWithCopy forEachOperation;
618617

619618
/// Perform an operation for each field of two tuples.
620619
static OpaqueValue *tuple_forEachField(OpaqueValue *destTuple,
621620
OpaqueValue *srcTuple,
622621
const Metadata *_metatype,
623-
forEachOperation member) {
622+
forEachOperation operation) {
624623
auto &metatype = *(const TupleTypeMetadata*) _metatype;
625624
for (size_t i = 0, e = metatype.NumElements; i != e; ++i) {
626625
auto &eltInfo = metatype.getElement(i);
627-
auto eltValueWitnesses = eltInfo.Type->getValueWitnesses();
628-
629626
OpaqueValue *destElt = eltInfo.findIn(destTuple);
630627
OpaqueValue *srcElt = eltInfo.findIn(srcTuple);
631-
(eltValueWitnesses->*member)(destElt, srcElt, eltInfo.Type);
628+
operation(destElt, srcElt, eltInfo.Type);
632629
}
633630

634631
return destTuple;
@@ -671,7 +668,9 @@ static OpaqueValue *tuple_initializeWithCopy(OpaqueValue *dest,
671668

672669
if (IsPOD) return tuple_memcpy(dest, src, metatype);
673670
return tuple_forEachField(dest, src, metatype,
674-
&ValueWitnessTable::initializeWithCopy);
671+
[](OpaqueValue *dest, OpaqueValue *src, const Metadata *eltType) {
672+
return eltType->vw_initializeWithCopy(dest, src);
673+
});
675674
}
676675

677676
/// Generic tuple value witness for 'initializeArrayWithCopy'.
@@ -709,7 +708,9 @@ static OpaqueValue *tuple_initializeWithTake(OpaqueValue *dest,
709708

710709
if (IsPOD) return tuple_memcpy(dest, src, metatype);
711710
return tuple_forEachField(dest, src, metatype,
712-
&ValueWitnessTable::initializeWithTake);
711+
[](OpaqueValue *dest, OpaqueValue *src, const Metadata *eltType) {
712+
return eltType->vw_initializeWithTake(dest, src);
713+
});
713714
}
714715

715716
/// Generic tuple value witness for 'initializeArrayWithTakeFrontToBack'.
@@ -774,7 +775,9 @@ static OpaqueValue *tuple_assignWithCopy(OpaqueValue *dest,
774775

775776
if (IsPOD) return tuple_memcpy(dest, src, metatype);
776777
return tuple_forEachField(dest, src, metatype,
777-
&ValueWitnessTable::assignWithCopy);
778+
[](OpaqueValue *dest, OpaqueValue *src, const Metadata *eltType) {
779+
return eltType->vw_assignWithCopy(dest, src);
780+
});
778781
}
779782

780783
/// Generic tuple value witness for 'assignWithTake'.
@@ -784,7 +787,9 @@ static OpaqueValue *tuple_assignWithTake(OpaqueValue *dest,
784787
const Metadata *metatype) {
785788
if (IsPOD) return tuple_memcpy(dest, src, metatype);
786789
return tuple_forEachField(dest, src, metatype,
787-
&ValueWitnessTable::assignWithTake);
790+
[](OpaqueValue *dest, OpaqueValue *src, const Metadata *eltType) {
791+
return eltType->vw_assignWithTake(dest, src);
792+
});
788793
}
789794

790795
/// Generic tuple value witness for 'initializeBufferWithCopyOfBuffer'.

0 commit comments

Comments
 (0)