BBR 1 Ebene

Committer:
borlanic
Date:
Mon May 14 11:29:06 2018 +0000
Revision:
0:fbdae7e6d805
BBR

Who changed what in which revision?

UserRevisionLine numberNew contents of line
borlanic 0:fbdae7e6d805 1
borlanic 0:fbdae7e6d805 2 // Suppress deprecation warnings since this whole
borlanic 0:fbdae7e6d805 3 // class is deprecated already
borlanic 0:fbdae7e6d805 4 #include "mbed_toolchain.h"
borlanic 0:fbdae7e6d805 5 #undef MBED_DEPRECATED_SINCE
borlanic 0:fbdae7e6d805 6 #define MBED_DEPRECATED_SINCE(...)
borlanic 0:fbdae7e6d805 7
borlanic 0:fbdae7e6d805 8 #include "platform/CallChain.h"
borlanic 0:fbdae7e6d805 9 #include "cmsis.h"
borlanic 0:fbdae7e6d805 10 #include "platform/mbed_critical.h"
borlanic 0:fbdae7e6d805 11
borlanic 0:fbdae7e6d805 12 namespace mbed {
borlanic 0:fbdae7e6d805 13
borlanic 0:fbdae7e6d805 14 class CallChainLink {
borlanic 0:fbdae7e6d805 15 public:
borlanic 0:fbdae7e6d805 16 CallChainLink(): cb(), next(NULL) {
borlanic 0:fbdae7e6d805 17 // No work to do
borlanic 0:fbdae7e6d805 18 }
borlanic 0:fbdae7e6d805 19
borlanic 0:fbdae7e6d805 20 CallChainLink(Callback<void()> &callback): cb(callback), next(NULL) {
borlanic 0:fbdae7e6d805 21 // No work to do
borlanic 0:fbdae7e6d805 22 }
borlanic 0:fbdae7e6d805 23 Callback<void()> cb;
borlanic 0:fbdae7e6d805 24 CallChainLink * next;
borlanic 0:fbdae7e6d805 25 };
borlanic 0:fbdae7e6d805 26
borlanic 0:fbdae7e6d805 27 CallChain::CallChain(int size) : _chain(NULL) {
borlanic 0:fbdae7e6d805 28 // No work to do
borlanic 0:fbdae7e6d805 29 }
borlanic 0:fbdae7e6d805 30
borlanic 0:fbdae7e6d805 31 CallChain::~CallChain() {
borlanic 0:fbdae7e6d805 32 clear();
borlanic 0:fbdae7e6d805 33 }
borlanic 0:fbdae7e6d805 34
borlanic 0:fbdae7e6d805 35 pFunctionPointer_t CallChain::add(Callback<void()> func) {
borlanic 0:fbdae7e6d805 36 CallChainLink *new_link = new CallChainLink(func);
borlanic 0:fbdae7e6d805 37 if (NULL == _chain) {
borlanic 0:fbdae7e6d805 38 _chain = new_link;
borlanic 0:fbdae7e6d805 39 return &new_link->cb;
borlanic 0:fbdae7e6d805 40 }
borlanic 0:fbdae7e6d805 41
borlanic 0:fbdae7e6d805 42 CallChainLink *link = _chain;
borlanic 0:fbdae7e6d805 43 while (true) {
borlanic 0:fbdae7e6d805 44 if (NULL == link->next) {
borlanic 0:fbdae7e6d805 45 link->next = new_link;
borlanic 0:fbdae7e6d805 46 return &new_link->cb;
borlanic 0:fbdae7e6d805 47 }
borlanic 0:fbdae7e6d805 48 link = link->next;
borlanic 0:fbdae7e6d805 49 }
borlanic 0:fbdae7e6d805 50 }
borlanic 0:fbdae7e6d805 51
borlanic 0:fbdae7e6d805 52 pFunctionPointer_t CallChain::add_front(Callback<void()> func) {
borlanic 0:fbdae7e6d805 53 CallChainLink *link = new CallChainLink(func);
borlanic 0:fbdae7e6d805 54 link->next = _chain;
borlanic 0:fbdae7e6d805 55 _chain = link;
borlanic 0:fbdae7e6d805 56 return &link->cb;
borlanic 0:fbdae7e6d805 57 }
borlanic 0:fbdae7e6d805 58
borlanic 0:fbdae7e6d805 59 int CallChain::size() const {
borlanic 0:fbdae7e6d805 60 CallChainLink *link = _chain;
borlanic 0:fbdae7e6d805 61 int elements = 0;
borlanic 0:fbdae7e6d805 62 while (link != NULL) {
borlanic 0:fbdae7e6d805 63 elements++;
borlanic 0:fbdae7e6d805 64 link = link->next;
borlanic 0:fbdae7e6d805 65 }
borlanic 0:fbdae7e6d805 66 return elements;
borlanic 0:fbdae7e6d805 67 }
borlanic 0:fbdae7e6d805 68
borlanic 0:fbdae7e6d805 69 pFunctionPointer_t CallChain::get(int idx) const {
borlanic 0:fbdae7e6d805 70 CallChainLink *link = _chain;
borlanic 0:fbdae7e6d805 71 for (int i = 0; i < idx; i++) {
borlanic 0:fbdae7e6d805 72 if (NULL == link) {
borlanic 0:fbdae7e6d805 73 break;
borlanic 0:fbdae7e6d805 74 }
borlanic 0:fbdae7e6d805 75 link = link->next;
borlanic 0:fbdae7e6d805 76 }
borlanic 0:fbdae7e6d805 77 return &link->cb;
borlanic 0:fbdae7e6d805 78 }
borlanic 0:fbdae7e6d805 79
borlanic 0:fbdae7e6d805 80 int CallChain::find(pFunctionPointer_t f) const {
borlanic 0:fbdae7e6d805 81 CallChainLink *link = _chain;
borlanic 0:fbdae7e6d805 82 int i = 0;
borlanic 0:fbdae7e6d805 83 while (link != NULL) {
borlanic 0:fbdae7e6d805 84 if (f == &link->cb) {
borlanic 0:fbdae7e6d805 85 return i;
borlanic 0:fbdae7e6d805 86 }
borlanic 0:fbdae7e6d805 87 i++;
borlanic 0:fbdae7e6d805 88 link = link->next;
borlanic 0:fbdae7e6d805 89 }
borlanic 0:fbdae7e6d805 90 return -1;
borlanic 0:fbdae7e6d805 91 }
borlanic 0:fbdae7e6d805 92
borlanic 0:fbdae7e6d805 93 void CallChain::clear() {
borlanic 0:fbdae7e6d805 94 CallChainLink *link = _chain;
borlanic 0:fbdae7e6d805 95 _chain = NULL;
borlanic 0:fbdae7e6d805 96 while (link != NULL) {
borlanic 0:fbdae7e6d805 97 CallChainLink *temp = link->next;
borlanic 0:fbdae7e6d805 98 delete link;
borlanic 0:fbdae7e6d805 99 link = temp;
borlanic 0:fbdae7e6d805 100 }
borlanic 0:fbdae7e6d805 101 }
borlanic 0:fbdae7e6d805 102
borlanic 0:fbdae7e6d805 103 bool CallChain::remove(pFunctionPointer_t f) {
borlanic 0:fbdae7e6d805 104 CallChainLink *link = _chain;
borlanic 0:fbdae7e6d805 105 while (link != NULL) {
borlanic 0:fbdae7e6d805 106 if (f == &link->cb) {
borlanic 0:fbdae7e6d805 107 delete link;
borlanic 0:fbdae7e6d805 108 return true;
borlanic 0:fbdae7e6d805 109 }
borlanic 0:fbdae7e6d805 110 link = link->next;
borlanic 0:fbdae7e6d805 111 }
borlanic 0:fbdae7e6d805 112 return false;
borlanic 0:fbdae7e6d805 113 }
borlanic 0:fbdae7e6d805 114
borlanic 0:fbdae7e6d805 115 void CallChain::call() {
borlanic 0:fbdae7e6d805 116 CallChainLink *link = _chain;
borlanic 0:fbdae7e6d805 117 while (link != NULL) {
borlanic 0:fbdae7e6d805 118 link->cb.call();
borlanic 0:fbdae7e6d805 119 link = link->next;
borlanic 0:fbdae7e6d805 120 }
borlanic 0:fbdae7e6d805 121 }
borlanic 0:fbdae7e6d805 122
borlanic 0:fbdae7e6d805 123 } // namespace mbed