Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.77 KB | None | 0 0
  1. // EPT8_CM.cpp : This file contains the 'main' function. Program execution begins and ends there.
  2. //
  3.  
  4. #include <iostream>
  5.  
  6. using namespace std;
  7. /////////////////////////////////CTAB
  8. #pragma once
  9. #define DEF_TAB_SIZE 10
  10. class CTab
  11. {
  12. public:
  13.     CTab() { pi_tab = new int[DEF_TAB_SIZE]; i_size = DEF_TAB_SIZE; }
  14.     CTab(const CTab& cOther);
  15.     CTab(CTab&& cOther);
  16.     CTab operator=(CTab&& cOther);
  17.     ~CTab();
  18.     bool bSetSize(int iNewSize);
  19.     int iGetSize() { return(i_size); }
  20. private:
  21.     void v_copy(const CTab& cOther);
  22.     int* pi_tab;
  23.     int i_size;
  24. };
  25.  
  26.  
  27. bool CTab::bSetSize(int a) {
  28.     if (a <= 0)
  29.         return false;
  30.     i_size = a;
  31.     return true;
  32. }
  33.  
  34. CTab::CTab(const CTab& cOther)
  35. {
  36.     v_copy(cOther);
  37.     std::cout << "Copy ";
  38. }
  39.  
  40. CTab::~CTab()
  41. {
  42.     if (pi_tab != NULL) delete pi_tab;
  43.     std::cout << "Destr ";
  44. }
  45.  
  46. /*
  47. CTab CTab::operator=(const CTab& cOther)
  48. {
  49.     if (pi_tab != NULL) delete pi_tab;
  50.     v_copy(cOther);
  51.     std::cout << "op= ";
  52.     return(*this);
  53. }
  54. */
  55. CTab CTab::operator=(CTab&& cOther)
  56. {
  57.     std::cout << "op= ";
  58.     pi_tab = cOther.pi_tab;
  59.     i_size = cOther.i_size;
  60.     cOther.pi_tab = NULL;
  61.     return (*this);
  62. }
  63.  
  64. void CTab::v_copy(const CTab& cOther)
  65. {
  66.     pi_tab = new int[cOther.i_size];
  67.     i_size = cOther.i_size;
  68.     for (int ii = 0; ii < cOther.i_size; ii++)
  69.         pi_tab[ii] = cOther.pi_tab[ii];
  70. }
  71.  
  72. CTab::CTab(CTab&& cOther)
  73. {
  74.     pi_tab = cOther.pi_tab;
  75.     i_size = cOther.i_size;
  76.     cOther.pi_tab = NULL;
  77.     std::cout << "MOVE ";
  78. }
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86. ///////////////////////////////////CTABLE (without move semantics)
  87.  
  88. const string s_name_default = "default_name";
  89. const int default_table_length = 10;
  90.  
  91. class CTable {
  92. public:
  93.     CTable();
  94.     CTable(string sName, int iTableLen);
  95.     CTable(const CTable& pcOthe);
  96.     ~CTable();
  97.  
  98.     void vSetName(string sName);
  99.     bool bSetNewSize(int iTableLen);
  100.     void printTable();
  101.     CTable* pcClone();
  102.     void vSetValueAt(int iOffset, int iNewVal);
  103.  
  104.     string s_name;
  105.     int* table;
  106.     int table_length;
  107.  
  108.     CTable operator + (CTable& tableToConcat);
  109.     void operator=(CTable& tableToConcat);
  110.  
  111.  
  112. };
  113.  
  114.  
  115.  
  116. void CTable::vSetName(string sName) {
  117.     s_name = sName;
  118. }
  119.  
  120. bool CTable::bSetNewSize(int iTableLen) {
  121.     if (iTableLen <= 0) {
  122.         return false;
  123.     }
  124.     int* table = new int[iTableLen];
  125.     table_length = iTableLen;
  126.     return true;
  127. }
  128.  
  129. CTable* CTable::pcClone() {
  130.     CTable clone(*this);
  131.     return &clone;
  132. }
  133.  
  134. CTable::CTable() {
  135.     s_name = s_name_default;
  136.     cout << "without: " << s_name << endl;
  137.     table = new int[default_table_length];
  138.     table_length = default_table_length;
  139. }
  140.  
  141. CTable::CTable(string sName, int iTableLen) {
  142.     s_name = sName;
  143.     cout << "parameter: " << s_name << endl;
  144.     table = new int[iTableLen];
  145.     table_length = iTableLen;
  146. }
  147.  
  148. CTable::CTable(const CTable& obj) {
  149.     s_name = obj.s_name + "_copy";
  150.     table = new int[obj.table_length];
  151.     table_length = obj.table_length;
  152.  
  153.     for (int i = 0; i < obj.table_length; i++) {
  154.         table[i] = obj.table[i];
  155.     }
  156.     cout << "copy: " << s_name << endl;
  157. }
  158.  
  159.  
  160. CTable::~CTable() {
  161.     cout << "removing: " << s_name << endl;
  162.     delete[] table;
  163. }
  164.  
  165.  
  166. void v_mod_tab(CTable* pcTab, int iNewSize) {
  167.     if (iNewSize > 0) {
  168.         pcTab->table = new int[iNewSize];
  169.         pcTab->table_length = iNewSize;
  170.     }
  171. }
  172. void v_mod_tab(CTable cTab, int iNewSize) {
  173.     if (iNewSize > 0) {
  174.         cTab.table = new int[iNewSize];
  175.         cTab.table_length = iNewSize;
  176.     }
  177. }
  178.  
  179. void CTable::printTable() {
  180.     for (int i = 0; i < table_length; i++) {
  181.         cout << "Element " << i << " value: " << table[i] << endl;
  182.     }
  183.     cout << endl;
  184. }
  185.  
  186. void CTable::vSetValueAt(int iOffset, int iNewVal) {
  187.     if (iOffset >= table_length) return;
  188.     table[iOffset] = iNewVal;
  189. }
  190.  
  191. /*
  192. CTable CTable::operator + (CTable &tableToConcat) {
  193.  
  194.     int newSize = table_length + tableToConcat.table_length;
  195.     CTable newCt("obj3", newSize);
  196.  
  197.  
  198.     for (int i = 0, j = 0; i < newSize; i++) {
  199.         if (i < table_length) {
  200.             newCt.table[i] = table[i];
  201.         }
  202.         else {
  203.             newCt.table[i] = tableToConcat.table[j++];
  204.         }
  205.     //  cout<<"ADDING: "<< newCt.table[i]<<endl;
  206.     }
  207.  
  208.     return newCt;
  209. }
  210. */
  211.  
  212. CTable CTable::operator + (CTable& tableToConcat) {
  213.  
  214.     int newSize;
  215.     if (table_length > tableToConcat.table_length) {
  216.         newSize = table_length;
  217.     }
  218.     else {
  219.         newSize = tableToConcat.table_length;
  220.     }
  221.  
  222.     CTable newCt("obj3", newSize);
  223.  
  224.  
  225.     for (int i = 0, j = 0; i < newSize; i++) {
  226.         if (i > tableToConcat.table_length - 1) {
  227.             newCt.table[i] = table[i];
  228.             //newCt.table[i] = 0;
  229.         }
  230.         else if (i > table_length - 1) {
  231.             newCt.table[i] = tableToConcat.table[i];
  232.             //newCt.table[i] = 0;
  233.         }
  234.         else
  235.         {
  236.             newCt.table[i] = table[i] + tableToConcat.table[i];
  237.         }
  238.  
  239.     }
  240.  
  241.     return newCt;
  242. }
  243.  
  244. void CTable::operator=(CTable& tableToConcat) {
  245.  
  246.     delete[] table;
  247.     int size = tableToConcat.table_length;
  248.     table = new int[size];
  249.  
  250.     for (int i = 0; i < size; i++) {
  251.         table[i] = tableToConcat.table[i];
  252.     }
  253.  
  254. }
  255.  
  256.  
  257.  
  258.  
  259.  
  260. /////////////////////////////////CTABLEMOVE
  261. class CTable_move {
  262. public:
  263.     CTable_move();
  264.     CTable_move(string sName, int iTableLen);
  265.     CTable_move(const CTable_move& pcOthe);
  266.     ~CTable_move();
  267.  
  268.     void vSetName(string sName);
  269.     bool bSetNewSize(int iTableLen);
  270.     void printTable();
  271.     CTable_move* pcClone();
  272.     void vSetValueAt(int iOffset, int iNewVal);
  273.  
  274.     string s_name;
  275.     int* table;
  276.     int table_length;
  277.  
  278.     // Stuff added in lab 8
  279.     CTable_move(CTable_move&& other); // move constructor
  280.     CTable_move& operator=(CTable_move&& other); // move assignment
  281.     CTable_move operator+ (CTable_move&& other);
  282.  
  283. };
  284.  
  285.  
  286. void CTable_move::vSetName(string sName) {
  287.     s_name = sName;
  288. }
  289.  
  290. bool CTable_move::bSetNewSize(int iTableLen) {
  291.     if (iTableLen <= 0) {
  292.         return false;
  293.     }
  294.     int* table = new int[iTableLen];
  295.     table_length = iTableLen;
  296.     return true;
  297. }
  298.  
  299. CTable_move* CTable_move::pcClone() {
  300.     CTable_move clone(*this);
  301.     return &clone;
  302. }
  303.  
  304. CTable_move::CTable_move() {
  305.     s_name = "default_name";
  306.     cout << "without: " << s_name << endl;
  307.     table = new int[10];
  308.     table_length = 10;
  309. }
  310.  
  311. CTable_move::CTable_move(string sName, int iTableLen) {
  312.     s_name = sName;
  313.     cout << "parameter: " << s_name << endl;
  314.     table = new int[iTableLen];
  315.     table_length = iTableLen;
  316. }
  317.  
  318. CTable_move::CTable_move(const CTable_move& obj) {
  319.     s_name = obj.s_name + "_copy";
  320.     table = new int[obj.table_length];
  321.     table_length = obj.table_length;
  322.  
  323.     for (int i = 0; i < obj.table_length; i++) {
  324.         table[i] = obj.table[i];
  325.     }
  326.     cout << "copy: " << s_name << endl;
  327. }
  328.  
  329.  
  330. CTable_move::~CTable_move() {
  331.     cout << "removing: " << s_name << endl;
  332.     delete[] table;
  333. }
  334.  
  335.  
  336. void v_mod_tab(CTable_move* pcTab, int iNewSize) {
  337.     if (iNewSize > 0) {
  338.         pcTab->table = new int[iNewSize];
  339.         pcTab->table_length = iNewSize;
  340.     }
  341. }
  342. void v_mod_tab(CTable_move cTab, int iNewSize) {
  343.     if (iNewSize > 0) {
  344.         cTab.table = new int[iNewSize];
  345.         cTab.table_length = iNewSize;
  346.     }
  347. }
  348.  
  349. void CTable_move::printTable() {
  350.     for (int i = 0; i < table_length; i++) {
  351.         cout << "Element " << i << " value: " << table[i] << endl;
  352.     }
  353.     cout << endl;
  354. }
  355.  
  356. void CTable_move::vSetValueAt(int iOffset, int iNewVal) {
  357.     if (iOffset >= table_length) return;
  358.     table[iOffset] = iNewVal;
  359. }
  360.  
  361. CTable_move CTable_move::operator + (CTable_move&& tableToConcat) {
  362.  
  363.     int newSize;
  364.     if (table_length > tableToConcat.table_length) {
  365.         newSize = table_length;
  366.     }
  367.     else {
  368.         newSize = tableToConcat.table_length;
  369.     }
  370.  
  371.     CTable_move newCt("obj3", newSize);
  372.  
  373.  
  374.     for (int i = 0, j = 0; i < newSize; i++) {
  375.         if (i > tableToConcat.table_length - 1) {
  376.             newCt.table[i] = table[i];
  377.             //newCt.table[i] = 0;
  378.         }
  379.         else if (i > table_length - 1) {
  380.             newCt.table[i] = tableToConcat.table[i];
  381.             //newCt.table[i] = 0;
  382.         }
  383.         else
  384.         {
  385.             newCt.table[i] = table[i] + tableToConcat.table[i];
  386.         }
  387.  
  388.     }
  389.  
  390.     return newCt;
  391. }
  392.  
  393. // MOVE
  394. CTable_move::CTable_move(CTable_move&& other) {
  395.     table = other.table;
  396.     table_length = other.table_length;
  397.  
  398.     other.table = NULL;
  399.     other.table_length = 0;
  400. }
  401.  
  402. CTable_move& CTable_move::operator=(CTable_move&& other) {
  403.  
  404.     if (this != &other)
  405.     {
  406.         delete[] table;
  407.  
  408.         table = other.table;
  409.         table_length = other.table_length;
  410.  
  411.         other.table = NULL;
  412.         other.table_length = 0;
  413.     }
  414.     return *this;
  415.     //return(std::move(*this));
  416. }
  417.  
  418.  
  419. ///////////////////////////////////TESTING
  420. CTab cCreateTab()
  421. {
  422.     CTab c_result;
  423.     c_result.bSetSize(5);
  424.     return(std::move(c_result));
  425. }
  426. CTable_move cCreateTableMove()
  427. {
  428.     CTable_move c_result;
  429.     c_result.bSetNewSize(5);
  430.     return(std::move(c_result));
  431. }
  432. CTable cCreateTable()
  433. {
  434.     CTable c_result;
  435.     c_result.bSetNewSize(5);
  436.     return c_result;
  437. }
  438.  
  439. int main()
  440. {
  441.  
  442.     cout << "\n= operator WITH move -0 copies\n" << endl;
  443.     CTable_move ctab1 = cCreateTableMove();
  444.     CTable_move ctab2 = cCreateTableMove();
  445.     ctab1 = std::move(ctab2);
  446.  
  447.  
  448.     cout << "\n\n= operator WITHOUT move -2 copies\n" << endl;
  449.     CTable ctab3 = cCreateTable();
  450.     CTable ctab4 = cCreateTable();
  451.     ctab3 = ctab3;
  452.  
  453.  
  454.     cout << "\n\n+ operator without MOVE -3 copies\n" << endl;
  455.     CTable ctab5 = cCreateTable();
  456.     CTable ctab6 = cCreateTable();
  457.     ctab5 + ctab6;
  458.  
  459.  
  460.     cout << "\n\n+ operator with MOVE -0 copies\n" << endl;
  461.     CTable_move ctab7 = cCreateTableMove();
  462.     CTable_move ctab8 = cCreateTableMove();
  463.     ctab7 + std::move(ctab8);
  464.  
  465.  
  466.     cout << "\n\n\n\n\nend - deallocation\n" << endl;
  467.     /*
  468.     cout << "\n--- TASK 3 ---\n" << endl;
  469.  
  470.     CTable c_tab_0, c_tab_1;
  471.     c_tab_0.bSetNewSize(6);
  472.     c_tab_1.bSetNewSize(4);
  473.  
  474.     c_tab_0.vSetValueAt(0, 0);
  475.     c_tab_0.vSetValueAt(1, 1);
  476.     c_tab_0.vSetValueAt(2, 2);
  477.     c_tab_0.vSetValueAt(3, 3);
  478.     c_tab_0.vSetValueAt(4, 4);
  479.     c_tab_0.vSetValueAt(5, 5);
  480.  
  481.  
  482.     c_tab_1.vSetValueAt(0, 50);
  483.     c_tab_1.vSetValueAt(1, 51);
  484.     c_tab_1.vSetValueAt(2, 52);
  485.     c_tab_1.vSetValueAt(3, 53);
  486.  
  487.  
  488.     cout << "\ntable 0 : \n";
  489.     c_tab_0.printTable();
  490.     cout << "table 1 : \n";
  491.     c_tab_1.printTable();
  492.  
  493.     CTable c_tab_2 = (c_tab_0 + c_tab_1);
  494.     c_tab_1.vSetValueAt(2, 123);
  495.  
  496.  
  497.     cout << "\ntable 2 : \n";
  498.     c_tab_2.printTable();
  499.  
  500.     cout << "\n--END--\n\n";
  501.     */
  502. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement