/* GStreamer
 * Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
 * Copyright (C) 2011 Sebastian Dröge <sebastian.droege@collabora.co.uk>
 *
 * gstiterator.h: Header for GstIterator
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifndef __GST_ITERATOR_H__
#define __GST_ITERATOR_H__

#include <glib-object.h> /* for GValue in the fold */
#include <gst/gstconfig.h>

G_BEGIN_DECLS

#define GST_TYPE_ITERATOR (gst_iterator_get_type ())

/**
 * GstIteratorResult:
 * @GST_ITERATOR_DONE:   No more items in the iterator
 * @GST_ITERATOR_OK:     An item was retrieved
 * @GST_ITERATOR_RESYNC: Datastructure changed while iterating
 * @GST_ITERATOR_ERROR:  An error happened
 *
 * The result of gst_iterator_next().
 */
typedef enum {
  GST_ITERATOR_DONE     = 0,
  GST_ITERATOR_OK       = 1,
  GST_ITERATOR_RESYNC   = 2,
  GST_ITERATOR_ERROR    = 3
} GstIteratorResult;

typedef struct _GstIterator GstIterator;

/**
 * GstIteratorItem:
 * @GST_ITERATOR_ITEM_SKIP:  Skip this item
 * @GST_ITERATOR_ITEM_PASS:  Return item
 * @GST_ITERATOR_ITEM_END:   Stop after this item.
 *
 * The result of a #GstIteratorItemFunction.
 */
typedef enum {
  GST_ITERATOR_ITEM_SKIP        = 0,
  GST_ITERATOR_ITEM_PASS        = 1,
  GST_ITERATOR_ITEM_END         = 2
} GstIteratorItem;

/**
 * GstIteratorCopyFunction:
 * @it: The original iterator
 * @copy: The copied iterator
 *
 * This function will be called when creating a copy of @it and should
 * create a copy of all custom iterator fields or increase their
 * reference counts.
 */
typedef void              (*GstIteratorCopyFunction) (const GstIterator *it, GstIterator *copy);

/**
 * GstIteratorItemFunction:
 * @it: the iterator
 * @item: the item being retrieved.
 *
 * The function that will be called after the next item of the iterator
 * has been retrieved. This function can be used to skip items or stop
 * the iterator.
 *
 * The function will be called with the iterator lock held.
 *
 * Returns: the result of the operation.
 */
typedef GstIteratorItem   (*GstIteratorItemFunction)    (GstIterator *it, const GValue * item);

/**
 * GstIteratorNextFunction:
 * @it: the iterator
 * @result: a pointer to hold the next item
 *
 * The function that will be called when the next element of the iterator
 * should be retrieved.
 *
 * Implementors of a #GstIterator should implement this
 * function and pass it to the constructor of the custom iterator.
 * The function will be called with the iterator lock held.
 *
 * Returns: the result of the operation.
 */
typedef GstIteratorResult (*GstIteratorNextFunction)    (GstIterator *it, GValue *result);
/**
 * GstIteratorResyncFunction:
 * @it: the iterator
 *
 * This function will be called whenever a concurrent update happened
 * to the iterated datastructure. The implementor of the iterator should
 * restart the iterator from the beginning and clean up any state it might
 * have.
 *
 * Implementors of a #GstIterator should implement this
 * function and pass it to the constructor of the custom iterator.
 * The function will be called with the iterator lock held.
 */
typedef void              (*GstIteratorResyncFunction)  (GstIterator *it);
/**
 * GstIteratorFreeFunction:
 * @it: the iterator
 *
 * This function will be called when the iterator is freed.
 *
 * Implementors of a #GstIterator should implement this
 * function and pass it to the constructor of the custom iterator.
 * The function will be called with the iterator lock held.
 */
typedef void              (*GstIteratorFreeFunction)    (GstIterator *it);

/**
 * GstIteratorForeachFunction:
 * @item: The item
 * @user_data: User data
 *
 * A function that is called by gst_iterator_foreach() for every element.
 */
typedef void         (*GstIteratorForeachFunction)     (const GValue * item, gpointer user_data);

/**
 * GstIteratorFoldFunction:
 * @item: the item to fold
 * @ret: a #GValue collecting the result
 * @user_data: data passed to gst_iterator_fold()
 *
 * A function to be passed to gst_iterator_fold().
 *
 * Returns: %TRUE if the fold should continue, %FALSE if it should stop.
 */
typedef gboolean          (*GstIteratorFoldFunction)    (const GValue * item, GValue * ret, gpointer user_data);

/**
 * GST_ITERATOR:
 * @it: the #GstIterator value
 *
 * Macro to cast to a #GstIterator
 */
