initial

Dependencies:   mbed

Committer:
yihui
Date:
Mon Jan 11 02:32:24 2016 +0000
Revision:
0:638edba3adf6
initial

Who changed what in which revision?

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