void
_mongoc_cursor_cursorid_destroy (mongoc_cursor_t *cursor)
{
   ENTRY;

   bson_free (cursor->interface_data);
   _mongoc_cursor_destroy (cursor);

   EXIT;
}
void
_mongoc_cursor_array_destroy (mongoc_cursor_t *cursor)
{
   ENTRY;

   bson_free (cursor->iface_data);
   _mongoc_cursor_destroy (cursor);

   EXIT;
}
void
mongoc_cursor_destroy (mongoc_cursor_t *cursor)
{
   BSON_ASSERT(cursor);

   if (cursor->interface.destroy) {
      cursor->interface.destroy(cursor);
   } else {
      _mongoc_cursor_destroy(cursor);
   }

   EXIT;
}
static void
_mongoc_cursor_cursorid_destroy (mongoc_cursor_t *cursor)
{
   mongoc_cursor_cursorid_t *cid;

   ENTRY;

   cid = (mongoc_cursor_cursorid_t *)cursor->iface_data;
   BSON_ASSERT (cid);

   bson_destroy (&cid->array);
   bson_free (cid);
   _mongoc_cursor_destroy (cursor);

   EXIT;
}
static void
_mongoc_cursor_array_destroy (mongoc_cursor_t *cursor)
{
   mongoc_cursor_array_t *arr;

   ENTRY;

   arr = (mongoc_cursor_array_t *)cursor->iface_data;

   if (arr->has_synthetic_bson) {
      bson_destroy(&arr->bson);
   }

   bson_free (cursor->iface_data);
   _mongoc_cursor_destroy (cursor);

   EXIT;
}
static void
_mongoc_cursor_transform_destroy (mongoc_cursor_t *cursor)
{
   mongoc_cursor_transform_t *transform;

   ENTRY;

   transform = cursor->iface_data;

   if (transform->dtor) {
      transform->dtor (transform->ctx);
   }

   bson_destroy (&transform->tmp);

   bson_free (cursor->iface_data);
   _mongoc_cursor_destroy (cursor);

   EXIT;
}