Reuse PyEnumerable
, removing need for PyKeyValuePairEnumerable
#204
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
PyKeyValuePairEnumerable<,>
had almost an identical implementation toPyEnumerable<>
except for the conversion of thePyObject
value. The former callsPyObject.As<,>
:CSnakes/src/CSnakes.Runtime/Python/PyKeyValuePairEnumerable.cs
Lines 42 to 43 in b9a6b8d
whereas the latter calls
PyObject.As<>
:CSnakes/src/CSnakes.Runtime/Python/PyEnumerable.cs
Lines 42 to 43 in b9a6b8d
That's a lot of duplication to maintain, sync, test and cover. This PR consolidates the duplication so there's only one bulk implementation. It does this by adding another type parameter (called
TImporter
) toPyEnumerable<>
that determines how thePyObject
is imported (into presumably a managed type):The importer has a static member, which bears zero cost (that is, no allocation and no virtual dispatch needed):
The two import strategies,
PyObject.As<>
andPyObject.As<,>
, are then embodied into implementations of this interface. The import strategy is chosen at the timePyEnumerable<,>
is instantiated. APyEnumerable<>
with a single type parameter still exists, but which uses the default strategy ofPyObject.As<>
so most of the code is untouched except inPyDictionary<,>.GetEnumerator
.