Alessandro Angelino / mbed-hal

Dependencies:   target-freescale

Fork of mbed-hal by Morpheus

Committer:
screamer
Date:
Wed Mar 23 21:36:09 2016 +0000
Revision:
0:9c59db1fbc9e
Initial revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:9c59db1fbc9e 1 #include "CallChain.h"
screamer 0:9c59db1fbc9e 2 #include "cmsis.h"
screamer 0:9c59db1fbc9e 3
screamer 0:9c59db1fbc9e 4 namespace mbed {
screamer 0:9c59db1fbc9e 5
screamer 0:9c59db1fbc9e 6 CallChain::CallChain(int size) : _chain(), _size(size), _elements(0) {
screamer 0:9c59db1fbc9e 7 _chain = new pFunctionPointer_t[size]();
screamer 0:9c59db1fbc9e 8 }
screamer 0:9c59db1fbc9e 9
screamer 0:9c59db1fbc9e 10 CallChain::~CallChain() {
screamer 0:9c59db1fbc9e 11 clear();
screamer 0:9c59db1fbc9e 12 delete _chain;
screamer 0:9c59db1fbc9e 13 }
screamer 0:9c59db1fbc9e 14
screamer 0:9c59db1fbc9e 15 pFunctionPointer_t CallChain::add(void (*function)(void)) {
screamer 0:9c59db1fbc9e 16 return common_add(new FunctionPointer(function));
screamer 0:9c59db1fbc9e 17 }
screamer 0:9c59db1fbc9e 18
screamer 0:9c59db1fbc9e 19 pFunctionPointer_t CallChain::add_front(void (*function)(void)) {
screamer 0:9c59db1fbc9e 20 return common_add_front(new FunctionPointer(function));
screamer 0:9c59db1fbc9e 21 }
screamer 0:9c59db1fbc9e 22
screamer 0:9c59db1fbc9e 23 int CallChain::size() const {
screamer 0:9c59db1fbc9e 24 return _elements;
screamer 0:9c59db1fbc9e 25 }
screamer 0:9c59db1fbc9e 26
screamer 0:9c59db1fbc9e 27 pFunctionPointer_t CallChain::get(int i) const {
screamer 0:9c59db1fbc9e 28 if (i < 0 || i >= _elements)
screamer 0:9c59db1fbc9e 29 return NULL;
screamer 0:9c59db1fbc9e 30 return _chain[i];
screamer 0:9c59db1fbc9e 31 }
screamer 0:9c59db1fbc9e 32
screamer 0:9c59db1fbc9e 33 int CallChain::find(pFunctionPointer_t f) const {
screamer 0:9c59db1fbc9e 34 for (int i = 0; i < _elements; i++)
screamer 0:9c59db1fbc9e 35 if (f == _chain[i])
screamer 0:9c59db1fbc9e 36 return i;
screamer 0:9c59db1fbc9e 37 return -1;
screamer 0:9c59db1fbc9e 38 }
screamer 0:9c59db1fbc9e 39
screamer 0:9c59db1fbc9e 40 void CallChain::clear() {
screamer 0:9c59db1fbc9e 41 for(int i = 0; i < _elements; i ++) {
screamer 0:9c59db1fbc9e 42 delete _chain[i];
screamer 0:9c59db1fbc9e 43 _chain[i] = NULL;
screamer 0:9c59db1fbc9e 44 }
screamer 0:9c59db1fbc9e 45 _elements = 0;
screamer 0:9c59db1fbc9e 46 }
screamer 0:9c59db1fbc9e 47
screamer 0:9c59db1fbc9e 48 bool CallChain::remove(pFunctionPointer_t f) {
screamer 0:9c59db1fbc9e 49 int i;
screamer 0:9c59db1fbc9e 50
screamer 0:9c59db1fbc9e 51 if ((i = find(f)) == -1)
screamer 0:9c59db1fbc9e 52 return false;
screamer 0:9c59db1fbc9e 53 if (i != _elements - 1)
screamer 0:9c59db1fbc9e 54 memmove(_chain + i, _chain + i + 1, (_elements - i - 1) * sizeof(pFunctionPointer_t));
screamer 0:9c59db1fbc9e 55 delete f;
screamer 0:9c59db1fbc9e 56 _elements --;
screamer 0:9c59db1fbc9e 57 return true;
screamer 0:9c59db1fbc9e 58 }
screamer 0:9c59db1fbc9e 59
screamer 0:9c59db1fbc9e 60 void CallChain::call() {
screamer 0:9c59db1fbc9e 61 for(int i = 0; i < _elements; i++)
screamer 0:9c59db1fbc9e 62 _chain[i]->call();
screamer 0:9c59db1fbc9e 63 }
screamer 0:9c59db1fbc9e 64
screamer 0:9c59db1fbc9e 65 void CallChain::_check_size() {
screamer 0:9c59db1fbc9e 66 if (_elements < _size)
screamer 0:9c59db1fbc9e 67 return;
screamer 0:9c59db1fbc9e 68 _size = (_size < 4) ? 4 : _size + 4;
screamer 0:9c59db1fbc9e 69 pFunctionPointer_t* new_chain = new pFunctionPointer_t[_size]();
screamer 0:9c59db1fbc9e 70 memcpy(new_chain, _chain, _elements * sizeof(pFunctionPointer_t));
screamer 0:9c59db1fbc9e 71 delete _chain;
screamer 0:9c59db1fbc9e 72 _chain = new_chain;
screamer 0:9c59db1fbc9e 73 }
screamer 0:9c59db1fbc9e 74
screamer 0:9c59db1fbc9e 75 pFunctionPointer_t CallChain::common_add(pFunctionPointer_t pf) {
screamer 0:9c59db1fbc9e 76 _check_size();
screamer 0:9c59db1fbc9e 77 _chain[_elements] = pf;
screamer 0:9c59db1fbc9e 78 _elements ++;
screamer 0:9c59db1fbc9e 79 return pf;
screamer 0:9c59db1fbc9e 80 }
screamer 0:9c59db1fbc9e 81
screamer 0:9c59db1fbc9e 82 pFunctionPointer_t CallChain::common_add_front(pFunctionPointer_t pf) {
screamer 0:9c59db1fbc9e 83 _check_size();
screamer 0:9c59db1fbc9e 84 memmove(_chain + 1, _chain, _elements * sizeof(pFunctionPointer_t));
screamer 0:9c59db1fbc9e 85 _chain[0] = pf;
screamer 0:9c59db1fbc9e 86 _elements ++;
screamer 0:9c59db1fbc9e 87 return pf;
screamer 0:9c59db1fbc9e 88 }
screamer 0:9c59db1fbc9e 89
screamer 0:9c59db1fbc9e 90 } // namespace mbed
screamer 0:9c59db1fbc9e 91