FRDM K64F Metronome

Committer:
ram54288
Date:
Sun May 14 18:35:07 2017 +0000
Revision:
0:a2cb7295a1f7
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ram54288 0:a2cb7295a1f7 1 /* mbed Microcontroller Library
ram54288 0:a2cb7295a1f7 2 * Copyright (c) 2006-2015 ARM Limited
ram54288 0:a2cb7295a1f7 3 *
ram54288 0:a2cb7295a1f7 4 * Licensed under the Apache License, Version 2.0 (the "License");
ram54288 0:a2cb7295a1f7 5 * you may not use this file except in compliance with the License.
ram54288 0:a2cb7295a1f7 6 * You may obtain a copy of the License at
ram54288 0:a2cb7295a1f7 7 *
ram54288 0:a2cb7295a1f7 8 * http://www.apache.org/licenses/LICENSE-2.0
ram54288 0:a2cb7295a1f7 9 *
ram54288 0:a2cb7295a1f7 10 * Unless required by applicable law or agreed to in writing, software
ram54288 0:a2cb7295a1f7 11 * distributed under the License is distributed on an "AS IS" BASIS,
ram54288 0:a2cb7295a1f7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ram54288 0:a2cb7295a1f7 13 * See the License for the specific language governing permissions and
ram54288 0:a2cb7295a1f7 14 * limitations under the License.
ram54288 0:a2cb7295a1f7 15 */
ram54288 0:a2cb7295a1f7 16
ram54288 0:a2cb7295a1f7 17 #ifndef MBED_FUNCTIONPOINTERBIND_H__
ram54288 0:a2cb7295a1f7 18 #define MBED_FUNCTIONPOINTERBIND_H__
ram54288 0:a2cb7295a1f7 19
ram54288 0:a2cb7295a1f7 20 #include <string.h>
ram54288 0:a2cb7295a1f7 21 #include <stdint.h>
ram54288 0:a2cb7295a1f7 22 #include <stddef.h>
ram54288 0:a2cb7295a1f7 23 #include <stdarg.h>
ram54288 0:a2cb7295a1f7 24 #include <assert.h>
ram54288 0:a2cb7295a1f7 25 #include "FunctionPointerBase.h"
ram54288 0:a2cb7295a1f7 26
ram54288 0:a2cb7295a1f7 27 #ifndef EVENT_STORAGE_SIZE
ram54288 0:a2cb7295a1f7 28 #define EVENT_STORAGE_SIZE 32
ram54288 0:a2cb7295a1f7 29 #endif
ram54288 0:a2cb7295a1f7 30
ram54288 0:a2cb7295a1f7 31 #define MBED_STATIC_ASSERT(MBED_STATIC_ASSERT_FAILED,MSG)\
ram54288 0:a2cb7295a1f7 32 switch(0){\
ram54288 0:a2cb7295a1f7 33 case 0:case (MBED_STATIC_ASSERT_FAILED): \
ram54288 0:a2cb7295a1f7 34 break;}
ram54288 0:a2cb7295a1f7 35
ram54288 0:a2cb7295a1f7 36 namespace mbed{
ram54288 0:a2cb7295a1f7 37
ram54288 0:a2cb7295a1f7 38 template<typename R>
ram54288 0:a2cb7295a1f7 39 class FunctionPointerBind : public FunctionPointerBase<R> {
ram54288 0:a2cb7295a1f7 40 public:
ram54288 0:a2cb7295a1f7 41 // Call the Event
ram54288 0:a2cb7295a1f7 42 inline R call() {
ram54288 0:a2cb7295a1f7 43 return FunctionPointerBase<R>::call(static_cast<void *>(_storage));
ram54288 0:a2cb7295a1f7 44 }
ram54288 0:a2cb7295a1f7 45 FunctionPointerBind():
ram54288 0:a2cb7295a1f7 46 FunctionPointerBase<R>(),
ram54288 0:a2cb7295a1f7 47 _ops(&FunctionPointerBase<R>::_nullops)
ram54288 0:a2cb7295a1f7 48 {}
ram54288 0:a2cb7295a1f7 49
ram54288 0:a2cb7295a1f7 50 FunctionPointerBind(const FunctionPointerBind<R> & fp):
ram54288 0:a2cb7295a1f7 51 FunctionPointerBase<R>(),
ram54288 0:a2cb7295a1f7 52 _ops(&FunctionPointerBase<R>::_nullops) {
ram54288 0:a2cb7295a1f7 53 *this = fp;
ram54288 0:a2cb7295a1f7 54 }
ram54288 0:a2cb7295a1f7 55
ram54288 0:a2cb7295a1f7 56 virtual ~FunctionPointerBind() {
ram54288 0:a2cb7295a1f7 57 _ops->destructor(_storage);
ram54288 0:a2cb7295a1f7 58 }
ram54288 0:a2cb7295a1f7 59
ram54288 0:a2cb7295a1f7 60 FunctionPointerBind<R> & operator=(const FunctionPointerBind<R>& rhs) {
ram54288 0:a2cb7295a1f7 61 if (_ops != &FunctionPointerBase<R>::_nullops) {
ram54288 0:a2cb7295a1f7 62 _ops->destructor(_storage);
ram54288 0:a2cb7295a1f7 63 }
ram54288 0:a2cb7295a1f7 64 FunctionPointerBase<R>::copy(&rhs);
ram54288 0:a2cb7295a1f7 65 _ops = rhs._ops;
ram54288 0:a2cb7295a1f7 66 _ops->copy_args(_storage, (void *)rhs._storage);
ram54288 0:a2cb7295a1f7 67 return *this;
ram54288 0:a2cb7295a1f7 68 }
ram54288 0:a2cb7295a1f7 69
ram54288 0:a2cb7295a1f7 70 /**
ram54288 0:a2cb7295a1f7 71 * Clears the current binding, making this instance unbound
ram54288 0:a2cb7295a1f7 72 */
ram54288 0:a2cb7295a1f7 73 virtual void clear() {
ram54288 0:a2cb7295a1f7 74 if (_ops != &FunctionPointerBase<R>::_nullops) {
ram54288 0:a2cb7295a1f7 75 _ops->destructor(_storage);
ram54288 0:a2cb7295a1f7 76 }
ram54288 0:a2cb7295a1f7 77 _ops = &FunctionPointerBase<R>::_nullops;
ram54288 0:a2cb7295a1f7 78 FunctionPointerBase<R>::clear();
ram54288 0:a2cb7295a1f7 79 }
ram54288 0:a2cb7295a1f7 80
ram54288 0:a2cb7295a1f7 81 template<typename S>
ram54288 0:a2cb7295a1f7 82 FunctionPointerBind<R> & bind(const struct FunctionPointerBase<R>::ArgOps * ops , S * argStruct, FunctionPointerBase<R> *fp, ...) {
ram54288 0:a2cb7295a1f7 83 MBED_STATIC_ASSERT(sizeof(S) <= sizeof(_storage), ERROR: Arguments too large for FunctionPointerBind internal storage)
ram54288 0:a2cb7295a1f7 84 if (_ops != &FunctionPointerBase<R>::_nullops) {
ram54288 0:a2cb7295a1f7 85 _ops->destructor(_storage);
ram54288 0:a2cb7295a1f7 86 }
ram54288 0:a2cb7295a1f7 87 _ops = ops;
ram54288 0:a2cb7295a1f7 88 FunctionPointerBase<R>::copy(fp);
ram54288 0:a2cb7295a1f7 89 assert(this->_ops != NULL);
ram54288 0:a2cb7295a1f7 90 assert(this->_ops->constructor != NULL);
ram54288 0:a2cb7295a1f7 91 if (argStruct) {
ram54288 0:a2cb7295a1f7 92 this->_ops->copy_args(this->_storage, (void *)argStruct);
ram54288 0:a2cb7295a1f7 93 } else {
ram54288 0:a2cb7295a1f7 94 va_list args;
ram54288 0:a2cb7295a1f7 95 va_start(args, fp);
ram54288 0:a2cb7295a1f7 96 this->_ops->constructor(_storage, args);
ram54288 0:a2cb7295a1f7 97 va_end(args);
ram54288 0:a2cb7295a1f7 98 }
ram54288 0:a2cb7295a1f7 99 return *this;
ram54288 0:a2cb7295a1f7 100 }
ram54288 0:a2cb7295a1f7 101
ram54288 0:a2cb7295a1f7 102 R operator()() {
ram54288 0:a2cb7295a1f7 103 return call();
ram54288 0:a2cb7295a1f7 104 }
ram54288 0:a2cb7295a1f7 105
ram54288 0:a2cb7295a1f7 106 protected:
ram54288 0:a2cb7295a1f7 107 const struct FunctionPointerBase<R>::ArgOps * _ops;
ram54288 0:a2cb7295a1f7 108 uint32_t _storage[(EVENT_STORAGE_SIZE+sizeof(uint32_t)-1)/sizeof(uint32_t)];
ram54288 0:a2cb7295a1f7 109 };
ram54288 0:a2cb7295a1f7 110 }
ram54288 0:a2cb7295a1f7 111
ram54288 0:a2cb7295a1f7 112 #endif // MBED_FUNCTIONPOINTERBIND_H__