Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
MQTTSNGWProcess.h
00001 /************************************************************************************** 00002 * Copyright (c) 2016, Tomoaki Yamaguchi 00003 * 00004 * All rights reserved. This program and the accompanying materials 00005 * are made available under the terms of the Eclipse Public License v1.0 00006 * and Eclipse Distribution License v1.0 which accompany this distribution. 00007 * 00008 * The Eclipse Public License is available at 00009 * http://www.eclipse.org/legal/epl-v10.html 00010 * and the Eclipse Distribution License is available at 00011 * http://www.eclipse.org/org/documents/edl-v10.php. 00012 * 00013 * Contributors: 00014 * Tomoaki Yamaguchi - initial API and implementation and/or initial documentation 00015 **************************************************************************************/ 00016 00017 #ifndef MQTTSNGWPROCESS_H_ 00018 #define MQTTSNGWPROCESS_H_ 00019 00020 #include <exception> 00021 #include <string> 00022 #include <signal.h> 00023 #include "MQTTSNGWDefines.h" 00024 #include "Threading.h" 00025 00026 using namespace std; 00027 00028 namespace MQTTSNGW 00029 { 00030 00031 /*================================= 00032 * Parameters 00033 ==================================*/ 00034 #define MQTTSNGW_MAX_TASK 10 // number of Tasks 00035 #define PROCESS_LOG_BUFFER_SIZE 16384 // Ring buffer size for Logs 00036 #define MQTTSNGW_PARAM_MAX 128 // Max length of config records. 00037 00038 /*================================= 00039 * Macros 00040 ==================================*/ 00041 #define WRITELOG theProcess->putLog 00042 #define CHK_SIGINT (theProcess->checkSignal() == SIGINT) 00043 #define UNUSED(x) ((void)(x)) 00044 /*================================= 00045 Class Process 00046 ==================================*/ 00047 class Process 00048 { 00049 public: 00050 Process(); 00051 virtual ~Process(); 00052 virtual void initialize(int argc, char** argv); 00053 virtual void run(void); 00054 void putLog(const char* format, ...); 00055 void resetRingBuffer(void); 00056 int getArgc(void); 00057 char** getArgv(void); 00058 int getParam(const char* parameter, char* value); 00059 const char* getLog(void); 00060 int checkSignal(void); 00061 const string* getConfigDirName(void); 00062 const string* getConfigFileName(void); 00063 private: 00064 int _argc; 00065 char** _argv; 00066 string _configDir; 00067 string _configFile; 00068 RingBuffer* _rb; 00069 Semaphore* _rbsem; 00070 Mutex _mt; 00071 int _log; 00072 char _rbdata[PROCESS_LOG_BUFFER_SIZE + 1]; 00073 }; 00074 00075 /*===================================== 00076 Class MultiTaskProcess 00077 ====================================*/ 00078 class MultiTaskProcess: public Process 00079 { 00080 public: 00081 MultiTaskProcess(void); 00082 ~MultiTaskProcess(); 00083 void initialize(int argc, char** argv); 00084 int getParam(const char* parameter, char* value); 00085 void run(void); 00086 void waitStop(void); 00087 void threadStoped(void); 00088 void attach(Thread* thread); 00089 00090 private: 00091 Thread* _threadList[MQTTSNGW_MAX_TASK]; 00092 Mutex _mutex; 00093 int _threadCount; 00094 int _stopCount; 00095 }; 00096 00097 /*===================================== 00098 Class Exception 00099 =====================================*/ 00100 class Exception: public exception 00101 { 00102 public: 00103 Exception(const string& message); 00104 Exception(const int exNo, const string& message); 00105 Exception(const int exNo, const string& message, 00106 const char* file, const char* func, const int line); 00107 virtual ~Exception() throw (); 00108 const char* getFileName(); 00109 const char* getFunctionName(); 00110 const int getLineNo(); 00111 const int getExceptionNo(); 00112 virtual const char* what() const throw (); 00113 void writeMessage(); 00114 00115 private: 00116 int _exNo; 00117 string _message; 00118 const char* _fileName; 00119 const char* _functionName; 00120 int _line; 00121 }; 00122 00123 00124 /*===================================== 00125 Class QueElement 00126 ====================================*/ 00127 template<class T> 00128 class QueElement 00129 { 00130 template<class U> friend class Que; 00131 public: 00132 QueElement(T* t) 00133 { 00134 _element = t; 00135 _next = nullptr; 00136 _prev = nullptr; 00137 } 00138 00139 ~QueElement() 00140 { 00141 } 00142 00143 private: 00144 T* _element; 00145 QueElement<T>* _next; 00146 QueElement<T>* _prev; 00147 }; 00148 00149 /*===================================== 00150 Class Que 00151 ====================================*/ 00152 template<class T> 00153 class Que 00154 { 00155 public: 00156 Que() 00157 { 00158 _head = nullptr; 00159 _tail = nullptr; 00160 _cnt = 0; 00161 _maxSize = 0; 00162 } 00163 00164 ~Que() 00165 { 00166 QueElement<T>* elm = _head; 00167 while (elm) 00168 { 00169 QueElement<T>* next = elm->_next; 00170 delete elm->_element; 00171 delete elm; 00172 elm = next; 00173 } 00174 } 00175 00176 void pop(void) 00177 { 00178 if ( _head ) 00179 { 00180 QueElement<T>* head = _head; 00181 if ( _head == _tail ) 00182 { 00183 _head = _tail = nullptr; 00184 } 00185 else 00186 { 00187 _head = head->_next; 00188 head->_prev = nullptr; 00189 } 00190 delete head; 00191 _cnt--; 00192 } 00193 } 00194 00195 T* front(void) 00196 { 00197 { 00198 if ( _head ) 00199 { 00200 return _head->_element; 00201 } 00202 else 00203 { 00204 return 0; 00205 } 00206 } 00207 } 00208 00209 int post(T* t) 00210 { 00211 if ( t && ( _maxSize == 0 || _cnt < _maxSize )) 00212 { 00213 QueElement<T>* elm = new QueElement<T>(t); 00214 if ( _head ) 00215 { 00216 if ( _tail == _head ) 00217 { 00218 elm->_prev = _tail; 00219 _tail = elm; 00220 _head->_next = elm; 00221 } 00222 else 00223 { 00224 _tail->_next = elm; 00225 elm->_prev = _tail; 00226 _tail = elm; 00227 } 00228 } 00229 else 00230 { 00231 _head = elm; 00232 _tail = elm; 00233 } 00234 _cnt++; 00235 return _cnt; 00236 } 00237 return 0; 00238 } 00239 00240 int size(void) 00241 { 00242 return _cnt; 00243 } 00244 00245 void setMaxSize(int maxSize) 00246 { 00247 _maxSize = maxSize; 00248 } 00249 00250 private: 00251 int _cnt; 00252 int _maxSize; 00253 QueElement<T>* _head; 00254 QueElement<T>* _tail; 00255 }; 00256 00257 /*===================================== 00258 Class Tree23 00259 ====================================*/ 00260 #define TREE23_INSERT_ACTIVE (-2) 00261 #define TREE23_DELETE_ACTIVE (-1) 00262 #define TREE23_BI_NODE (2) 00263 #define TREE23_TRI_NODE (3) 00264 00265 template <typename K, typename V> 00266 class Tree23Elm{ 00267 template<typename T, typename U> friend class Tree23; 00268 public: 00269 Tree23Elm() 00270 { 00271 _key = 0; 00272 _val = 0; 00273 } 00274 00275 Tree23Elm(K* key, V* val) 00276 { 00277 _key = key; 00278 _val = val; 00279 } 00280 00281 ~Tree23Elm() 00282 { 00283 00284 } 00285 00286 int compare(Tree23Elm<K, V>* elm) 00287 { 00288 return _key->compare(elm->_key); 00289 } 00290 private: 00291 K* _key; 00292 V* _val; 00293 }; 00294 00295 00296 template <typename K, typename V> 00297 class Tree23Node{ 00298 template<typename S, typename W> friend class Tree23; 00299 public: 00300 Tree23Node(const int type) 00301 { 00302 _type = type; 00303 _telm0 = _telm1 = NULL; 00304 _left = _midle = _right = NULL; 00305 } 00306 00307 Tree23Node(const int type, Tree23Node<K, V>* midle) 00308 { 00309 _type = type; 00310 _telm0 = _telm1 = NULL; 00311 _left = _right = NULL; 00312 _midle = midle; 00313 } 00314 00315 Tree23Node(const int type, Tree23Elm<K, V>* telm) 00316 { 00317 _type = type; 00318 _telm0 = telm; 00319 _telm1 = NULL; 00320 _left = _midle = _right = NULL; 00321 } 00322 00323 Tree23Node(const int type, Tree23Elm<K, V>* telm, Tree23Node<K, V>* left, Tree23Node<K, V>* right) 00324 { 00325 _type = type; 00326 _telm0 = telm; 00327 _telm1 = NULL; 00328 _left = left; 00329 _midle = NULL; 00330 _right = right; 00331 } 00332 00333 Tree23Node(const int type, Tree23Elm<K, V>* telm0, Tree23Elm<K, V>* telm1, Tree23Node<K, V>* left, Tree23Node<K, V>* midle, Tree23Node<K, V>* right) 00334 { 00335 _type = type; 00336 _telm0 = telm0; 00337 _telm1 = telm1; 00338 _left = left; 00339 _midle = midle; 00340 _right = right; 00341 } 00342 00343 ~Tree23Node() 00344 { 00345 00346 } 00347 00348 private: 00349 int _type; 00350 Tree23Elm<K, V>* _telm0; 00351 Tree23Elm<K, V>* _telm1; 00352 Tree23Node<K, V>* _left; 00353 Tree23Node<K, V>* _midle; 00354 Tree23Node<K, V>* _right; 00355 }; 00356 00357 template <typename K, typename V> 00358 class Tree23{ 00359 public: 00360 Tree23() 00361 { 00362 _root = NULL; 00363 } 00364 00365 ~Tree23() 00366 { 00367 if ( _root ) 00368 { 00369 delete _root; 00370 } 00371 } 00372 00373 void add(K* key, V* val) 00374 { 00375 _root = add( _root, new Tree23Elm<K, V>(key, val)); 00376 _root->_type = abs(_root->_type); 00377 } 00378 00379 Tree23Node<K, V>* add(Tree23Node<K, V>* n, Tree23Elm<K, V>* elm) 00380 { 00381 if ( n == 0 ) 00382 { 00383 return new Tree23Node<K, V>(TREE23_INSERT_ACTIVE, elm); 00384 } 00385 00386 int cmp0 = elm->compare(n->_telm0); 00387 int cmp1 = 0; 00388 switch ( n->_type ) 00389 { 00390 case 2: 00391 if ( cmp0 < 0 ) 00392 { 00393 n->_left = add(n->_left, elm); 00394 return addLeft2(n); 00395 } 00396 else if ( cmp0 == 0 ) 00397 { 00398 n->_telm0 = elm; 00399 return n; 00400 } 00401 else 00402 { 00403 n->_right = add(n->_right, elm); 00404 return addRight2(n); 00405 } 00406 break; 00407 case 3: 00408 cmp1 = elm->compare(n->_telm1); 00409 if ( cmp0 < 0 ) 00410 { 00411 n->_left = add(n->_left, elm); 00412 return addLeft3(n); 00413 } 00414 else if ( cmp0 == 0 ) 00415 { 00416 n->_telm0 = elm; 00417 return n; 00418 } 00419 else if ( cmp1 < 0 ) 00420 { 00421 n->_midle = add(n->_midle, elm); 00422 return addMidle3(n); 00423 } 00424 else if ( cmp1 == 0 ) 00425 { 00426 n->_telm1 = elm; 00427 return n; 00428 } 00429 else 00430 { 00431 n->_right = add(n->_right, elm); 00432 return addRight3(n); 00433 } 00434 break; 00435 default: 00436 break; 00437 } 00438 return 0; 00439 } 00440 00441 void remove(K* k) 00442 { 00443 _root = remove(_root, k); 00444 if ( _root != NULL && _root->_type == TREE23_DELETE_ACTIVE ) 00445 { 00446 _root = _root->_midle; 00447 } 00448 } 00449 00450 Tree23Node<K, V>* remove(Tree23Node<K, V>* node, K* k) 00451 { 00452 if ( node == NULL ) 00453 { 00454 return NULL; 00455 } 00456 int cmp0 = k->compare(node->_telm0->_key); 00457 int cmp1 = 0; 00458 switch ( node->_type ) 00459 { 00460 case 2: 00461 if ( cmp0 < 0 ) 00462 { 00463 node->_left = remove( node->_left, k); 00464 return removeLeft2(node); 00465 } 00466 else if ( cmp0 == 0 ) 00467 { 00468 if ( node->_left == NULL) 00469 { 00470 return new Tree23Node<K, V>(TREE23_DELETE_ACTIVE); 00471 } 00472 Tree23Elm<K, V>* maxLeft = new Tree23Elm<K, V>(); 00473 node->_left = removeMax(node->_left, maxLeft); 00474 node->_telm0 = maxLeft; 00475 return removeLeft2(node); 00476 } 00477 else 00478 { 00479 node->_right = remove(node->_right, k); 00480 return removeRight2(node); 00481 } 00482 case 3: 00483 cmp1 = k->compare(node->_telm1->_key); 00484 if ( cmp0 < 0 ) 00485 { 00486 node->_left = remove(node->_left, k); 00487 return removeLeft3(node); 00488 } 00489 else if ( cmp0 == 0 ) 00490 { 00491 if ( node->_left == NULL ) 00492 { 00493 return new Tree23Node<K, V>(TREE23_BI_NODE, node->_telm1); 00494 } 00495 Tree23Elm<K, V>* maxLeft = new Tree23Elm<K, V>(); 00496 node->_left = removeMax(node->_left, maxLeft); 00497 node->_telm0 = maxLeft; 00498 return removeLeft3(node); 00499 } 00500 else if ( cmp1 < 0 ) 00501 { 00502 node->_midle = remove(node->_midle, k); 00503 return removeMidle3(node); 00504 } 00505 else if ( cmp1 == 0 ) 00506 { 00507 if ( node->_midle == NULL ) 00508 { 00509 return new Tree23Node<K, V>(TREE23_BI_NODE, node->_telm0); 00510 } 00511 Tree23Elm<K, V>* maxMidle = new Tree23Elm<K, V>(); 00512 node->_midle = removeMax(node->_midle, maxMidle); 00513 node->_telm1 = maxMidle; 00514 return removeMidle3(node); 00515 } 00516 else 00517 { 00518 node->_right = remove(node->_right, k); 00519 return removeRight3(node); 00520 } 00521 default: 00522 break; 00523 } 00524 return NULL; 00525 } 00526 00527 bool find(K* key) 00528 { 00529 Tree23Node<K, V>* node = _root; 00530 while (node != NULL) 00531 { 00532 int cmp0 = key->compare(node->_telm0->_key); 00533 int cmp1 = 0; 00534 switch (node->_type) 00535 { 00536 case 2: 00537 if ( cmp0 < 0 ) node = node->_left; 00538 else if ( cmp0 == 0 ) 00539 { 00540 return true; 00541 } 00542 else 00543 { 00544 node = node->_right; 00545 } 00546 break; 00547 case 3: 00548 cmp1 = key->compare(node->_telm1->_key); 00549 if ( cmp0 < 0 ) 00550 { 00551 node = node->_left; 00552 } 00553 else if ( cmp0 == 0 ) 00554 { 00555 return true; 00556 } 00557 else if ( cmp1 < 0 ) 00558 { 00559 node = node->_midle; 00560 } 00561 else if ( cmp1 == 0 ) 00562 { 00563 return true; 00564 } 00565 else 00566 { 00567 node = node->_right; 00568 } 00569 break; 00570 default: 00571 break; 00572 } 00573 } 00574 return false; 00575 } 00576 00577 00578 V* getVal(K* key) 00579 { 00580 Tree23Node<K, V>* node = _root; 00581 while (node != NULL) 00582 { 00583 int cmp0 = key->compare(node->_telm0->_key); 00584 int cmp1 = 0; 00585 switch (node->_type) 00586 { 00587 case 2: 00588 if ( cmp0 < 0 ) 00589 { 00590 node = node->_left; 00591 } 00592 else if ( cmp0 == 0 ) 00593 { 00594 return node->_telm0->_val; 00595 } 00596 else 00597 { 00598 node = node->_right; 00599 } 00600 break; 00601 case 3: 00602 cmp1 = key->compare(node->_telm1->_key); 00603 if ( cmp0 < 0 ) 00604 { 00605 node = node->_left; 00606 } 00607 else if ( cmp0 == 0 ) 00608 { 00609 return node->_telm0->_val; 00610 } 00611 else if ( cmp1 < 0 ) 00612 { 00613 node = node->_midle; 00614 } 00615 else if ( cmp1 == 0 ) 00616 { 00617 return node->_telm1->_val; 00618 } 00619 else 00620 { 00621 node = node->_right; 00622 } 00623 break; 00624 default: 00625 break; 00626 } 00627 } 00628 return NULL; 00629 } 00630 00631 private: 00632 Tree23Node<K, V>* addLeft2(Tree23Node<K, V>* node) 00633 { 00634 Tree23Node<K, V>* n = node->_left; 00635 if ( n != NULL && n->_type == TREE23_INSERT_ACTIVE ) 00636 { 00637 return new Tree23Node<K, V>(TREE23_TRI_NODE, n->_telm0, node->_telm0, n->_left, n->_right, node->_right); 00638 } 00639 return node; 00640 } 00641 00642 Tree23Node<K, V>* addLeft3(Tree23Node<K, V>* node) 00643 { 00644 Tree23Node<K, V>* n = node->_left; 00645 if ( n != NULL && n->_type == TREE23_INSERT_ACTIVE) 00646 { 00647 n->_type = TREE23_BI_NODE; 00648 Tree23Node<K, V>* nn = new Tree23Node<K, V>(TREE23_BI_NODE, node->_telm1, node->_midle, node->_right); 00649 return new Tree23Node<K, V>(TREE23_INSERT_ACTIVE, node->_telm0, n, nn); 00650 } 00651 return node; 00652 } 00653 00654 Tree23Node<K, V>* addRight2(Tree23Node<K, V>* node) 00655 { 00656 Tree23Node<K, V>* n = node->_right; 00657 if (n != NULL && n->_type == TREE23_INSERT_ACTIVE) 00658 { 00659 return new Tree23Node<K, V>(TREE23_TRI_NODE, node->_telm0, n->_telm0, node->_left, n->_left, n->_right); 00660 } 00661 return node; 00662 } 00663 00664 Tree23Node<K, V>* addRight3(Tree23Node<K, V>* node) 00665 { 00666 Tree23Node<K, V>* n = node->_right; 00667 if (n != NULL && n->_type == TREE23_INSERT_ACTIVE) { 00668 n->_type = TREE23_BI_NODE; 00669 Tree23Node<K, V>* nn = new Tree23Node<K, V>(TREE23_BI_NODE, node->_telm0, node->_left, node->_midle); 00670 return new Tree23Node<K, V>(TREE23_INSERT_ACTIVE, node->_telm1, nn, n); 00671 } 00672 return node; 00673 } 00674 00675 Tree23Node<K, V>* addMidle3(Tree23Node<K, V>* node) 00676 { 00677 Tree23Node<K, V>* n = node->_midle; 00678 if ( n != NULL && n->_type == TREE23_INSERT_ACTIVE ) 00679 { 00680 n->_left = new Tree23Node<K, V>(TREE23_BI_NODE, node->_telm0, node->_left, n->_left); 00681 n->_right = new Tree23Node<K, V>(TREE23_BI_NODE, node->_telm1, n->_right, node->_right); 00682 return n; 00683 } 00684 return node; 00685 } 00686 00687 00688 Tree23Node<K, V>* removeMax(Tree23Node<K, V>* node, Tree23Elm<K, V>* elm) 00689 { 00690 if (node->_right == NULL) 00691 { 00692 switch (node->_type) 00693 { 00694 case 2: 00695 elm->_key = node->_telm0->_key; 00696 elm->_val = node->_telm0->_val; 00697 return new Tree23Node<K, V>(TREE23_DELETE_ACTIVE); 00698 case 3: 00699 elm->_key = node->_telm1->_key; 00700 elm->_val = node->_telm1->_val; 00701 return new Tree23Node<K, V>(TREE23_BI_NODE, node->_telm0); 00702 default: 00703 break; 00704 } 00705 } 00706 else 00707 { 00708 node->_right = removeMax(node->_right, elm); 00709 switch (node->_type) 00710 { 00711 case 2: 00712 return removeRight2(node); 00713 case 3: 00714 return removeRight3(node); 00715 default: 00716 break; 00717 } 00718 } 00719 return NULL; 00720 } 00721 00722 00723 Tree23Node<K, V>* removeLeft2(Tree23Node<K, V>* node) 00724 { 00725 Tree23Node<K, V>* n = node->_left; 00726 if ( n != NULL && n->_type == TREE23_DELETE_ACTIVE ) 00727 { 00728 Tree23Node<K, V>* r = node->_right; 00729 Tree23Node<K, V>* midle; 00730 Tree23Node<K, V>* left; 00731 Tree23Node<K, V>* right; 00732 00733 switch ( r->_type ) 00734 { 00735 case 2: 00736 midle = new Tree23Node<K, V>(TREE23_TRI_NODE, node->_telm0, r->_telm0, n->_midle, r->_left, r->_right); 00737 return new Tree23Node<K, V>(TREE23_DELETE_ACTIVE, midle); 00738 case 3: 00739 left = new Tree23Node<K, V>(TREE23_BI_NODE, node->_telm0, n->_midle, r->_left); 00740 right = new Tree23Node<K, V>(TREE23_BI_NODE, r->_telm1, r->_midle, r->_right); 00741 return new Tree23Node<K, V>(TREE23_BI_NODE, r->_telm0, left, right); 00742 default: 00743 break; 00744 } 00745 } 00746 return node; 00747 } 00748 00749 Tree23Node<K, V>* removeRight2(Tree23Node<K, V>* node) 00750 { 00751 Tree23Node<K, V>* n = node->_right; 00752 if ( n != NULL && n->_type == TREE23_DELETE_ACTIVE ) 00753 { 00754 Tree23Node<K, V>* l = node->_left; 00755 Tree23Node<K, V>* midle; 00756 Tree23Node<K, V>* left; 00757 Tree23Node<K, V>* right; 00758 00759 switch (l->_type) 00760 { 00761 case 2: 00762 midle = new Tree23Node<K, V>(TREE23_TRI_NODE, l->_telm0, node->_telm0, l->_left, l->_right, n->_midle); 00763 return new Tree23Node<K, V>(-1, midle); 00764 case 3: 00765 right = new Tree23Node<K, V>(TREE23_BI_NODE, node->_telm0, l->_right, n->_midle); 00766 left = new Tree23Node<K, V>(TREE23_BI_NODE, l->_telm0, l->_left, l->_midle); 00767 return new Tree23Node<K, V>(TREE23_BI_NODE, l->_telm1, left, right); 00768 default: 00769 break; 00770 } 00771 } 00772 return node; 00773 } 00774 00775 Tree23Node<K, V>* removeLeft3(Tree23Node<K, V>* node) 00776 { 00777 Tree23Node<K, V>* n = node->_left; 00778 if ( n != NULL && n->_type == TREE23_DELETE_ACTIVE ) 00779 { 00780 Tree23Node<K, V>* m = node->_midle; 00781 Tree23Node<K, V>* r = node->_right; 00782 Tree23Node<K, V>* left; 00783 Tree23Node<K, V>* midle; 00784 00785 switch (m->_type) { 00786 case 2: 00787 left = new Tree23Node<K, V>(TREE23_TRI_NODE, node->_telm0, m->_telm0, n->_midle, m->_left, m->_right); 00788 return new Tree23Node<K, V>(TREE23_BI_NODE, node->_telm1, left, r); 00789 case 3: 00790 left = new Tree23Node<K, V>(TREE23_BI_NODE, node->_telm0, n->_midle, m->_left); 00791 midle = new Tree23Node<K, V>(TREE23_BI_NODE, m->_telm1, m->_midle, m->_right); 00792 return new Tree23Node<K, V>(TREE23_TRI_NODE, m->_telm0, node->_telm1, left, midle, r); 00793 default: 00794 break; 00795 } 00796 } 00797 return node; 00798 } 00799 00800 Tree23Node<K, V>* removeMidle3(Tree23Node<K, V>* node) 00801 { 00802 Tree23Node<K, V>* n = node->_midle; 00803 if ( n != NULL && n->_type == TREE23_DELETE_ACTIVE ) 00804 { 00805 Tree23Node<K, V>* l = node->_left; 00806 Tree23Node<K, V>* r = node->_right; 00807 Tree23Node<K, V>* midle; 00808 Tree23Node<K, V>* right; 00809 switch (r->_type) 00810 { 00811 case 2: 00812 right = new Tree23Node<K, V>(TREE23_TRI_NODE, node->_telm1, r->_telm0, n->_midle, r->_left, r->_right); 00813 return new Tree23Node<K, V>(TREE23_BI_NODE, node->_telm0, l, right); 00814 case 3: 00815 midle = new Tree23Node<K, V>(TREE23_BI_NODE, node->_telm1, n->_midle, r->_left); 00816 right = new Tree23Node<K, V>(TREE23_BI_NODE, r->_telm1, r->_midle, r->_right); 00817 return new Tree23Node<K, V>(TREE23_TRI_NODE, node->_telm0, r->_telm0, l, midle, right); 00818 default: 00819 break; 00820 } 00821 } 00822 return node; 00823 } 00824 00825 Tree23Node<K, V>* removeRight3(Tree23Node<K, V>* node) 00826 { 00827 Tree23Node<K, V>* n = node->_right; 00828 if ( n != NULL && n->_type == TREE23_DELETE_ACTIVE ) 00829 { 00830 Tree23Node<K, V>* l = node->_left; 00831 Tree23Node<K, V>* m = node->_midle; 00832 Tree23Node<K, V>* midle; 00833 Tree23Node<K, V>* right; 00834 switch (m->_type) 00835 { 00836 case 2: 00837 right = new Tree23Node<K, V>(TREE23_TRI_NODE, m->_telm0, node->_telm1, m->_left, m->_right, n->_midle); 00838 return new Tree23Node<K, V>(TREE23_BI_NODE, node->_telm0, l, right); 00839 case 3: 00840 right = new Tree23Node<K, V>(TREE23_BI_NODE, node->_telm1, m->_right, n->_midle); 00841 midle = new Tree23Node<K, V>(TREE23_BI_NODE, m->_telm0, m->_left, m->_midle); 00842 return new Tree23Node<K, V>(TREE23_TRI_NODE, node->_telm0, m->_telm1, l, midle, right); 00843 default: 00844 break; 00845 } 00846 } 00847 return node; 00848 } 00849 00850 00851 Tree23Node<K, V>* _root; 00852 }; 00853 00854 /*===================================== 00855 Class List 00856 =====================================*/ 00857 template <typename T> 00858 class ListElm 00859 { 00860 template<typename U> friend class List; 00861 public: 00862 ListElm() 00863 { 00864 _elm = nullptr; 00865 _prev = _next = nullptr; 00866 } 00867 ListElm(T* elm) 00868 { 00869 _elm = elm; 00870 _prev = _next = nullptr; 00871 } 00872 T* getContent(void) 00873 { 00874 return _elm; 00875 } 00876 ~ListElm(){} 00877 00878 private: 00879 ListElm<T>* getNext(void){return _next;} 00880 T* _elm; 00881 ListElm<T>* _prev; 00882 ListElm<T>* _next; 00883 }; 00884 00885 00886 template <typename T> 00887 class List{ 00888 public: 00889 List() 00890 { 00891 _head = _tail = nullptr; 00892 _size = 0; 00893 } 00894 ~List() 00895 { 00896 clear(); 00897 } 00898 00899 int add(T* t) 00900 { 00901 ListElm<T>* elm = new ListElm<T>(t); 00902 if ( elm == nullptr ) 00903 { 00904 return 0; 00905 } 00906 if ( _head == nullptr ) 00907 { 00908 _head = elm; 00909 _tail = elm; 00910 } 00911 else 00912 { 00913 elm->_prev = _tail; 00914 _tail->_next = elm; 00915 _tail = elm; 00916 } 00917 _size++; 00918 return 1; 00919 } 00920 00921 void erase(ListElm<T>* elm) 00922 { 00923 if ( _head == elm ) 00924 { 00925 _head = elm->_next; 00926 _size--; 00927 delete elm; 00928 } 00929 else if ( _tail == elm ) 00930 { 00931 _tail = elm->_prev; 00932 elm->_prev->_next = nullptr; 00933 _size--; 00934 delete elm; 00935 } 00936 else 00937 { 00938 elm->_prev->_next = elm->_next; 00939 elm->_next->_prev = elm->_prev; 00940 _size--; 00941 delete elm; 00942 } 00943 } 00944 void clear(void) 00945 { 00946 ListElm<T>* p = _head; 00947 while ( p ) 00948 { 00949 ListElm<T>* q = p->_next; 00950 delete p; 00951 p = q; 00952 } 00953 _head = nullptr; 00954 _tail = nullptr; 00955 _size = 0; 00956 } 00957 00958 ListElm<T>* getElm(void) 00959 { 00960 return _head; 00961 } 00962 00963 ListElm<T>* getNext(ListElm<T>* elm) 00964 { 00965 return elm->getNext(); 00966 } 00967 00968 int getSize(void) 00969 { 00970 return _size; 00971 } 00972 00973 00974 private: 00975 ListElm<T>* _head; 00976 ListElm<T>* _tail; 00977 int _size; 00978 }; 00979 00980 00981 extern Process* theProcess; 00982 extern MultiTaskProcess* theMultiTaskProcess; 00983 00984 } 00985 #endif /* MQTTSNGWPROCESS_H_ */
Generated on Wed Jul 13 2022 10:46:03 by
1.7.2