29#include "hdrl_types.h"
51 hdrl_iter_next_f * next;
53 hdrl_iter_reset_f * reset;
55 hdrl_iter_length_f * length;
57 hdrl_free * destructor;
59 hdrl_iter_flags flags;
96hdrl_iter_init(hdrl_iter_next_f * next,
97 hdrl_iter_reset_f * reset,
98 hdrl_iter_length_f * length,
99 hdrl_free * destructor,
100 hdrl_iter_flags flags,
104 hdrl_iter_flags inout = (HDRL_ITER_INPUT | HDRL_ITER_OUTPUT);
105 hdrl_iter_flags retflags = (HDRL_ITER_IMAGE | HDRL_ITER_IMAGELIST);
106 cpl_ensure(((flags & inout) == HDRL_ITER_INPUT) ||
107 ((flags & inout) == HDRL_ITER_OUTPUT),
108 CPL_ERROR_ILLEGAL_INPUT, NULL);
109 cpl_ensure(((flags & retflags) == HDRL_ITER_IMAGE) ||
110 ((flags & retflags) == HDRL_ITER_IMAGELIST),
111 CPL_ERROR_ILLEGAL_INPUT, NULL);
112 cpl_ensure(state, CPL_ERROR_NULL_INPUT, NULL);
113 cpl_ensure(next, CPL_ERROR_NULL_INPUT, NULL);
114 cpl_ensure(flags != 0, CPL_ERROR_NULL_INPUT, NULL);
115 hdrl_iter * it = cpl_malloc(
sizeof(*it));
119 it->destructor = destructor ? destructor : &cpl_free;
133void * hdrl_iter_state(
const hdrl_iter * it)
135 cpl_ensure(it, CPL_ERROR_NULL_INPUT, NULL);
149cpl_boolean hdrl_iter_check(hdrl_iter * it, hdrl_iter_flags flags)
151 cpl_ensure(it, CPL_ERROR_NULL_INPUT, CPL_FALSE);
153 return (it->flags & flags) == flags;
166void hdrl_iter_delete(hdrl_iter * it)
169 if (it->destructor) {
183void * hdrl_iter_next(hdrl_iter * it)
185 cpl_ensure(it, CPL_ERROR_NULL_INPUT, NULL);
196void hdrl_iter_reset(hdrl_iter * it)
199 cpl_error_set_message(cpl_func, CPL_ERROR_NULL_INPUT,
201 }
else if (it->reset == NULL) {
202 cpl_error_set_message(cpl_func, CPL_ERROR_UNSUPPORTED_MODE,
203 "Iterator has no reset method");
216cpl_size hdrl_iter_length(hdrl_iter * it)
219 cpl_error_set_message(cpl_func, CPL_ERROR_NULL_INPUT,
222 }
else if (it->length == NULL) {
223 cpl_error_set_message(cpl_func, CPL_ERROR_UNSUPPORTED_MODE,
224 "Iterator has no length method");
227 return it->length(it);