162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef __LIBPERF_INTERNAL_XYARRAY_H
362306a36Sopenharmony_ci#define __LIBPERF_INTERNAL_XYARRAY_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/compiler.h>
662306a36Sopenharmony_ci#include <sys/types.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_cistruct xyarray {
962306a36Sopenharmony_ci	size_t row_size;
1062306a36Sopenharmony_ci	size_t entry_size;
1162306a36Sopenharmony_ci	size_t entries;
1262306a36Sopenharmony_ci	size_t max_x;
1362306a36Sopenharmony_ci	size_t max_y;
1462306a36Sopenharmony_ci	char contents[] __aligned(8);
1562306a36Sopenharmony_ci};
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistruct xyarray *xyarray__new(int xlen, int ylen, size_t entry_size);
1862306a36Sopenharmony_civoid xyarray__delete(struct xyarray *xy);
1962306a36Sopenharmony_civoid xyarray__reset(struct xyarray *xy);
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistatic inline void *__xyarray__entry(struct xyarray *xy, int x, int y)
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	return &xy->contents[x * xy->row_size + y * xy->entry_size];
2462306a36Sopenharmony_ci}
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistatic inline void *xyarray__entry(struct xyarray *xy, size_t x, size_t y)
2762306a36Sopenharmony_ci{
2862306a36Sopenharmony_ci	if (x >= xy->max_x || y >= xy->max_y)
2962306a36Sopenharmony_ci		return NULL;
3062306a36Sopenharmony_ci	return __xyarray__entry(xy, x, y);
3162306a36Sopenharmony_ci}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistatic inline int xyarray__max_y(struct xyarray *xy)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	return xy->max_y;
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistatic inline int xyarray__max_x(struct xyarray *xy)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	return xy->max_x;
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#endif /* __LIBPERF_INTERNAL_XYARRAY_H */
44