shithub: rgbds

ref: 6828f7bf493cd4c9c332ea769e6e38fbbe258821
dir: /include/gfx/proto_palette.hpp/

View raw version
/*
 * This file is part of RGBDS.
 *
 * Copyright (c) 2022, Eldred Habert and RGBDS contributors.
 *
 * SPDX-License-Identifier: MIT
 */

#ifndef RGBDS_GFX_PROTO_PALETTE_HPP
#define RGBDS_GFX_PROTO_PALETTE_HPP

#include <algorithm>
#include <array>
#include <stddef.h>
#include <stdint.h>

class ProtoPalette {
public:
	static constexpr size_t capacity = 4;

private:
	// Up to 4 colors, sorted, and where SIZE_MAX means the slot is empty
	// (OK because it's not a valid color index)
	// Sorting is done on the raw numerical values to lessen `compare`'s complexity
	std::array<uint16_t, capacity> _colorIndices{UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX};

public:
	/*
	 * Adds the specified color to the set, or **silently drops it** if the set is full.
	 *
	 * Returns whether the color was unique.
	 */
	bool add(uint16_t color);

	enum ComparisonResult {
		NEITHER,
		WE_BIGGER,
		THEY_BIGGER = -1,
	};
	ComparisonResult compare(ProtoPalette const &other) const;

	size_t size() const;
	bool empty() const;

	decltype(_colorIndices)::const_iterator begin() const;
	decltype(_colorIndices)::const_iterator end() const;
};

#endif // RGBDS_GFX_PROTO_PALETTE_HPP