diff --git a/polinom/include/HeadRing.h b/polinom/include/HeadRing.h index 186050b..2f84bef 100644 --- a/polinom/include/HeadRing.h +++ b/polinom/include/HeadRing.h @@ -18,7 +18,9 @@ class THeadRing : public TDatList { int GoNext(void) override; void InsCurrent(T* pVal) override; void InsLast(T* pVal) override; - void DelList(void) override; + void DelList(void) override; + int IsListEnded(void) const override; + THeadRing& operator=(const THeadRing& q); }; diff --git a/polinom/src/DatList.hpp b/polinom/src/DatList.hpp index 5c8c3cb..08d772d 100644 --- a/polinom/src/DatList.hpp +++ b/polinom/src/DatList.hpp @@ -99,9 +99,10 @@ int TDatList::Reset(void) } template -int TDatList::IsListEnded(void) const -{ - return pCurrLink->pNext == pStop; +int TDatList::IsListEnded(void) const +{ + if (pCurrLink == NULL) return NULL; + return pCurrLink == pStop; } template diff --git a/polinom/src/HeadRing.hpp b/polinom/src/HeadRing.hpp index 77a8abc..736946d 100644 --- a/polinom/src/HeadRing.hpp +++ b/polinom/src/HeadRing.hpp @@ -1,3 +1,4 @@ +#include "HeadRing.h" template THeadRing::THeadRing() { @@ -40,8 +41,12 @@ int THeadRing::GoNext(void) { if (this->pCurrLink->GetNextDatLink() == this->pHead) { this->pCurrLink = this->pHead; - } - return TDatList::GoNext(); + } + + this->pPrevLink = this->pCurrLink; + this->pCurrLink = this->pCurrLink->GetNextDatLink(); + this->CurrPos = ++this->CurrPos % this->ListLen; + return this->CurrPos; } template @@ -76,6 +81,13 @@ void THeadRing::DelList(void) } } +template +int THeadRing::IsListEnded(void) const +{ + if (this->pCurrLink == NULL) return NULL; + return this->pPrevLink == pHead; +} + template THeadRing& THeadRing::operator=(const THeadRing& q) { diff --git a/table/ListTable/include/ListTable.h b/table/ListTable/include/ListTable.h index 9863f11..6d39ceb 100644 --- a/table/ListTable/include/ListTable.h +++ b/table/ListTable/include/ListTable.h @@ -5,7 +5,7 @@ #include #include "Table.h" -#include "DatList.h" +#include "HeadRing.h" /// /// Линейная таблица на списке. @@ -13,7 +13,7 @@ template class ListTable : public Table { protected: - TDatList::template STableRec> data; + THeadRing::template STableRec> data; public: ListTable(size_t maxSize = 10000) : Table(maxSize) { } ~ListTable() { } @@ -22,19 +22,19 @@ class ListTable : public Table { /// /// Возращает количество записей (длину таблицы). /// - size_t GetDataCount() const noexcept override { return data.size(); } + size_t GetDataCount() const noexcept override { return data.GetLength(); } /// /// Проверка таблицы на пустоту. /// Если длина таблицы равна нулю, возвращает true. /// - bool IsEmpty() const noexcept override { return data.size() == 0; } + bool IsEmpty() const noexcept override { return data.GetLength() == 0; } /// /// Проверка таблицы на заполненность. /// Если длина таблицы равна maxSize, возвращает true. /// - bool IsFull() const noexcept override { return data.size() == this->maxSize; }; + bool IsFull() const noexcept override { return data.GetLength() == this->maxSize; }; #pragma endregion #pragma region Main Methods @@ -59,6 +59,13 @@ class ListTable : public Table { #pragma endregion #pragma region Navigate + + /// + /// Устанавливает текущую позицию на первую запись + /// Возвращает 0 + /// + virtual size_t Reset(void) noexcept override; + /// /// Проверка окончания таблицы. /// Если таблица кончилась, то возращает true. diff --git a/table/ListTable/src/ListTable.hpp b/table/ListTable/src/ListTable.hpp index 57b8ad9..63e1a33 100644 --- a/table/ListTable/src/ListTable.hpp +++ b/table/ListTable/src/ListTable.hpp @@ -1,40 +1,80 @@ +#include "ListTable.h" template Value* ListTable::Find(Key key) { - return new Value(); + data.Reset(); + + while (!data.IsListEnded()) { + auto* record = data.GetDatValue(); + if (record == nullptr) + break; + + if (record->key == key) + return &record->value; + + data.GoNext(); + } + + throw std::runtime_error("Key not found in the table."); } template void ListTable::Insert(Key key, Value value) { + try { + Value* recValue = Find(key); + *recValue = value; + } + catch (std::runtime_error) { + if (!IsFull()) + data.InsLast(new Table::STableRec(key, value)); + else + throw std::length_error("Table is overflow"); + } } template void ListTable::Delete(Key key) { + Value* recValue = Find(key); + data.DelCurrent(); +} + +template +size_t ListTable::Reset(void) noexcept +{ + data.Reset(); + return Table::Reset(); } template bool ListTable::IsTabEnded(void) const noexcept { - return false; + return data.IsListEnded(); } template size_t ListTable::GoNext(void) noexcept { - return size_t(); + this->position = data.GoNext(); + return this->position; } template Key ListTable::GetKey(void) const { - return Key(); + auto* rec = data.GetDatValue(); + if (rec == nullptr) + throw std::runtime_error("Getting key from empty table"); + return rec->key; } template Value ListTable::GetValuePtr(void) const { - return Value(); + auto* rec = data.GetDatValue(); + if (rec == nullptr) + throw std::runtime_error("Getting value from empty table"); + return rec->value; } diff --git a/table/ListTable/test/test_listTable.cpp b/table/ListTable/test/test_listTable.cpp new file mode 100644 index 0000000..0a668cb --- /dev/null +++ b/table/ListTable/test/test_listTable.cpp @@ -0,0 +1,99 @@ +#include +#include "ListTable.h" +using namespace std; + +TEST(ListTable, Get_size) { + ListTable table; + ASSERT_EQ(0, table.GetDataCount()); + ASSERT_NO_THROW(table.Insert("r1", 1234)); + ASSERT_EQ(1, table.GetDataCount()); +} + +TEST(ListTable, Is_empty) { + ListTable table; + ASSERT_EQ(true, table.IsEmpty()); + ASSERT_NO_THROW(table.Insert("r1", 1234)); + ASSERT_EQ(false, table.IsEmpty()); +} + +TEST(ListTable, Is_full) { + ListTable table(1); + ASSERT_EQ(false, table.IsFull()); + ASSERT_NO_THROW(table.Insert("r1", 1234)); + ASSERT_EQ(true, table.IsFull()); +} + +TEST(ListTable, Insert) { + ListTable table; + ASSERT_NO_THROW(table.Insert("r1", 1234)); + ASSERT_EQ(1, table.GetDataCount()); +} + +TEST(ListTable, Delete_exist_record) { + ListTable table; + ASSERT_NO_THROW(table.Insert("r1", 1234)); + ASSERT_NO_THROW(table.Delete("r1")); + ASSERT_EQ(0, table.GetDataCount()); +} + +TEST(ListTable, Delete_not_exist_record) { + ListTable table; + ASSERT_THROW(table.Delete("r1"), std::runtime_error); +} + +TEST(ListTable, Find_exist_record) { + ListTable table; + ASSERT_NO_THROW(table.Insert("r1", 1234)); + + int* val; + ASSERT_NO_THROW(val = table.Find("r1")); + ASSERT_EQ(1234, *val); +} + +TEST(ListTable, Find_not_exist_record) { + ListTable table; + ASSERT_THROW(table.Find("r1"), std::runtime_error); +} + +TEST(ListTable, Reset) { + ListTable table; + ASSERT_EQ(0, table.Reset()); +} + +TEST(ListTable, Is_table_ended) { + ListTable table; + ASSERT_NO_THROW(table.Insert("r1", 1234)); + ASSERT_EQ(false, table.IsTabEnded()); + ASSERT_NO_THROW(table.GoNext()); + ASSERT_EQ(true, table.IsTabEnded()); +} + +TEST(ListTable, Go_next) { + ListTable table; + ASSERT_NO_THROW(table.Insert("r1", 1234)); + ASSERT_NO_THROW(table.Insert("r2", 1234)); + ASSERT_EQ(1, table.GoNext()); + ASSERT_EQ(0, table.GoNext()); +} + +TEST(ListTable, Get_key) { + ListTable table; + ASSERT_NO_THROW(table.Insert("r1", 1234)); + ASSERT_EQ("r1", table.GetKey()); +} + +TEST(ListTable, Get_key_from_empty_table) { + ListTable table; + ASSERT_THROW(table.GetKey(), std::runtime_error); +} + +TEST(ListTable, Get_value) { + ListTable table; + ASSERT_NO_THROW(table.Insert("r1", 1234)); + ASSERT_EQ(1234, table.GetValuePtr()); +} + +TEST(ListTable, Get_value_from_empty_table) { + ListTable table; + ASSERT_THROW(table.GetValuePtr(), std::runtime_error); +} diff --git a/table/ListTable/test/test_vectorTable.cpp b/table/ListTable/test/test_vectorTable.cpp deleted file mode 100644 index 1fefe37..0000000 --- a/table/ListTable/test/test_vectorTable.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include -#include "ListTable.h" -using namespace std; diff --git a/table/Table/include/Table.h b/table/Table/include/Table.h index decb01b..6a0ac68 100644 --- a/table/Table/include/Table.h +++ b/table/Table/include/Table.h @@ -16,6 +16,10 @@ class Table { struct STableRec { Key key; Value value; + STableRec(Key key, Value value) { + this->key = key; + this->value = value; + } }; ///