Ich entwerfe eine Iteratorschnittstelle für meine hashmap Datenstruktur. Das aktuelle Design sieht wie folgt aus:Opaque struct ohne Definition
// map.h
typedef struct map_iterator map_iterator;
// map.c
struct map_iterator
{
// Implementation details
};
// client.c
map *m = map_new();
map_iterator *it = map_iterator_new(m);
void *key, *value;
while (map_iterator_next(it, &key, &value)) {
// Use key, value
}
map_iterator_free(it);
Dies erfordert jedoch eine Heapzuordnung für das Iterator-Objekt, und der Kunde muss daran denken, die Iterator zu befreien, wenn sie fertig sind. Wenn ich den Iterator auf dem Stapel zurückkehren machen map_iterator_new
, sieht der Code wie folgt aus:
// map.h
typedef struct map_iterator
{
// Implementation details
};
// client.c
map *m = map_new();
map_iterator it = map_iterator_new(m);
void *key, *value;
while (map_iterator_next(&it, &key, &value)) {
// Use key, value
}
Dies erfordert jedoch, dass ich die Definition des map_iterator
Struktur zu Client-Code zur Verfügung stellen (sonst bekomme ich einen unvollständigen Typ Fehler). Ich möchte diese Definition ausblenden und nur die Erklärung liefern.
Gibt es eine Möglichkeit, dies zu erreichen? Im Wesentlichen suche ich nach einer Möglichkeit, dem Client-Code mitzuteilen, dass "diese Struktur X Bytes einnimmt, damit Sie sie auf dem Stack zuweisen können, aber ich sage Ihnen nicht, wie Sie auf ihre Mitglieder zugreifen".
Edit: Nur Standard C, bitte! (keine Compiler-Erweiterungen/plattformspezifische Funktionen)
Was ist unter 'Implementierungsdetails' im Iterator? – 2501
@ 2501 Iteratorzustand, z.B. Zeiger auf hashmap, aktueller Bucket-Index, Änderungszähler usw. –
Ich denke nicht, dass es ein Problem ist, einen Zeiger auf Ihren Iterator zu setzen und ihn danach freizugeben. Viele Bibliotheken, wie zum Beispiel Curl etc., stellen ebenfalls solche Schnittstellen bereit. Ich würde lieber die erste Option als die zweite verwenden. – ckruczek