Rtos API example

Committer:
marcozecchini
Date:
Sat Feb 23 12:13:36 2019 +0000
Revision:
0:9fca2b23d0ba
final commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcozecchini 0:9fca2b23d0ba 1 /* mbed Microcontroller Library
marcozecchini 0:9fca2b23d0ba 2 * Copyright (c) 2006-2013 ARM Limited
marcozecchini 0:9fca2b23d0ba 3 *
marcozecchini 0:9fca2b23d0ba 4 * Licensed under the Apache License, Version 2.0 (the "License");
marcozecchini 0:9fca2b23d0ba 5 * you may not use this file except in compliance with the License.
marcozecchini 0:9fca2b23d0ba 6 * You may obtain a copy of the License at
marcozecchini 0:9fca2b23d0ba 7 *
marcozecchini 0:9fca2b23d0ba 8 * http://www.apache.org/licenses/LICENSE-2.0
marcozecchini 0:9fca2b23d0ba 9 *
marcozecchini 0:9fca2b23d0ba 10 * Unless required by applicable law or agreed to in writing, software
marcozecchini 0:9fca2b23d0ba 11 * distributed under the License is distributed on an "AS IS" BASIS,
marcozecchini 0:9fca2b23d0ba 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
marcozecchini 0:9fca2b23d0ba 13 * See the License for the specific language governing permissions and
marcozecchini 0:9fca2b23d0ba 14 * limitations under the License.
marcozecchini 0:9fca2b23d0ba 15 */
marcozecchini 0:9fca2b23d0ba 16 #ifndef MBED_CALLCHAIN_OF_FUNCTION_POINTERS_WITH_CONTEXT_H
marcozecchini 0:9fca2b23d0ba 17 #define MBED_CALLCHAIN_OF_FUNCTION_POINTERS_WITH_CONTEXT_H
marcozecchini 0:9fca2b23d0ba 18
marcozecchini 0:9fca2b23d0ba 19 #include <string.h>
marcozecchini 0:9fca2b23d0ba 20 #include "FunctionPointerWithContext.h"
marcozecchini 0:9fca2b23d0ba 21 #include "SafeBool.h"
marcozecchini 0:9fca2b23d0ba 22
marcozecchini 0:9fca2b23d0ba 23 /**
marcozecchini 0:9fca2b23d0ba 24 * @addtogroup ble
marcozecchini 0:9fca2b23d0ba 25 * @{
marcozecchini 0:9fca2b23d0ba 26 * @addtogroup common
marcozecchini 0:9fca2b23d0ba 27 * @{
marcozecchini 0:9fca2b23d0ba 28 */
marcozecchini 0:9fca2b23d0ba 29
marcozecchini 0:9fca2b23d0ba 30 /**
marcozecchini 0:9fca2b23d0ba 31 * Function like object hosting a list of FunctionPointerWithContext.
marcozecchini 0:9fca2b23d0ba 32 *
marcozecchini 0:9fca2b23d0ba 33 * Upon call, each FunctionPointerWithContext instance present in the object will
marcozecchini 0:9fca2b23d0ba 34 * be called in sequence with the initial parameters.
marcozecchini 0:9fca2b23d0ba 35 *
marcozecchini 0:9fca2b23d0ba 36 * It can be seen as a variation of the observer pattern this object being the
marcozecchini 0:9fca2b23d0ba 37 * observable, instances of the FunctionPointerWithContext being the observable
marcozecchini 0:9fca2b23d0ba 38 * and the notify/update operation being the function call.
marcozecchini 0:9fca2b23d0ba 39 *
marcozecchini 0:9fca2b23d0ba 40 * Example:
marcozecchini 0:9fca2b23d0ba 41 * @code
marcozecchini 0:9fca2b23d0ba 42 *
marcozecchini 0:9fca2b23d0ba 43 * CallChainOfFunctionPointersWithContext<void *> chain;
marcozecchini 0:9fca2b23d0ba 44 *
marcozecchini 0:9fca2b23d0ba 45 * void first(void *context) {
marcozecchini 0:9fca2b23d0ba 46 * printf("'first' function.\n");
marcozecchini 0:9fca2b23d0ba 47 * }
marcozecchini 0:9fca2b23d0ba 48 *
marcozecchini 0:9fca2b23d0ba 49 * void second(void *context) {
marcozecchini 0:9fca2b23d0ba 50 * printf("'second' function.\n");
marcozecchini 0:9fca2b23d0ba 51 * }
marcozecchini 0:9fca2b23d0ba 52 *
marcozecchini 0:9fca2b23d0ba 53 * class Test {
marcozecchini 0:9fca2b23d0ba 54 * public:
marcozecchini 0:9fca2b23d0ba 55 * void f(void *context) {
marcozecchini 0:9fca2b23d0ba 56 * printf("A::f (class member).\n");
marcozecchini 0:9fca2b23d0ba 57 * }
marcozecchini 0:9fca2b23d0ba 58 * };
marcozecchini 0:9fca2b23d0ba 59 *
marcozecchini 0:9fca2b23d0ba 60 * int main() {
marcozecchini 0:9fca2b23d0ba 61 * Test test;
marcozecchini 0:9fca2b23d0ba 62 *
marcozecchini 0:9fca2b23d0ba 63 * chain.add(second);
marcozecchini 0:9fca2b23d0ba 64 * chain.add_front(first);
marcozecchini 0:9fca2b23d0ba 65 * chain.add(&test, &Test::f);
marcozecchini 0:9fca2b23d0ba 66 *
marcozecchini 0:9fca2b23d0ba 67 * // will print:
marcozecchini 0:9fca2b23d0ba 68 * // 'second' function.
marcozecchini 0:9fca2b23d0ba 69 * // 'first' function.
marcozecchini 0:9fca2b23d0ba 70 * // A::f (class member).
marcozecchini 0:9fca2b23d0ba 71 * chain.call();
marcozecchini 0:9fca2b23d0ba 72 * }
marcozecchini 0:9fca2b23d0ba 73 * @endcode
marcozecchini 0:9fca2b23d0ba 74 *
marcozecchini 0:9fca2b23d0ba 75 * @note memory allocation is used to add new function like objects into the
marcozecchini 0:9fca2b23d0ba 76 * call chain.
marcozecchini 0:9fca2b23d0ba 77 *
marcozecchini 0:9fca2b23d0ba 78 * @tparam ContextType Type of the parameter accepted by the callbacks hosted
marcozecchini 0:9fca2b23d0ba 79 * in the object.
marcozecchini 0:9fca2b23d0ba 80 */
marcozecchini 0:9fca2b23d0ba 81 template <typename ContextType>
marcozecchini 0:9fca2b23d0ba 82 class CallChainOfFunctionPointersWithContext :
marcozecchini 0:9fca2b23d0ba 83 public SafeBool<CallChainOfFunctionPointersWithContext<ContextType> > {
marcozecchini 0:9fca2b23d0ba 84 public:
marcozecchini 0:9fca2b23d0ba 85 /**
marcozecchini 0:9fca2b23d0ba 86 * Alias of the FunctionPointerWithContext type this object can store.
marcozecchini 0:9fca2b23d0ba 87 */
marcozecchini 0:9fca2b23d0ba 88 typedef FunctionPointerWithContext<ContextType> *pFunctionPointerWithContext_t;
marcozecchini 0:9fca2b23d0ba 89
marcozecchini 0:9fca2b23d0ba 90 public:
marcozecchini 0:9fca2b23d0ba 91 /**
marcozecchini 0:9fca2b23d0ba 92 * Create an empty callchain.
marcozecchini 0:9fca2b23d0ba 93 */
marcozecchini 0:9fca2b23d0ba 94 CallChainOfFunctionPointersWithContext() : chainHead(NULL) { }
marcozecchini 0:9fca2b23d0ba 95
marcozecchini 0:9fca2b23d0ba 96 /**
marcozecchini 0:9fca2b23d0ba 97 * Destruction of the callchain.
marcozecchini 0:9fca2b23d0ba 98 */
marcozecchini 0:9fca2b23d0ba 99 virtual ~CallChainOfFunctionPointersWithContext()
marcozecchini 0:9fca2b23d0ba 100 {
marcozecchini 0:9fca2b23d0ba 101 clear();
marcozecchini 0:9fca2b23d0ba 102 }
marcozecchini 0:9fca2b23d0ba 103
marcozecchini 0:9fca2b23d0ba 104 /**
marcozecchini 0:9fca2b23d0ba 105 * Add a function pointer at the front of the chain.
marcozecchini 0:9fca2b23d0ba 106 *
marcozecchini 0:9fca2b23d0ba 107 * @param[in] function A pointer to a void function.
marcozecchini 0:9fca2b23d0ba 108 *
marcozecchini 0:9fca2b23d0ba 109 * @return The FunctionPointerWithContext object created from @p function.
marcozecchini 0:9fca2b23d0ba 110 */
marcozecchini 0:9fca2b23d0ba 111 pFunctionPointerWithContext_t add(void (*function)(ContextType context))
marcozecchini 0:9fca2b23d0ba 112 {
marcozecchini 0:9fca2b23d0ba 113 return common_add(new FunctionPointerWithContext<ContextType>(function));
marcozecchini 0:9fca2b23d0ba 114 }
marcozecchini 0:9fca2b23d0ba 115
marcozecchini 0:9fca2b23d0ba 116 /**
marcozecchini 0:9fca2b23d0ba 117 * Add a member function bound to its instance at the front of the chain.
marcozecchini 0:9fca2b23d0ba 118 *
marcozecchini 0:9fca2b23d0ba 119 * @param[in] tptr Pointer to the object to call the member function on.
marcozecchini 0:9fca2b23d0ba 120 * @param[in] mptr Pointer to the member function to be called.
marcozecchini 0:9fca2b23d0ba 121 *
marcozecchini 0:9fca2b23d0ba 122 * @return The FunctionPointerWithContext object created from @p tptr and
marcozecchini 0:9fca2b23d0ba 123 * @p mptr.
marcozecchini 0:9fca2b23d0ba 124 */
marcozecchini 0:9fca2b23d0ba 125 template<typename T>
marcozecchini 0:9fca2b23d0ba 126 pFunctionPointerWithContext_t add(T *tptr, void (T::*mptr)(ContextType context))
marcozecchini 0:9fca2b23d0ba 127 {
marcozecchini 0:9fca2b23d0ba 128 return common_add(new FunctionPointerWithContext<ContextType>(tptr, mptr));
marcozecchini 0:9fca2b23d0ba 129 }
marcozecchini 0:9fca2b23d0ba 130
marcozecchini 0:9fca2b23d0ba 131 /**
marcozecchini 0:9fca2b23d0ba 132 * Add a FunctionPointerWithContext at the front of the chain.
marcozecchini 0:9fca2b23d0ba 133 *
marcozecchini 0:9fca2b23d0ba 134 * @param[in] func The FunctionPointerWithContext to add.
marcozecchini 0:9fca2b23d0ba 135 *
marcozecchini 0:9fca2b23d0ba 136 * @return The function object created for @p func.
marcozecchini 0:9fca2b23d0ba 137 */
marcozecchini 0:9fca2b23d0ba 138 pFunctionPointerWithContext_t add(const FunctionPointerWithContext<ContextType> &func)
marcozecchini 0:9fca2b23d0ba 139 {
marcozecchini 0:9fca2b23d0ba 140 return common_add(new FunctionPointerWithContext<ContextType>(func));
marcozecchini 0:9fca2b23d0ba 141 }
marcozecchini 0:9fca2b23d0ba 142
marcozecchini 0:9fca2b23d0ba 143 /**
marcozecchini 0:9fca2b23d0ba 144 * Detach a function pointer from a callchain.
marcozecchini 0:9fca2b23d0ba 145 *
marcozecchini 0:9fca2b23d0ba 146 * @param[in] toDetach FunctionPointerWithContext instance to detach from
marcozecchini 0:9fca2b23d0ba 147 * this callchain.
marcozecchini 0:9fca2b23d0ba 148 *
marcozecchini 0:9fca2b23d0ba 149 * @return true if a function pointer has been detached and false otherwise.
marcozecchini 0:9fca2b23d0ba 150 *
marcozecchini 0:9fca2b23d0ba 151 * @note It is safe to remove a function pointer while
marcozecchini 0:9fca2b23d0ba 152 * call(ContextType) is traversing the chain.
marcozecchini 0:9fca2b23d0ba 153 */
marcozecchini 0:9fca2b23d0ba 154 bool detach(const FunctionPointerWithContext<ContextType> &toDetach)
marcozecchini 0:9fca2b23d0ba 155 {
marcozecchini 0:9fca2b23d0ba 156 pFunctionPointerWithContext_t current = chainHead;
marcozecchini 0:9fca2b23d0ba 157 pFunctionPointerWithContext_t previous = NULL;
marcozecchini 0:9fca2b23d0ba 158
marcozecchini 0:9fca2b23d0ba 159 while (current) {
marcozecchini 0:9fca2b23d0ba 160 if(*current == toDetach) {
marcozecchini 0:9fca2b23d0ba 161 if(previous == NULL) {
marcozecchini 0:9fca2b23d0ba 162 if(currentCalled == current) {
marcozecchini 0:9fca2b23d0ba 163 currentCalled = NULL;
marcozecchini 0:9fca2b23d0ba 164 }
marcozecchini 0:9fca2b23d0ba 165 chainHead = current->getNext();
marcozecchini 0:9fca2b23d0ba 166 } else {
marcozecchini 0:9fca2b23d0ba 167 if(currentCalled == current) {
marcozecchini 0:9fca2b23d0ba 168 currentCalled = previous;
marcozecchini 0:9fca2b23d0ba 169 }
marcozecchini 0:9fca2b23d0ba 170 previous->chainAsNext(current->getNext());
marcozecchini 0:9fca2b23d0ba 171 }
marcozecchini 0:9fca2b23d0ba 172 delete current;
marcozecchini 0:9fca2b23d0ba 173 return true;
marcozecchini 0:9fca2b23d0ba 174 }
marcozecchini 0:9fca2b23d0ba 175
marcozecchini 0:9fca2b23d0ba 176 previous = current;
marcozecchini 0:9fca2b23d0ba 177 current = current->getNext();
marcozecchini 0:9fca2b23d0ba 178 }
marcozecchini 0:9fca2b23d0ba 179
marcozecchini 0:9fca2b23d0ba 180 return false;
marcozecchini 0:9fca2b23d0ba 181 }
marcozecchini 0:9fca2b23d0ba 182
marcozecchini 0:9fca2b23d0ba 183 /**
marcozecchini 0:9fca2b23d0ba 184 * Remove all functions registered in the chain.
marcozecchini 0:9fca2b23d0ba 185 */
marcozecchini 0:9fca2b23d0ba 186 void clear(void)
marcozecchini 0:9fca2b23d0ba 187 {
marcozecchini 0:9fca2b23d0ba 188 pFunctionPointerWithContext_t fptr = chainHead;
marcozecchini 0:9fca2b23d0ba 189 while (fptr) {
marcozecchini 0:9fca2b23d0ba 190 pFunctionPointerWithContext_t deadPtr = fptr;
marcozecchini 0:9fca2b23d0ba 191 fptr = deadPtr->getNext();
marcozecchini 0:9fca2b23d0ba 192 delete deadPtr;
marcozecchini 0:9fca2b23d0ba 193 }
marcozecchini 0:9fca2b23d0ba 194
marcozecchini 0:9fca2b23d0ba 195 chainHead = NULL;
marcozecchini 0:9fca2b23d0ba 196 }
marcozecchini 0:9fca2b23d0ba 197
marcozecchini 0:9fca2b23d0ba 198 /**
marcozecchini 0:9fca2b23d0ba 199 * Check whether the callchain contains any callbacks.
marcozecchini 0:9fca2b23d0ba 200 *
marcozecchini 0:9fca2b23d0ba 201 * @return true if the callchain is not empty and false otherwise.
marcozecchini 0:9fca2b23d0ba 202 */
marcozecchini 0:9fca2b23d0ba 203 bool hasCallbacksAttached(void) const
marcozecchini 0:9fca2b23d0ba 204 {
marcozecchini 0:9fca2b23d0ba 205 return (chainHead != NULL);
marcozecchini 0:9fca2b23d0ba 206 }
marcozecchini 0:9fca2b23d0ba 207
marcozecchini 0:9fca2b23d0ba 208 /**
marcozecchini 0:9fca2b23d0ba 209 * Call sequentially each member of the chain.
marcozecchini 0:9fca2b23d0ba 210 *
marcozecchini 0:9fca2b23d0ba 211 * @param[in] context Parameter to pass to the functions called.
marcozecchini 0:9fca2b23d0ba 212 */
marcozecchini 0:9fca2b23d0ba 213 void call(ContextType context)
marcozecchini 0:9fca2b23d0ba 214 {
marcozecchini 0:9fca2b23d0ba 215 ((const CallChainOfFunctionPointersWithContext*) this)->call(context);
marcozecchini 0:9fca2b23d0ba 216 }
marcozecchini 0:9fca2b23d0ba 217
marcozecchini 0:9fca2b23d0ba 218 /**
marcozecchini 0:9fca2b23d0ba 219 * Call sequentially each member of the chain.
marcozecchini 0:9fca2b23d0ba 220 *
marcozecchini 0:9fca2b23d0ba 221 * @param[in] context Parameter to pass to the functions called.
marcozecchini 0:9fca2b23d0ba 222 */
marcozecchini 0:9fca2b23d0ba 223 void call(ContextType context) const
marcozecchini 0:9fca2b23d0ba 224 {
marcozecchini 0:9fca2b23d0ba 225 currentCalled = chainHead;
marcozecchini 0:9fca2b23d0ba 226
marcozecchini 0:9fca2b23d0ba 227 while(currentCalled) {
marcozecchini 0:9fca2b23d0ba 228 currentCalled->call(context);
marcozecchini 0:9fca2b23d0ba 229 // if this was the head and the call removed the head
marcozecchini 0:9fca2b23d0ba 230 if(currentCalled == NULL) {
marcozecchini 0:9fca2b23d0ba 231 currentCalled = chainHead;
marcozecchini 0:9fca2b23d0ba 232 } else {
marcozecchini 0:9fca2b23d0ba 233 currentCalled = currentCalled->getNext();
marcozecchini 0:9fca2b23d0ba 234 }
marcozecchini 0:9fca2b23d0ba 235 }
marcozecchini 0:9fca2b23d0ba 236 }
marcozecchini 0:9fca2b23d0ba 237
marcozecchini 0:9fca2b23d0ba 238 /**
marcozecchini 0:9fca2b23d0ba 239 * Call sequentially each member of the chain.
marcozecchini 0:9fca2b23d0ba 240 *
marcozecchini 0:9fca2b23d0ba 241 * @param[in] context Parameter to pass to the functions called.
marcozecchini 0:9fca2b23d0ba 242 *
marcozecchini 0:9fca2b23d0ba 243 * @code
marcozecchini 0:9fca2b23d0ba 244 *
marcozecchini 0:9fca2b23d0ba 245 * void first(bool);
marcozecchini 0:9fca2b23d0ba 246 * void second(bool);
marcozecchini 0:9fca2b23d0ba 247 *
marcozecchini 0:9fca2b23d0ba 248 * CallChainOfFunctionPointerWithContext<bool> foo;
marcozecchini 0:9fca2b23d0ba 249 *
marcozecchini 0:9fca2b23d0ba 250 * foo.attach(first);
marcozecchini 0:9fca2b23d0ba 251 * foo.attach(second);
marcozecchini 0:9fca2b23d0ba 252 *
marcozecchini 0:9fca2b23d0ba 253 * // call the callchain like a function
marcozecchini 0:9fca2b23d0ba 254 * foo(true);
marcozecchini 0:9fca2b23d0ba 255 *
marcozecchini 0:9fca2b23d0ba 256 * @endcode
marcozecchini 0:9fca2b23d0ba 257 */
marcozecchini 0:9fca2b23d0ba 258 void operator()(ContextType context) const
marcozecchini 0:9fca2b23d0ba 259 {
marcozecchini 0:9fca2b23d0ba 260 call(context);
marcozecchini 0:9fca2b23d0ba 261 }
marcozecchini 0:9fca2b23d0ba 262
marcozecchini 0:9fca2b23d0ba 263 /**
marcozecchini 0:9fca2b23d0ba 264 * Test if the callchain is empty or not.
marcozecchini 0:9fca2b23d0ba 265 *
marcozecchini 0:9fca2b23d0ba 266 * @return true if the callchain is not empty and false otherwise.
marcozecchini 0:9fca2b23d0ba 267 *
marcozecchini 0:9fca2b23d0ba 268 * @note used by SafeBool to offer a safe boolean conversion.
marcozecchini 0:9fca2b23d0ba 269 *
marcozecchini 0:9fca2b23d0ba 270 * @code
marcozecchini 0:9fca2b23d0ba 271 * CallChainOfFunctionPointersWithContext<void *> chain;
marcozecchini 0:9fca2b23d0ba 272 *
marcozecchini 0:9fca2b23d0ba 273 * if (!chain) {
marcozecchini 0:9fca2b23d0ba 274 * // Do something if the chain is empty.
marcozecchini 0:9fca2b23d0ba 275 * }
marcozecchini 0:9fca2b23d0ba 276 *
marcozecchini 0:9fca2b23d0ba 277 * if (chain) {
marcozecchini 0:9fca2b23d0ba 278 * // Do something if the chain is not empty.
marcozecchini 0:9fca2b23d0ba 279 * }
marcozecchini 0:9fca2b23d0ba 280 * @endcode
marcozecchini 0:9fca2b23d0ba 281 *
marcozecchini 0:9fca2b23d0ba 282 */
marcozecchini 0:9fca2b23d0ba 283 bool toBool() const
marcozecchini 0:9fca2b23d0ba 284 {
marcozecchini 0:9fca2b23d0ba 285 return chainHead != NULL;
marcozecchini 0:9fca2b23d0ba 286 }
marcozecchini 0:9fca2b23d0ba 287
marcozecchini 0:9fca2b23d0ba 288 private:
marcozecchini 0:9fca2b23d0ba 289 /**
marcozecchini 0:9fca2b23d0ba 290 * Add a callback to the head of the callchain.
marcozecchini 0:9fca2b23d0ba 291 *
marcozecchini 0:9fca2b23d0ba 292 * @return A pointer to the head of the callchain.
marcozecchini 0:9fca2b23d0ba 293 */
marcozecchini 0:9fca2b23d0ba 294 pFunctionPointerWithContext_t common_add(pFunctionPointerWithContext_t pf)
marcozecchini 0:9fca2b23d0ba 295 {
marcozecchini 0:9fca2b23d0ba 296 if (chainHead == NULL) {
marcozecchini 0:9fca2b23d0ba 297 chainHead = pf;
marcozecchini 0:9fca2b23d0ba 298 } else {
marcozecchini 0:9fca2b23d0ba 299 pf->chainAsNext(chainHead);
marcozecchini 0:9fca2b23d0ba 300 chainHead = pf;
marcozecchini 0:9fca2b23d0ba 301 }
marcozecchini 0:9fca2b23d0ba 302
marcozecchini 0:9fca2b23d0ba 303 return chainHead;
marcozecchini 0:9fca2b23d0ba 304 }
marcozecchini 0:9fca2b23d0ba 305
marcozecchini 0:9fca2b23d0ba 306 private:
marcozecchini 0:9fca2b23d0ba 307 /**
marcozecchini 0:9fca2b23d0ba 308 * Pointer to the first callback of the callchain or NULL if the callchain
marcozecchini 0:9fca2b23d0ba 309 * is empty.
marcozecchini 0:9fca2b23d0ba 310 */
marcozecchini 0:9fca2b23d0ba 311 pFunctionPointerWithContext_t chainHead;
marcozecchini 0:9fca2b23d0ba 312
marcozecchini 0:9fca2b23d0ba 313 /**
marcozecchini 0:9fca2b23d0ba 314 * Pointer to the function being called.
marcozecchini 0:9fca2b23d0ba 315 *
marcozecchini 0:9fca2b23d0ba 316 * It is used to maintain the data structure integrity if a function is
marcozecchini 0:9fca2b23d0ba 317 * removed during the call() operation.
marcozecchini 0:9fca2b23d0ba 318 *
marcozecchini 0:9fca2b23d0ba 319 * @note It has to be mutable to accomodate the const version of call(). The
marcozecchini 0:9fca2b23d0ba 320 * iterator doesn't leak outside the object; therefore, it remains seen as
marcozecchini 0:9fca2b23d0ba 321 * const from an external standpoint.
marcozecchini 0:9fca2b23d0ba 322 */
marcozecchini 0:9fca2b23d0ba 323 mutable pFunctionPointerWithContext_t currentCalled;
marcozecchini 0:9fca2b23d0ba 324
marcozecchini 0:9fca2b23d0ba 325
marcozecchini 0:9fca2b23d0ba 326 /* Disallow copy constructor and assignment operators. */
marcozecchini 0:9fca2b23d0ba 327 private:
marcozecchini 0:9fca2b23d0ba 328 CallChainOfFunctionPointersWithContext(
marcozecchini 0:9fca2b23d0ba 329 const CallChainOfFunctionPointersWithContext&
marcozecchini 0:9fca2b23d0ba 330 );
marcozecchini 0:9fca2b23d0ba 331 CallChainOfFunctionPointersWithContext &operator=(
marcozecchini 0:9fca2b23d0ba 332 const CallChainOfFunctionPointersWithContext&
marcozecchini 0:9fca2b23d0ba 333 );
marcozecchini 0:9fca2b23d0ba 334 };
marcozecchini 0:9fca2b23d0ba 335
marcozecchini 0:9fca2b23d0ba 336 /**
marcozecchini 0:9fca2b23d0ba 337 * @}
marcozecchini 0:9fca2b23d0ba 338 * @}
marcozecchini 0:9fca2b23d0ba 339 */
marcozecchini 0:9fca2b23d0ba 340
marcozecchini 0:9fca2b23d0ba 341 #endif