This is the final version of Mini Gateway for Automation and Security desgined for Renesas GR Peach Design Contest

Dependencies:   GR-PEACH_video GraphicsFramework HTTPServer R_BSP mbed-rpc mbed-rtos Socket lwip-eth lwip-sys lwip FATFileSystem

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CallChain.cpp Source File

CallChain.cpp

00001 #include "platform/CallChain.h"
00002 #include "cmsis.h"
00003 #include "platform/critical.h"
00004 
00005 namespace mbed {
00006 
00007 class CallChainLink {
00008 public:
00009     CallChainLink(): cb(), next(NULL) {
00010         // No work to do
00011     }
00012 
00013     CallChainLink(Callback<void()> &callback): cb(callback), next(NULL) {
00014         // No work to do
00015     }
00016     Callback<void()> cb;
00017     CallChainLink * next;
00018 };
00019 
00020 CallChain::CallChain(int size) : _chain(NULL) {
00021     // No work to do
00022 }
00023 
00024 CallChain::~CallChain() {
00025     clear();
00026 }
00027 
00028 pFunctionPointer_t CallChain::add(Callback<void()> func) {
00029     CallChainLink *new_link = new CallChainLink(func);
00030     if (NULL == _chain) {
00031         _chain = new_link;
00032         return &new_link->cb;
00033     }
00034 
00035     CallChainLink *link = _chain;
00036     while (true) {
00037         if (NULL == link->next) {
00038             link->next = new_link;
00039             return &new_link->cb;
00040         }
00041         link = link->next;
00042     }
00043 }
00044 
00045 pFunctionPointer_t CallChain::add_front(Callback<void()> func) {
00046     CallChainLink *link = new CallChainLink(func);
00047     link->next = _chain;
00048     _chain = link;
00049     return &link->cb;
00050 }
00051 
00052 int CallChain::size() const {
00053     CallChainLink *link = _chain;
00054     int elements = 0;
00055     while (link != NULL) {
00056         elements++;
00057         link = link->next;
00058     }
00059     return elements;
00060 }
00061 
00062 pFunctionPointer_t CallChain::get(int idx) const {
00063     CallChainLink *link = _chain;
00064     for (int i = 0; i < idx; i++) {
00065         if (NULL == link) {
00066             break;
00067         }
00068         link = link->next;
00069     }
00070     return &link->cb;
00071 }
00072 
00073 int CallChain::find(pFunctionPointer_t f) const {
00074     CallChainLink *link = _chain;
00075     int i = 0;
00076     while (link != NULL) {
00077         if (f == &link->cb) {
00078             return i;
00079         }
00080         i++;
00081         link = link->next;
00082     }
00083     return -1;
00084 }
00085 
00086 void CallChain::clear() {
00087     CallChainLink *link = _chain;
00088     _chain = NULL;
00089     while (link != NULL) {
00090         CallChainLink *temp = link->next;
00091         delete link;
00092         link = temp;
00093     }
00094 }
00095 
00096 bool CallChain::remove(pFunctionPointer_t f) {
00097     CallChainLink *link = _chain;
00098     while (link != NULL) {
00099         if (f == &link->cb) {
00100             delete link;
00101             return true;
00102         }
00103         link = link->next;
00104     }
00105     return false;
00106 }
00107 
00108 void CallChain::call() {
00109     CallChainLink *link = _chain;
00110     while (link != NULL) {
00111         link->cb.call();
00112         link = link->next;
00113     }
00114 }
00115 
00116 } // namespace mbed