#ifndef MXREGIONCURSOR_H
#define MXREGIONCURSOR_H

#include "mxregion.h"

// VTABLE: LEGO1 0x100dcbb8
// SIZE 0x18
class MxRegionCursor : public MxCore {
public:
	MxRegionCursor(MxRegion* p_region);
	~MxRegionCursor() override;

	virtual MxRect32* VTable0x14(MxRect32& p_rect); // vtable+0x14
	virtual MxRect32* VTable0x18();                 // vtable+0x18
	virtual MxRect32* VTable0x1c(MxRect32& p_rect); // vtable+0x1c
	virtual MxRect32* VTable0x20();                 // vtable+0x20
	virtual MxRect32* VTable0x24(MxRect32& p_rect); // vtable+0x24
	virtual MxRect32* VTable0x28();                 // vtable+0x28
	virtual MxRect32* VTable0x2c(MxRect32& p_rect); // vtable+0x2c
	virtual MxRect32* VTable0x30();                 // vtable+0x30

	// FUNCTION: LEGO1 0x100c4070
	virtual MxRect32* GetRect() { return m_rect; } // vtable+0x34

	// FUNCTION: LEGO1 0x100c4080
	virtual MxBool HasRect() { return m_rect != NULL; } // vtable+0x38

	virtual void Reset(); // vtable+0x3c

private:
	void ResetAndInitializeCursor(MxRegionLeftRightList& p_leftRightList);
	void UpdateRect(MxS32 p_left, MxS32 p_top, MxS32 p_right, MxS32 p_bottom);
	void ProcessRectOverlapAscending(MxRect32& p_rect);
	void ProcessOverlapWithRect(MxRect32& p_rect);

	MxRegion* m_region;                             // 0x08
	MxRect32* m_rect;                               // 0x0c
	MxRegionTopBottomListCursor* m_topBottomCursor; // 0x10
	MxRegionLeftRightListCursor* m_leftRightCursor; // 0x14
};

// SYNTHETIC: LEGO1 0x100c4090
// MxRegionCursor::`scalar deleting destructor'

#endif // MXREGIONCURSOR_H