constk

ListContext for LR1 Algorythms and data structures

Sep 18th, 2021 (edited)
682
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "pch.h"
  2. #include "ListContext.h"
  3.  
  4. // создание списка
  5. ListContext::ListContext(ListType listType, DataType dataType) : listType(listType), dataType(dataType)
  6. {
  7.     if (listType == ListType::NotChoosed || dataType == DataType::NotChoosed)
  8.         throw gcnew System::Exception("Не выбран тип списка или тип данных");
  9.  
  10.     Clear();
  11.  
  12.     switch (dataType)
  13.     {
  14.     case DataType::Integer:
  15.         switch (listType)
  16.         {
  17.         case ListType::Single: iList = gcnew SingleList<int>; break;
  18.         case ListType::Double: iList = gcnew DoubleList<int>; break;
  19.         case ListType::CyclicSingle: iList = gcnew CyclicSingleList<int>; break;
  20.         case ListType::CyclicDouble: iList = gcnew CyclicDoubleList<int>; break;
  21.         }
  22.         break;
  23.     case DataType::Double:
  24.         switch (listType)
  25.         {
  26.         case ListType::Single: dList = gcnew SingleList<double>; break;
  27.         case ListType::Double: dList = gcnew DoubleList<double>; break;
  28.         case ListType::CyclicSingle: dList = gcnew CyclicSingleList<double>; break;
  29.         case ListType::CyclicDouble: dList = gcnew CyclicDoubleList<double>; break;
  30.         }
  31.         break;
  32.     case DataType::Char:
  33.         switch (listType)
  34.         {
  35.         case ListType::Single: cList = gcnew SingleList<char>; break;
  36.         case ListType::Double: cList = gcnew DoubleList<char>; break;
  37.         case ListType::CyclicSingle: cList = gcnew CyclicSingleList<char>; break;
  38.         case ListType::CyclicDouble: cList = gcnew CyclicDoubleList<char>; break;
  39.         }
  40.         break;
  41.     }
  42. }
  43.  
  44. // печать списка
  45. inline void ListContext::Print(System::Windows::Forms::ListBox^ listBoxForPrint)
  46. {
  47.     switch (dataType)
  48.     {
  49.     case DataType::Integer: iList->Print(listBoxForPrint); break;
  50.     case DataType::Double: dList->Print(listBoxForPrint); break;
  51.     case DataType::Char: cList->Print(listBoxForPrint); break;
  52.     }
  53. }
  54.  
  55. // удалить элемент с указанным индексом
  56. inline void ListContext::Delete(int index)
  57. {
  58.     switch (dataType)
  59.     {
  60.     case DataType::Integer: iList->Delete(index); break;
  61.     case DataType::Double: dList->Delete(index); break;
  62.     case DataType::Char: cList->Delete(index); break;
  63.     }
  64. }
  65.  
  66. // удаление всего списка
  67. inline void ListContext::Clear()
  68. {
  69.     switch (dataType)
  70.     {
  71.     case DataType::Integer: if(iList != nullptr) iList->Clear(); break;
  72.     case DataType::Double: if(dList != nullptr) dList->Clear(); break;
  73.     case DataType::Char: if (cList != nullptr) cList->Clear(); break;
  74.     }
  75.  
  76.     iList = nullptr;
  77.     dList = nullptr;
  78.     cList = nullptr;
  79. }
  80.  
  81. // проверка списка на пустоту
  82. inline bool ListContext::IsEmpty()
  83. {
  84.     switch (dataType)
  85.     {
  86.     case DataType::Integer: return iList->IsEmpty();
  87.     case DataType::Double: return dList->IsEmpty();
  88.     case DataType::Char: return cList->IsEmpty();
  89.     }
  90. }
  91.  
  92. // возвращает размер списка
  93. inline int ListContext::Size()
  94. {
  95.     switch (dataType)
  96.     {
  97.     case DataType::Integer: return iList->Size();
  98.     case DataType::Double: return dList->Size();
  99.     case DataType::Char: return cList->Size();
  100.     }
  101. }
  102.  
  103. // вставка в начало
  104. inline void ListContext::InsertToBegin(int value)
  105. {
  106.     if (dataType != DataType::Integer)
  107.         throw gcnew System::ArgumentException("Ожидался целочисленный тип");
  108.  
  109.     iList->InsertToBegin(value);
  110. }
  111. inline void ListContext::InsertToBegin(double value)
  112. {
  113.     if (dataType != DataType::Double)
  114.         throw gcnew System::ArgumentException("Ожидался действительный тип");
  115.  
  116.     dList->InsertToBegin(value);
  117. }
  118. inline void ListContext::InsertToBegin(char value)
  119. {
  120.     if (dataType != DataType::Char)
  121.         throw gcnew System::ArgumentException("Ожидался символьный тип");
  122.  
  123.     cList->InsertToBegin(value);
  124. }
  125.  
  126. // вставка после элемента с указанным индексом
  127. inline void ListContext::Insert(int value, int index)
  128. {
  129.     if (dataType != DataType::Integer)
  130.         throw gcnew System::ArgumentException("Ожидался целочисленный тип");
  131.  
  132.     if (IsEmpty())
  133.         InsertToBegin(value);
  134.     else
  135.         iList->Insert(value, index);
  136. }
  137. inline void ListContext::Insert(double value, int index)
  138. {
  139.     if (dataType != DataType::Double)
  140.         throw gcnew System::ArgumentException("Ожидался действительный тип");
  141.  
  142.     if (IsEmpty())
  143.         InsertToBegin(value);
  144.     else
  145.         dList->Insert(value, index);
  146. }
  147. inline void ListContext::Insert(char value, int index)
  148. {
  149.     if (dataType != DataType::Char)
  150.         throw gcnew System::ArgumentException("Ожидался символьный тип");
  151.  
  152.     if (IsEmpty())
  153.         InsertToBegin(value);
  154.     else
  155.         cList->Insert(value, index);
  156. }
  157.  
  158. // поиск элемента
  159. inline int ListContext::Find(int value)
  160. {
  161.     if (dataType != DataType::Integer)
  162.         throw gcnew System::ArgumentException("Ожидался целочисленный тип");
  163.  
  164.     return iList->Find(value);
  165. }
  166. inline int ListContext::Find(double value)
  167. {
  168.     if (dataType != DataType::Integer)
  169.         throw gcnew System::ArgumentException("Ожидался действительный тип");
  170.  
  171.     return dList->Find(value);
  172. }
  173. inline int ListContext::Find(char value)
  174. {
  175.     if (dataType != DataType::Char)
  176.         throw gcnew System::ArgumentException("Ожидался символьный тип");
  177.  
  178.     return cList->Find(value);
  179. }
  180.  
  181.  
RAW Paste Data