#pragma once
#include "LabelRefDefs.h"

// Класс для управления таблицей ссылок на метки.
// в общем случае - это таблица ссылок на арифметические выражения, которые встречаются в коде
// в тривиальном случае арифметическое выражение состоит из одного имени метки.
class CRefsTable
{
#if defined _DEBUG
		fs::path            m_strDumpName;
#endif

	protected:
		std::vector <LabelRef> RefsTable;

	public:
		CRefsTable() noexcept;
#if defined _DEBUG
		void                SetDumpName(const fs::path &strDumpName);
		void                Dump();
#endif
		virtual ~CRefsTable();

		void                Clear();    // очистка массива меток
		inline size_t       getSize() const noexcept
		{
			return RefsTable.size();
		}
		bool                AddRefs(const CBKToken *token, const int addr, uint32_t lt);
		bool                AddRefs(const LabelRef &lbl);

		uint32_t            GetType(const size_t n);
		void                DeleteElement(const size_t n);
		LabelRef           &GetElement(const size_t n)
		{
			return RefsTable.at(n);
		}

		void                LockUndefinedLocalLabels();
		void                FixLocalLabels(const CBKToken *token, const int value);
};

extern CRefsTable  g_RefsTable;     // таблица ссылок на метки, локальные и глобальные.

