The code from https://github.com/vpcola/Nucleo

Committer:
sinrab
Date:
Wed Oct 08 11:00:24 2014 +0000
Revision:
0:5464d5e415e5
The code from https://github.com/vpcola/Nucleo

Who changed what in which revision?

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