#pragma once
#include "LabelDefs.h"

// Класс для управления таблицей меток.
// необходимые функции - добавление, удаление, очистка таблицы, поиск и выдача результата.

class CLabelTable
{
#if defined _DEBUG
		fs::path            m_strDumpName;
#endif

	protected:
		std::vector <Label> LabelTable;

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

		void                Clear();    // очистка массива меток
		inline size_t       getSize() const noexcept
		{
			return LabelTable.size();
		}

		bool                AddLabel(CBKToken *token, const int value, const uint32_t lt);
		bool                AddLabel(Label &lbl);
		CBKToken           *GetLabel(const size_t n);
		void                DeleteLabel(const CBKToken *token);
		void                DeleteLabel(const size_t n);
		int                 SearchLabel(const CBKToken *token);
		int                 GetValue(const CBKToken *token);
		int                 GetValue(const size_t n);
		uint32_t            GetType(const CBKToken *token);
		uint32_t            GetType(const size_t n);
		Label              &GetElement(const size_t n) // получить элемент таблицы по его номеру
		{
			return LabelTable.at(n);
		}
};

extern CLabelTable g_labelGlobalDefs;  // таблица глобальных меток
extern CLabelTable g_labelLocalDefs;   // таблица локальных меток, должна очищаться каждый раз при добавлении метки в таблицу глобальных меток