#define GST_ITERATOR(it)                ((GstIterator*)(it))
/**
 * GST_ITERATOR_LOCK:
 * @it: the #GstIterator to get the lock of
 *
 * Macro to get the lock protecting the datastructure being iterated.
 */
#define GST_ITERATOR_LOCK(it)           (GST_ITERATOR(it)->lock)
/**
 * GST_ITERATOR_COOKIE:
 * @it: the #GstIterator to get the cookie of
 *
 * Macro to get the cookie of a #GstIterator. The cookie of the
 * iterator is the value of the master cookie when the iterator
 * was created.
 * Whenever the iterator is iterated, the value is compared to the
 * value of the master cookie. If they are different, a concurrent
 * modification happened to the iterator and a resync is needed.
 */
#define GST_ITERATOR_COOKIE(it)         (GST_ITERATOR(it)->cookie)
/**
 * GST_ITERATOR_ORIG_COOKIE:
 * @it: the #GstIterator to get the master cookie of
 *
 * Macro to get a pointer to where the master cookie is stored. The
 * master cookie protects the structure being iterated and gets updated
 * whenever the datastructure changes.
 */
#define GST_ITERATOR_ORIG_COOKIE(it)    (GST_ITERATOR(it)->master_cookie)

/**
 * GstIterator:
 * @copy: The function to copy the iterator
 * @next: The function to get the next item in the iterator
 * @item: The function to be called for each item retrieved
 * @resync: The function to call when a resync is needed.
 * @free: The function to call when the iterator is freed
 * @pushed: The iterator that is currently pushed with gst_iterator_push()
 * @type: The type of the object that this iterator will return
 * @lock: The lock protecting the data structure and the cookie.
 * @cookie: The cookie; the value of the master_cookie when this iterator was
 *          created.
 * @master_cookie: A pointer to the master cookie.
 * @size: the size of the iterator
 *
 * #GstIterator base structure. The values of this structure are
 * protected for subclasses, use the methods to use the #GstIterator.
 */
struct _GstIterator {
  /*< protected >*/
  GstIteratorCopyFunction copy;
  GstIteratorNextFunction next;
  GstIteratorItemFunction item;
  GstIteratorResyncFunction resync;
  GstIteratorFreeFunction free;

  GstIterator *pushed;          /* pushed iterator */

  GType     type;
  GMutex   *lock;
  guint32   cookie;             /* cookie of the iterator */
  guint32  *master_cookie;      /* pointer to guint32 holding the cookie when this
                                   iterator was created */
  guint     size;

  /*< private >*/
  gpointer _gst_reserved[GST_PADDING];
};

GType                   gst_iterator_get_type           (void);

/* creating iterators */
GstIterator*            gst_iterator_new                (guint size,
                                                         GType type,
                                                         GMutex *lock,
                                                         guint32 *master_cookie,
                                                         GstIteratorCopyFunction copy,
                                                         GstIteratorNextFunction next,
                                                         GstIteratorItemFunction item,
                                                         GstIteratorResyncFunction resync,
                                                         GstIteratorFreeFunction free) G_GNUC_MALLOC;

GstIterator*            gst_iterator_new_list           (GType type,
                                                         GMutex *lock,
                                                         guint32 *master_cookie,
                                                         GList **list,
                                                         GObject * owner,
                                                         GstIteratorItemFunction item) G_GNUC_MALLOC;

GstIterator*            gst_iterator_new_single         (GType type,
                                                         const GValue * object) G_GNUC_MALLOC;

GstIterator*            gst_iterator_copy               (const GstIterator *it) G_GNUC_MALLOC;

/* using iterators */
GstIteratorResult       gst_iterator_next               (GstIterator *it, GValue * elem);
void                    gst_iterator_resync             (GstIterator *it);
void                    gst_iterator_free               (GstIterator *it);

void                    gst_iterator_push               (GstIterator *it, GstIterator *other);

/* higher-order functions that operate on iterators */
GstIterator*            gst_iterator_filter             (GstIterator *it, GCompareFunc func,
                                                         const GValue * user_data) G_GNUC_MALLOC;
GstIteratorResult       gst_iterator_fold               (GstIterator *it,
                                                         GstIteratorFoldFunction func,
                                                         GValue *ret, gpointer user_data);
GstIteratorResult       gst_iterator_foreach            (GstIterator *it,
                                                         GstIteratorForeachFunction func, gpointer user_data);
gboolean                gst_iterator_find_custom        (GstIterator *it, GCompareFunc func,
                                                         GValue *elem, gpointer user_data);

G_END_DECLS

#endif /* __GST_ITERATOR_H__ */
