28#include "hdrl_multiiter.h"
51 const cpl_frameset * frames;
52 hdrl_iter * iters[MAX_ITERS];
54 void * data[MAX_ITERS];
55} hdrl_multiiter_state;
57static cpl_size hdrl_multiiter_length(hdrl_iter * it);
58static void hdrl_multiiter_delete(
void * it);
59static void * hdrl_multiiter_next(hdrl_iter * it);
82 cpl_ensure(niters > 0, CPL_ERROR_ILLEGAL_INPUT, NULL);
83 cpl_ensure(iters, CPL_ERROR_NULL_INPUT, NULL);
84 hdrl_multiiter_state * state = cpl_calloc(
sizeof(*state), 1);
85 state->niters = niters;
86 cpl_size nlen = hdrl_iter_length(iters[0]);
87 for (intptr_t i = 0; i < niters; i++) {
88 state->iters[i] = iters[i];
90 if (!(flags & HDRL_ITER_ALLOW_EMPTY) &&
91 hdrl_iter_length(iters[i]) != nlen) {
92 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
93 "Iterator length must match");
97 return hdrl_iter_init(&hdrl_multiiter_next, NULL,
98 &hdrl_multiiter_length,
99 &hdrl_multiiter_delete,
100 HDRL_ITER_INPUT | HDRL_ITER_IMAGE | flags,
104static cpl_size hdrl_multiiter_length(hdrl_iter * it)
106 hdrl_multiiter_state * state = hdrl_iter_state(it);
107 return hdrl_iter_length(state->iters[0]);
110static void hdrl_multiiter_delete(
void * it)
114 hdrl_multiiter_state * state = hdrl_iter_state(it);
115 for (intptr_t i = 0; i < state->niters; i++) {
116 hdrl_iter_delete(state->iters[i]);
122static void * hdrl_multiiter_next(hdrl_iter * it)
124 hdrl_multiiter_state * state = hdrl_iter_state(it);
126 for (intptr_t i = 0; i < state->niters; i++) {
127 state->data[i] = hdrl_iter_next(state->iters[i]);
128 if (state->data[i] == NULL) {
131 assert(hdrl_iter_check(it, HDRL_ITER_ALLOW_EMPTY) ||
132 (done && !state->data[i]) || (!done && state->data[i]));
135 if (hdrl_iter_check(it, HDRL_ITER_ALLOW_EMPTY)) {
136 return done == state->niters ? NULL : state->data;
139 return done ? NULL : state->data;
hdrl_iter * hdrl_multiiter_new(intptr_t niters, hdrl_iter *iters[], hdrl_iter_flags flags)
iterate over multiple iterators