mbed.h verzija za koristenje na predmetu PAI

Committer:
esokic
Date:
Tue Mar 10 09:51:52 2015 +0000
Revision:
0:05aad811ea07
mbed.h verzija od marta 2014, za koristenje na predmetu PAI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
esokic 0:05aad811ea07 1 /* mbed Microcontroller Library
esokic 0:05aad811ea07 2 * Copyright (c) 2006-2013 ARM Limited
esokic 0:05aad811ea07 3 *
esokic 0:05aad811ea07 4 * Licensed under the Apache License, Version 2.0 (the "License");
esokic 0:05aad811ea07 5 * you may not use this file except in compliance with the License.
esokic 0:05aad811ea07 6 * You may obtain a copy of the License at
esokic 0:05aad811ea07 7 *
esokic 0:05aad811ea07 8 * http://www.apache.org/licenses/LICENSE-2.0
esokic 0:05aad811ea07 9 *
esokic 0:05aad811ea07 10 * Unless required by applicable law or agreed to in writing, software
esokic 0:05aad811ea07 11 * distributed under the License is distributed on an "AS IS" BASIS,
esokic 0:05aad811ea07 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
esokic 0:05aad811ea07 13 * See the License for the specific language governing permissions and
esokic 0:05aad811ea07 14 * limitations under the License.
esokic 0:05aad811ea07 15 */
esokic 0:05aad811ea07 16 #ifndef MBED_CALLCHAIN_H
esokic 0:05aad811ea07 17 #define MBED_CALLCHAIN_H
esokic 0:05aad811ea07 18
esokic 0:05aad811ea07 19 #include "FunctionPointer.h"
esokic 0:05aad811ea07 20 #include <string.h>
esokic 0:05aad811ea07 21
esokic 0:05aad811ea07 22 namespace mbed {
esokic 0:05aad811ea07 23
esokic 0:05aad811ea07 24 /** Group one or more functions in an instance of a CallChain, then call them in
esokic 0:05aad811ea07 25 * sequence using CallChain::call(). Used mostly by the interrupt chaining code,
esokic 0:05aad811ea07 26 * but can be used for other purposes.
esokic 0:05aad811ea07 27 *
esokic 0:05aad811ea07 28 * Example:
esokic 0:05aad811ea07 29 * @code
esokic 0:05aad811ea07 30 * #include "mbed.h"
esokic 0:05aad811ea07 31 *
esokic 0:05aad811ea07 32 * CallChain chain;
esokic 0:05aad811ea07 33 *
esokic 0:05aad811ea07 34 * void first(void) {
esokic 0:05aad811ea07 35 * printf("'first' function.\n");
esokic 0:05aad811ea07 36 * }
esokic 0:05aad811ea07 37 *
esokic 0:05aad811ea07 38 * void second(void) {
esokic 0:05aad811ea07 39 * printf("'second' function.\n");
esokic 0:05aad811ea07 40 * }
esokic 0:05aad811ea07 41 *
esokic 0:05aad811ea07 42 * class Test {
esokic 0:05aad811ea07 43 * public:
esokic 0:05aad811ea07 44 * void f(void) {
esokic 0:05aad811ea07 45 * printf("A::f (class member).\n");
esokic 0:05aad811ea07 46 * }
esokic 0:05aad811ea07 47 * };
esokic 0:05aad811ea07 48 *
esokic 0:05aad811ea07 49 * int main() {
esokic 0:05aad811ea07 50 * Test test;
esokic 0:05aad811ea07 51 *
esokic 0:05aad811ea07 52 * chain.add(second);
esokic 0:05aad811ea07 53 * chain.add_front(first);
esokic 0:05aad811ea07 54 * chain.add(&test, &Test::f);
esokic 0:05aad811ea07 55 * chain.call();
esokic 0:05aad811ea07 56 * }
esokic 0:05aad811ea07 57 * @endcode
esokic 0:05aad811ea07 58 */
esokic 0:05aad811ea07 59
esokic 0:05aad811ea07 60 typedef FunctionPointer* pFunctionPointer_t;
esokic 0:05aad811ea07 61
esokic 0:05aad811ea07 62 class CallChain {
esokic 0:05aad811ea07 63 public:
esokic 0:05aad811ea07 64 /** Create an empty chain
esokic 0:05aad811ea07 65 *
esokic 0:05aad811ea07 66 * @param size (optional) Initial size of the chain
esokic 0:05aad811ea07 67 */
esokic 0:05aad811ea07 68 CallChain(int size = 4);
esokic 0:05aad811ea07 69 virtual ~CallChain();
esokic 0:05aad811ea07 70
esokic 0:05aad811ea07 71 /** Add a function at the end of the chain
esokic 0:05aad811ea07 72 *
esokic 0:05aad811ea07 73 * @param function A pointer to a void function
esokic 0:05aad811ea07 74 *
esokic 0:05aad811ea07 75 * @returns
esokic 0:05aad811ea07 76 * The function object created for 'function'
esokic 0:05aad811ea07 77 */
esokic 0:05aad811ea07 78 pFunctionPointer_t add(void (*function)(void));
esokic 0:05aad811ea07 79
esokic 0:05aad811ea07 80 /** Add a function at the end of the chain
esokic 0:05aad811ea07 81 *
esokic 0:05aad811ea07 82 * @param tptr pointer to the object to call the member function on
esokic 0:05aad811ea07 83 * @param mptr pointer to the member function to be called
esokic 0:05aad811ea07 84 *
esokic 0:05aad811ea07 85 * @returns
esokic 0:05aad811ea07 86 * The function object created for 'tptr' and 'mptr'
esokic 0:05aad811ea07 87 */
esokic 0:05aad811ea07 88 template<typename T>
esokic 0:05aad811ea07 89 pFunctionPointer_t add(T *tptr, void (T::*mptr)(void)) {
esokic 0:05aad811ea07 90 return common_add(new FunctionPointer(tptr, mptr));
esokic 0:05aad811ea07 91 }
esokic 0:05aad811ea07 92
esokic 0:05aad811ea07 93 /** Add a function at the beginning of the chain
esokic 0:05aad811ea07 94 *
esokic 0:05aad811ea07 95 * @param function A pointer to a void function
esokic 0:05aad811ea07 96 *
esokic 0:05aad811ea07 97 * @returns
esokic 0:05aad811ea07 98 * The function object created for 'function'
esokic 0:05aad811ea07 99 */
esokic 0:05aad811ea07 100 pFunctionPointer_t add_front(void (*function)(void));
esokic 0:05aad811ea07 101
esokic 0:05aad811ea07 102 /** Add a function at the beginning of the chain
esokic 0:05aad811ea07 103 *
esokic 0:05aad811ea07 104 * @param tptr pointer to the object to call the member function on
esokic 0:05aad811ea07 105 * @param mptr pointer to the member function to be called
esokic 0:05aad811ea07 106 *
esokic 0:05aad811ea07 107 * @returns
esokic 0:05aad811ea07 108 * The function object created for 'tptr' and 'mptr'
esokic 0:05aad811ea07 109 */
esokic 0:05aad811ea07 110 template<typename T>
esokic 0:05aad811ea07 111 pFunctionPointer_t add_front(T *tptr, void (T::*mptr)(void)) {
esokic 0:05aad811ea07 112 return common_add_front(new FunctionPointer(tptr, mptr));
esokic 0:05aad811ea07 113 }
esokic 0:05aad811ea07 114
esokic 0:05aad811ea07 115 /** Get the number of functions in the chain
esokic 0:05aad811ea07 116 */
esokic 0:05aad811ea07 117 int size() const;
esokic 0:05aad811ea07 118
esokic 0:05aad811ea07 119 /** Get a function object from the chain
esokic 0:05aad811ea07 120 *
esokic 0:05aad811ea07 121 * @param i function object index
esokic 0:05aad811ea07 122 *
esokic 0:05aad811ea07 123 * @returns
esokic 0:05aad811ea07 124 * The function object at position 'i' in the chain
esokic 0:05aad811ea07 125 */
esokic 0:05aad811ea07 126 pFunctionPointer_t get(int i) const;
esokic 0:05aad811ea07 127
esokic 0:05aad811ea07 128 /** Look for a function object in the call chain
esokic 0:05aad811ea07 129 *
esokic 0:05aad811ea07 130 * @param f the function object to search
esokic 0:05aad811ea07 131 *
esokic 0:05aad811ea07 132 * @returns
esokic 0:05aad811ea07 133 * The index of the function object if found, -1 otherwise.
esokic 0:05aad811ea07 134 */
esokic 0:05aad811ea07 135 int find(pFunctionPointer_t f) const;
esokic 0:05aad811ea07 136
esokic 0:05aad811ea07 137 /** Clear the call chain (remove all functions in the chain).
esokic 0:05aad811ea07 138 */
esokic 0:05aad811ea07 139 void clear();
esokic 0:05aad811ea07 140
esokic 0:05aad811ea07 141 /** Remove a function object from the chain
esokic 0:05aad811ea07 142 *
esokic 0:05aad811ea07 143 * @arg f the function object to remove
esokic 0:05aad811ea07 144 *
esokic 0:05aad811ea07 145 * @returns
esokic 0:05aad811ea07 146 * true if the function object was found and removed, false otherwise.
esokic 0:05aad811ea07 147 */
esokic 0:05aad811ea07 148 bool remove(pFunctionPointer_t f);
esokic 0:05aad811ea07 149
esokic 0:05aad811ea07 150 /** Call all the functions in the chain in sequence
esokic 0:05aad811ea07 151 */
esokic 0:05aad811ea07 152 void call();
esokic 0:05aad811ea07 153
esokic 0:05aad811ea07 154 #ifdef MBED_OPERATORS
esokic 0:05aad811ea07 155 void operator ()(void) {
esokic 0:05aad811ea07 156 call();
esokic 0:05aad811ea07 157 }
esokic 0:05aad811ea07 158 pFunctionPointer_t operator [](int i) const {
esokic 0:05aad811ea07 159 return get(i);
esokic 0:05aad811ea07 160 }
esokic 0:05aad811ea07 161 #endif
esokic 0:05aad811ea07 162
esokic 0:05aad811ea07 163 private:
esokic 0:05aad811ea07 164 void _check_size();
esokic 0:05aad811ea07 165 pFunctionPointer_t common_add(pFunctionPointer_t pf);
esokic 0:05aad811ea07 166 pFunctionPointer_t common_add_front(pFunctionPointer_t pf);
esokic 0:05aad811ea07 167
esokic 0:05aad811ea07 168 pFunctionPointer_t* _chain;
esokic 0:05aad811ea07 169 int _size;
esokic 0:05aad811ea07 170 int _elements;
esokic 0:05aad811ea07 171 };
esokic 0:05aad811ea07 172
esokic 0:05aad811ea07 173 } // namespace mbed
esokic 0:05aad811ea07 174
esokic 0:05aad811ea07 175 #endif
esokic 0:05aad811ea07 176