@@ -406,38 +406,135 @@ ASDF_EXPORT void asdf_mapping_item_destroy(asdf_mapping_item_t *item);
406406 */
407407typedef struct asdf_sequence asdf_sequence_t ;
408408
409+ /** Return true if ``value`` holds a YAML sequence */
409410ASDF_EXPORT bool asdf_value_is_sequence (asdf_value_t * value );
411+
412+ /**
413+ * Return the number of items in ``sequence``
414+ *
415+ * :param sequence: The `asdf_sequence_t *` to query
416+ * :return: The number of items currently in the sequence
417+ */
410418ASDF_EXPORT int asdf_sequence_size (asdf_sequence_t * sequence );
419+
420+ /**
421+ * Return the value at ``index`` in ``sequence``
422+ *
423+ * Negative indices are supported (e.g. ``-1`` for the last item). Returns
424+ * ``NULL`` if ``index`` is out of range.
425+ *
426+ * :param sequence: The `asdf_sequence_t *` to query
427+ * :param index: Zero-based index; negative indices count from the end
428+ * :return: The `asdf_value_t *` at that position, or ``NULL``
429+ */
411430ASDF_EXPORT asdf_value_t * asdf_sequence_get (asdf_sequence_t * sequence , int index );
431+
432+ /**
433+ * Obtain a typed `asdf_sequence_t *` view of a generic value
434+ *
435+ * On success writes the `asdf_sequence_t *` into ``*out`` and returns
436+ * ``ASDF_VALUE_OK``. Returns an error code and leaves ``*out`` unchanged if
437+ * ``value`` is not a sequence.
438+ *
439+ * :param value: The generic `asdf_value_t *` to inspect
440+ * :param out: Receives the `asdf_sequence_t *` on success
441+ * :return: ``ASDF_VALUE_OK`` on success, otherwise an `asdf_value_err_t` error
442+ */
412443ASDF_EXPORT asdf_value_err_t asdf_value_as_sequence (asdf_value_t * value , asdf_sequence_t * * out );
444+
445+ /**
446+ * Return the generic `asdf_value_t *` view of a sequence
447+ *
448+ * The returned pointer shares ownership with ``sequence``; the caller must
449+ * not free it independently.
450+ *
451+ * :param sequence: The `asdf_sequence_t *` to wrap
452+ * :return: The same object as a generic `asdf_value_t *`
453+ */
413454ASDF_EXPORT asdf_value_t * asdf_value_of_sequence (asdf_sequence_t * sequence );
455+
456+ /**
457+ * Create a new, empty sequence attached to ``file``
458+ *
459+ * The caller owns the returned sequence and must eventually release it with
460+ * `asdf_sequence_destroy`, or transfer ownership by inserting it into a
461+ * mapping or parent sequence. Returns ``NULL`` on allocation failure.
462+ *
463+ * :param file: The `asdf_file_t *` that will own the sequence
464+ * :return: A new `asdf_sequence_t *`, or ``NULL`` on failure
465+ */
414466ASDF_EXPORT asdf_sequence_t * asdf_sequence_create (asdf_file_t * file );
467+
468+ /**
469+ * Set the YAML node style used when serializing ``sequence``
470+ *
471+ * :param sequence: The `asdf_sequence_t *` to modify
472+ * :param style: The desired `asdf_yaml_node_style_t` (e.g. block or flow)
473+ */
415474ASDF_EXPORT void asdf_sequence_set_style (asdf_sequence_t * sequence , asdf_yaml_node_style_t style );
475+
476+ /**
477+ * Free a sequence and all values it contains
478+ *
479+ * Must not be called on a sequence that has been inserted into a mapping or
480+ * parent sequence -- ownership transfers at that point.
481+ *
482+ * :param sequence: The `asdf_sequence_t *` to free
483+ */
416484ASDF_EXPORT void asdf_sequence_destroy (asdf_sequence_t * sequence );
417485
418486
419487/** Opaque struct holding sequence iterator state */
420488typedef void * asdf_sequence_iter_t ;
421489
490+ /**
491+ * Initialize an `asdf_sequence_iter_t` to its starting state
492+ *
493+ * Call this once before the first call to `asdf_sequence_iter`.
494+ *
495+ * :return: An initialized `asdf_sequence_iter_t`
496+ */
422497ASDF_EXPORT asdf_sequence_iter_t asdf_sequence_iter_init (void );
423498
424499
425500/**
426- * Iterate over a sequence value
501+ * Advance a sequence iterator and return the next value
427502 *
428- * .. todo ::
503+ * Typical usage ::
429504 *
430- * Finish documenting me.
505+ * asdf_sequence_iter_t iter = asdf_sequence_iter_init();
506+ * asdf_value_t *val;
507+ * while ((val = asdf_sequence_iter(seq, &iter)) != NULL) {
508+ * // use val ...
509+ * }
510+ *
511+ * Returns ``NULL`` when iteration is exhausted.
512+ *
513+ * :param sequence: The `asdf_sequence_t *` to iterate over
514+ * :param iter: Pointer to the iterator state; updated on each call
515+ * :return: The next `asdf_value_t *` in the sequence, or ``NULL`` when done
431516 */
432517ASDF_EXPORT asdf_value_t * asdf_sequence_iter (asdf_sequence_t * sequence , asdf_sequence_iter_t * iter );
433518
434519
435520/**
436- * Append values to sequences
521+ * Append a value to a sequence
437522 *
438- * .. todo::
523+ * ``asdf_sequence_append`` appends an existing generic `asdf_value_t *`.
524+ * Ownership of ``value`` transfers to ``sequence`` on success.
525+ *
526+ * The ``asdf_sequence_append_<type>`` variants construct a new value from a C
527+ * scalar and append it in one step. ``asdf_sequence_append_string`` takes an
528+ * explicit byte length; ``asdf_sequence_append_string0`` expects a
529+ * NUL-terminated string. ``asdf_sequence_append_null`` takes no value
530+ * argument. All other variants accept the corresponding C type directly.
439531 *
440- * Document these.
532+ * ``asdf_sequence_append_mapping`` and ``asdf_sequence_append_sequence``
533+ * transfer ownership of the supplied container to the parent sequence on
534+ * success.
535+ *
536+ * All functions return ``ASDF_VALUE_OK`` on success or an `asdf_value_err_t`
537+ * error code on failure.
441538 */
442539ASDF_EXPORT asdf_value_err_t asdf_sequence_append (asdf_sequence_t * sequence , asdf_value_t * value );
443540ASDF_EXPORT asdf_value_err_t
@@ -467,6 +564,56 @@ ASDF_EXPORT asdf_value_err_t
467564asdf_sequence_append_sequence (asdf_sequence_t * sequence , asdf_sequence_t * value );
468565
469566
567+ /**
568+ * Create a new sequence pre-populated from a C array in a single call
569+ *
570+ * Each ``asdf_sequence_of_<type>`` function allocates a new sequence attached
571+ * to ``file`` and appends ``size`` elements from ``arr``. On success the
572+ * caller owns the returned sequence and must eventually release it with
573+ * `asdf_sequence_destroy` (or transfer ownership by inserting it into a
574+ * mapping or parent sequence). Returns ``NULL`` on allocation failure.
575+ *
576+ * ``asdf_sequence_of_null`` creates a sequence of ``size`` null values; it
577+ * takes no array argument.
578+ *
579+ * ``asdf_sequence_of_string`` accepts an array of ``(str, len)`` pairs via
580+ * separate ``arr`` and ``lens`` pointer arguments.
581+ * ``asdf_sequence_of_string0`` is the null-terminated-string variant.
582+ *
583+ * All other variants mirror the corresponding ``asdf_sequence_append_<type>``
584+ * scalar types.
585+ */
586+ ASDF_EXPORT asdf_sequence_t * asdf_sequence_of_null (asdf_file_t * file , int size );
587+
588+ ASDF_EXPORT asdf_sequence_t * asdf_sequence_of_string (
589+ asdf_file_t * file , const char * const * arr , const size_t * lens , int size );
590+ ASDF_EXPORT asdf_sequence_t * asdf_sequence_of_string0 (
591+ asdf_file_t * file , const char * const * arr , int size );
592+
593+ ASDF_EXPORT asdf_sequence_t * asdf_sequence_of_bool (asdf_file_t * file , const bool * arr , int size );
594+
595+ ASDF_EXPORT asdf_sequence_t * asdf_sequence_of_int8 (asdf_file_t * file , const int8_t * arr , int size );
596+ ASDF_EXPORT asdf_sequence_t * asdf_sequence_of_int16 (
597+ asdf_file_t * file , const int16_t * arr , int size );
598+ ASDF_EXPORT asdf_sequence_t * asdf_sequence_of_int32 (
599+ asdf_file_t * file , const int32_t * arr , int size );
600+ ASDF_EXPORT asdf_sequence_t * asdf_sequence_of_int64 (
601+ asdf_file_t * file , const int64_t * arr , int size );
602+
603+ ASDF_EXPORT asdf_sequence_t * asdf_sequence_of_uint8 (
604+ asdf_file_t * file , const uint8_t * arr , int size );
605+ ASDF_EXPORT asdf_sequence_t * asdf_sequence_of_uint16 (
606+ asdf_file_t * file , const uint16_t * arr , int size );
607+ ASDF_EXPORT asdf_sequence_t * asdf_sequence_of_uint32 (
608+ asdf_file_t * file , const uint32_t * arr , int size );
609+ ASDF_EXPORT asdf_sequence_t * asdf_sequence_of_uint64 (
610+ asdf_file_t * file , const uint64_t * arr , int size );
611+
612+ ASDF_EXPORT asdf_sequence_t * asdf_sequence_of_float (asdf_file_t * file , const float * arr , int size );
613+ ASDF_EXPORT asdf_sequence_t * asdf_sequence_of_double (
614+ asdf_file_t * file , const double * arr , int size );
615+
616+
470617/**
471618 * Remove a value from a sequence and return the removed value
472619 *
0 commit comments