Guest User

Untitled

a guest
May 1st, 2024
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.97 KB | None | 0 0
  1. struct IMAP {
  2.     struct PACKAGE {
  3.         PACKAGE() {
  4.             this->z = 0;
  5.             this->exist = false;
  6.             this->item = nullptr;
  7.         };
  8.         ITEM* item;
  9.         bool exist;
  10.         double z;
  11.  
  12.         void Make(const ITEM item, double z = 0.0) {
  13.             this->Clear();
  14.             this->item = new ITEM(item);
  15.             this->z = z;
  16.             this->exist = true;
  17.         }
  18.  
  19.         void Make(PACKAGE p) {
  20.             this->item = new ITEM((const ITEM)*p.item);
  21.             this->z = p.z;
  22.             this->exist = true;
  23.             p.Clear();
  24.  
  25.         }
  26.  
  27.         void Clear() {
  28.             if (this->item != nullptr) {
  29.                 delete this->item;
  30.                 this->item = nullptr;
  31.                 this->exist = false;
  32.                 this->z = 0.0;
  33.             }
  34.             else {
  35.                 this->exist = false;
  36.                 this->z = 0.0;
  37.             }
  38.         }
  39.     };
  40.  
  41.     IMAP(SINT block = 8) {
  42.         this->block = block;
  43.         this->size = 0;
  44.         this->length = 0;
  45.         this->last = 0;
  46.         this->counter = 0;
  47.         this->package = nullptr;
  48.         this->debug = false;
  49.         this->z = false;
  50.     };
  51.     DINT size, length, block, last, counter;
  52.     bool debug, z;
  53.     drx::util::IMAP<ITEM>::PACKAGE* package;
  54.     drx::util::IMAP<ITEM>::PACKAGE dummy;
  55.  
  56.     void _resize(DINT size = 0) {
  57.         int total = this->size;
  58.         if (size > 0) {
  59.             this->size += size;
  60.         }
  61.         else {
  62.             this->size += this->block;
  63.         }
  64.         if (this->length > 0) {
  65.             drx::util::IMAP<ITEM>::PACKAGE* package = new drx::util::IMAP<ITEM>::PACKAGE[this->size];
  66.             for (int i = 0, c = 0; i < total; i++) {
  67.                 if (this->package[i].exist) {
  68.                     package[c].Make((const drx::util::IMAP<ITEM>::PACKAGE)this->package[i]);
  69.                     c++;
  70.                 }
  71.             }
  72.             delete[] this->package;
  73.             this->package = package;
  74.  
  75.         }
  76.         else {
  77.             this->package = new drx::util::IMAP<ITEM>::PACKAGE[this->size];
  78.         }
  79.     }
  80.  
  81.  
  82.     void Position(ITEM item, DINT pos) {
  83.         for (; this->size <= pos;) this->_resize();
  84.         if (!this->package[pos].exist) {
  85.             this->package[pos].Make(item, 0.0);
  86.             this->last = pos;
  87.             this->length++;
  88.             this->counter++;
  89.         }
  90.  
  91.     }
  92.  
  93.     bool Null(SINT pos) {
  94.         return (this->package[pos].item == nullptr);
  95.     }
  96.  
  97.     void operator << (ITEM item) {
  98.         if (this->size == 0 || this->length == this->size) this->_resize();
  99.         for (DINT i = 0; i < this->size; i++) {
  100.             if (!this->package[i].exist && this->package[i].item == nullptr) {
  101.                 this->package[i].Make(item, (double)this->counter);
  102.                 this->last = i;
  103.                 this->length++;
  104.                 this->counter++;
  105.                 break;
  106.             }
  107.         }
  108.     }
  109.  
  110.     ITEM& operator [] (DINT pos) {
  111.         if (1 == 0 && this->debug) {
  112.             for (DINT i = 0; i < this->size; i++) {
  113.                 PACKAGE p = this->package[i];
  114.                 if (p.exist) {
  115.                     std::cout << "\nI :: " << i;
  116.                 }
  117.             }
  118.         }
  119.         if (pos >= 0 && pos < this->size) return *this->package[pos].item;
  120.         return *this->dummy.item;
  121.     }
  122.  
  123.     void _close() {
  124.         if (this != nullptr) {
  125.             if (this->size > 0) {
  126.                 for (DINT i = 0; i < this->size; i++) {
  127.                     this->package[i].Clear();
  128.                 }
  129.                 this->size = 0;
  130.             }
  131.             if (this->package != nullptr) {
  132.                 delete[] this->package;
  133.                 this->package = nullptr;
  134.             }
  135.             this->length = 0;
  136.             this->last = 0;
  137.             this->counter = 0;
  138.             this->z = false;
  139.         }
  140.     }
  141.  
  142. };
Advertisement
Add Comment
Please, Sign In to add comment