#pragma once
/**
 * @file atlas_allocator.h
 * @brief 纹理图集分配器接口
 */
#include "geometry/rect.h"
#include <optional>
#include <Eigen/Core>

/**
 * @class atlas_allocator
 * @brief 纹理图集分配器接口
 */
class atlas_allocator {
public:
	virtual ~atlas_allocator() = default;

	/**
	 * @brief 分配指定大小的区域
	 * @param size 要分配的区域大小
	 * @return 分配的区域，失败返回std::nullopt
	 */
	virtual std::optional<rect_t<int32_t>> allocate(const Eigen::Vector2i& size) = 0;

	/**
	 * @brief 释放之前分配的区域
	 * @param rect 要释放的区域
	 * @return 是否成功释放
	 */
	virtual bool free(const rect_t<int32_t>& rect) = 0;

	/**
	 * @brief 重置分配器
	 */
	virtual void reset() = 0;

	/**
	 * @brief 调整分配器大小
	 * @param new_size 新的大小
	 */
	virtual void resize(const Eigen::Vector2i& new_size) = 0;

	/**
	 * @brief 获取总面积
	 * @return 总面积
	 */
	virtual int total_area() const = 0;

	/**
	 * @brief 获取已分配面积
	 * @return 已分配面积
	 */
	virtual int allocated_area() const = 0;
};
