Romain Ame / Mbed 2 deprecated Robot2016_2-0_STATIC

Dependencies:   RoboClaw StepperMotor mbed

Fork of Robot2016_2-0 by ARES

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers nVector.h Source File

nVector.h

00001 #ifndef VECTOR_H
00002 #define VECTOR_H
00003 
00004 template<class T>
00005 class elem {
00006 public:
00007     elem () { ; }
00008     elem (T nval) : val (nval) {  next = NULL; prev = NULL; }
00009     elem (T nval, elem* nprev) : val (nval) { next = NULL; prev = nprev; }
00010 
00011     elem<T> * gNext () { return next; }
00012     elem<T> * gprev () { return prev; }
00013     T& getVal () { return val; }
00014 
00015     void sNext (elem<T> * nnext) { next = nnext; }
00016     void sPrev (elem<T> * nprev) { prev = nprev; }
00017 
00018 private:
00019     T val;
00020     elem<T> * next;
00021     elem<T> * prev;
00022 };
00023 
00024 template<class T>
00025 class nVector {
00026 public:
00027     nVector () {
00028         first = NULL;
00029         curr = NULL;
00030         init = false;
00031         VectorSize = 0;
00032     }
00033 
00034     void push_back (T val) {
00035         if (init) {
00036             setCurrLast ();
00037             elem<T> * n = new elem<T> (val, curr);
00038             curr->sNext (n);
00039             n->sPrev (curr);
00040             VectorSize++;
00041         }
00042         else {
00043             init = true;
00044             first = new elem<T> (val);
00045             VectorSize = 1;
00046         }
00047     }
00048 
00049     void push_first (T val) {
00050         if (init) {
00051             curr = first;
00052             elem<T> * n = new elem<T> (val);
00053             curr->sPrev (n);
00054             n->sNext (curr);
00055             first = n;
00056             VectorSize++;
00057         }
00058         else {
00059             init = true;
00060             first = new elem<T> (val);
00061             VectorSize = 1;
00062         }
00063     }
00064 
00065     bool erase (int index) {
00066         bool worked = true;
00067 
00068         if (init) {
00069             if (index > 0 && index < VectorSize) {
00070                 if (setCurrIndex (index)) {
00071                     elem<T>* p = curr->gprev ();
00072                     if (p != NULL)
00073                         p->sNext (curr->gNext ());
00074 
00075                     elem<T>* n = curr->gNext ();
00076                     if (n != NULL)
00077                         n->sPrev (p);
00078 
00079                     delete curr;
00080 
00081                     VectorSize--;
00082                     if (VectorSize <= 0) {
00083                         init = false;
00084                     }
00085                 }
00086             }
00087             else if (index == 0 && index < VectorSize) {
00088                 elem<T> * n = first->gNext ();
00089 
00090                 if (n != NULL) {
00091                     n->sPrev (NULL);
00092                     delete first;
00093                     first = n;
00094                     VectorSize--;
00095                 }
00096                 else {
00097                     init = false;
00098                     delete first;
00099                     VectorSize = 0;
00100                 }
00101             }
00102             else {
00103                 worked = false;
00104             }
00105         }
00106         else {
00107             worked = false;
00108         }
00109         return worked;
00110     }
00111 
00112     void concatenate (nVector<T>& t) {
00113         for (int i = 0; i < t.size (); ++i)
00114             push_back (t[i]);
00115     }
00116 
00117     int size () { return VectorSize; }
00118     bool empty () { return !init; }
00119 
00120     T& operator[](int ind) {
00121         setCurrIndex (ind);
00122         return curr->getVal ();
00123     }
00124 
00125     void show () {
00126         for (int i = 0; i < VectorSize; ++i) {
00127             setCurrIndex (i);
00128             std::cout << "(" << curr << ") Element " << i + 1 << " pere : " << curr->gprev() << ", fils " << curr->gNext () << std::endl;
00129         }
00130     }
00131     
00132     void clear () {
00133         while (VectorSize != 0) {
00134             erase (0);
00135         }
00136     }
00137 private:
00138     void setCurrLast () {
00139         if (init) {
00140             curr = first;
00141             while (curr->gNext () != NULL) {
00142                 curr = curr->gNext ();
00143             }
00144         }
00145     }
00146 
00147     bool setCurrIndex (int index) {
00148         curr = first;
00149         bool worked = true;
00150 
00151         for (int i = 0; i < index; ++i) {
00152             if (curr->gNext () != NULL)
00153                 curr = curr->gNext ();
00154             else {
00155                 worked = false;
00156                 break;
00157             }
00158         }
00159         return worked;
00160     }
00161 
00162     elem<T>* first;
00163     elem<T>* curr;
00164 
00165     bool init;
00166     int VectorSize;
00167 };
00168 #endif