diff options
Diffstat (limited to 'clib/table_iter.h')
-rw-r--r-- | clib/table_iter.h | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/clib/table_iter.h b/clib/table_iter.h new file mode 100644 index 0000000..1b01e0d --- /dev/null +++ b/clib/table_iter.h @@ -0,0 +1,172 @@ +/* + * Copyright (c) International Business Machines Corp., 2014 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/*! + * @file table_iter.h + * @brief Table Iterator + * @code + * ... + * table_iter_t it; + * table_iter_init(&it, &t); + * + * value_t * val; + * table_for_each(&it, val) { + * if (value_type(val) != VT_UNKNOWN) + * value_dump(val, stdout); + * } + * ... + * @endcode + * @author Shaun Wetzstein <shaun@us.ibm.com> + * @date 2010-2011 + */ + +#ifndef __TABLE_ITER_H__ +#define __TABLE_ITER_H__ + +#include <stdint.h> +#include <stdbool.h> + +#include "attribute.h" + +#include "value.h" +#include "table.h" +#include "vector_iter.h" + +/* ======================================================================= */ + +typedef struct table_iter table_iter_t; //!< Alias for the @em table class + +/*! + * @brief Table iterator + */ +struct table_iter { + table_t *table; //!< Reference to the target table object + vector_iter_t it; //!< Current position of the table + uint32_t flags; //!< Iterator configuration flags +}; + +/* ==================================================================== */ + +#define TI_FLAG_NONE 0x00000000 //!< No flag mask +#define TI_FLAG_FWD 0x00000001 //!< Forward (FWD) flag mask +#define TI_FLAG_BWD 0x00000002 //!< Backwards (BWD) flag mask +#define TI_FLAG_MASK 0x00000003 //!< All flag mask + +/*! + * @brief Initializes an @em table_iter iterator object + * @memberof table_iter + * @param self [in] table_iter object @em self pointer + * @param table [in] table container object to iterate + * @param flags [in] iterator configuration flags + * @return None + * @throws UNEXPECTED if @em self pointer is NULL + * @throws UNEXPECTED if @em table pointer is NULL + */ +extern int table_iter_init(table_iter_t *, table_t *, uint32_t) +/*! @cond */ +__nonnull((1, 2)) /*! @endcond */ ; + +/*! + * @brief Resets an @em table iterator object + * @memberof table_iter + * @param self [in] table_iter object @em self pointer + * @return None + * @throws UNEXPECTED if @em self pointer is NULL + */ +extern int table_iter_clear(table_iter_t *) +/*! @cond */ +__nonnull((1)) /*! @endcond */ ; + +/*! + * @brief Return a pointer to @em value element at the current iterator position + * @memberof table_iter + * @param self [in] table_iter object @em self pointer + * @throws UNEXPECTED if @em self pointer is NULL + */ +extern const value_t *table_iter_elem(table_iter_t *) +/*! @cond */ +__nonnull((1)) /*! @endcond */ ; + +/*! + * @brief Increment the position of an @em table iterator + * @memberof table_iter + * @param self [in] table_iter object @em self pointer + * @param count [in] Number of positions to increment + * @return None + * @throws UNEXPECTED if @em self pointer is NULL + */ +#define table_iter_inc(...) STRCAT(table_iter_inc, NARGS(__VA_ARGS__))(__VA_ARGS__) +extern const value_t *table_iter_inc1(table_iter_t *) +/*! @cond */ +__nonnull((1)) /*! @endcond */ ; +extern const value_t *table_iter_inc2(table_iter_t *, size_t) +/*! @cond */ +__nonnull((1)) /*! @endcond */ ; + +/*! + * @brief Decrement the position of an @em table iterator + * @memberof table_iter + * @param self [in] table_iter object @em self pointer + * @param count [in] Number of positions to decrement + * @return None + * @throws UNEXPECTED if @em self pointer is NULL + */ +#define table_iter_dec(...) STRCAT(table_iter_dec, NARGS(__VA_ARGS__))(__VA_ARGS__) +extern const value_t *table_iter_dec1(table_iter_t *) +/*! @cond */ +__nonnull((1)) /*! @endcond */ ; +extern const value_t *table_iter_dec2(table_iter_t *, size_t) +/*! @cond */ +__nonnull((1)) /*! @endcond */ ; + +/*! + * @fn const void * table_iter_pos(table_iter_t * self, size_t pos) + * @brief Return or set the iterator position witin the @em table + * @details If the second (2nd) parameter is omitted, this functions returns + * the current position. + * @memberof table_iter + * @param self [in] table_iter object @em self pointer + * @param pos [in] new iterator position (optional) + * @return None + * @throws UNEXPECTED if @em self pointer is NULL + */ +/*! @cond */ +#define table_iter_pos(...) STRCAT(table_iter_pos, NARGS(__VA_ARGS__))(__VA_ARGS__) +extern size_t table_iter_pos1(table_iter_t *) +/*! @cond */ +__nonnull((1)) /*! @endcond */ ; +extern int table_iter_pos2(table_iter_t *, size_t) +/*! @cond */ +__nonnull((1)) /*! @endcond */ ; +/*! @endcond */ + +/*! + * @def table_for_each_row(it, i) + * @hideinitializer + * @brief Table for-each-row element algorithm + * @param it [in] Table iterator object + * @param r [in] Value element variable (row) + */ +#define table_for_each(it,r) \ + for (r = (typeof(r))table_iter_elem((it)); \ + r != NULL; \ + r = (typeof(r))table_iter_inc((it))) + +/* ==================================================================== */ + +#endif /* __TABLE_ITER_H__ */ |