
test
Diff: mbed/platform/Callback.h
- Revision:
- 12:406f75196a12
- Parent:
- 11:32eeb052cda5
- Child:
- 13:0c732e06d675
--- a/mbed/platform/Callback.h Wed Aug 26 14:26:27 2020 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4939 +0,0 @@ -/* mbed Microcontroller Library - * Copyright (c) 2006-2015 ARM Limited - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef MBED_CALLBACK_H -#define MBED_CALLBACK_H - -#include <string.h> -#include <stdint.h> -#include <new> -#include "platform/mbed_assert.h" -#include "platform/mbed_toolchain.h" - -namespace mbed { -/** \addtogroup platform */ -/** @{*/ -/** - * \defgroup platform_Callback Callback class - * @{ - */ - -/** Callback class based on template specialization - * - * @note Synchronization level: Not protected - */ -template <typename F> -class Callback; - -// Internal sfinae declarations -// -// These are used to eliminate overloads based on type attributes -// 1. Does a function object have a call operator -// 2. Does a function object fit in the available storage -// -// These eliminations are handled cleanly by the compiler and avoid -// massive and misleading error messages when confronted with an -// invalid type (or worse, runtime failures) -namespace detail { -struct nil {}; - -template <bool B, typename R = nil> -struct enable_if { - typedef R type; -}; - -template <typename R> -struct enable_if<false, R> {}; - -template <typename M, M> -struct is_type { - static const bool value = true; -}; -} - -#define MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, M) \ - typename detail::enable_if< \ - detail::is_type<M, &F::operator()>::value && \ - sizeof(F) <= sizeof(uintptr_t) \ - >::type = detail::nil() - -/** Callback class based on template specialization - * - * @note Synchronization level: Not protected - */ -template <typename R> -class Callback<R()> { -public: - /** Create a Callback with a static function - * @param func Static function to attach - */ - Callback(R(*func)() = 0) - { - if (!func) { - memset(this, 0, sizeof(Callback)); - } else { - generate(func); - } - } - - /** Attach a Callback - * @param func The Callback to attach - */ - Callback(const Callback<R()> &func) - { - if (func._ops) { - func._ops->move(this, &func); - } - _ops = func._ops; - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(U *obj, R(T::*method)()) - { - generate(method_context<T, R(T::*)()>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(const U *obj, R(T::*method)() const) - { - generate(method_context<const T, R(T::*)() const>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(volatile U *obj, R(T::*method)() volatile) - { - generate(method_context<volatile T, R(T::*)() volatile>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(const volatile U *obj, R(T::*method)() const volatile) - { - generate(method_context<const volatile T, R(T::*)() const volatile>(obj, method)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(T *), U *arg) - { - generate(function_context<R(*)(T *), T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(const T *), const U *arg) - { - generate(function_context<R(*)(const T *), const T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(volatile T *), volatile U *arg) - { - generate(function_context<R(*)(volatile T *), volatile T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(const volatile T *), const volatile U *arg) - { - generate(function_context<R(*)(const volatile T *), const volatile T>(func, arg)); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)())) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)() const)) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)() volatile)) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)() const volatile)) - { - generate(f); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(U *obj, R(*func)(T *)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(const U *obj, R(*func)(const T *)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(volatile U *obj, R(*func)(volatile T *)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(const volatile U *obj, R(*func)(const volatile T *)) - { - new (this) Callback(func, obj); - } - - /** Destroy a callback - */ - ~Callback() - { - if (_ops) { - _ops->dtor(this); - } - } - - /** Attach a static function - * @param func Static function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)()) - { - this->~Callback(); - new (this) Callback(func); - } - - /** Attach a Callback - * @param func The Callback to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const Callback<R()> &func) - { - this->~Callback(); - new (this) Callback(func); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(U *obj, R(T::*method)()) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const U *obj, R(T::*method)() const) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(volatile U *obj, R(T::*method)() volatile) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const volatile U *obj, R(T::*method)() const volatile) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(T *), U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(const T *), const U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(volatile T *), volatile U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(const volatile T *), const volatile U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)())) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)() const)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)() volatile)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)() const volatile)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(U *obj, R(*func)(T *)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(const U *obj, R(*func)(const T *)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(volatile U *obj, R(*func)(volatile T *)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(const volatile U *obj, R(*func)(const volatile T *)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Assign a callback - */ - Callback &operator=(const Callback &that) - { - if (this != &that) { - this->~Callback(); - new (this) Callback(that); - } - - return *this; - } - - /** Call the attached function - */ - R call() const - { - MBED_ASSERT(_ops); - return _ops->call(this); - } - - /** Call the attached function - */ - R operator()() const - { - return call(); - } - - /** Test if function has been attached - */ - operator bool() const - { - return _ops; - } - - /** Test for equality - */ - friend bool operator==(const Callback &l, const Callback &r) - { - return memcmp(&l, &r, sizeof(Callback)) == 0; - } - - /** Test for inequality - */ - friend bool operator!=(const Callback &l, const Callback &r) - { - return !(l == r); - } - - /** Static thunk for passing as C-style function - * @param func Callback to call passed as void pointer - * @return the value as determined by func which is of - * type and determined by the signature of func - */ - static R thunk(void *func) - { - return static_cast<Callback *>(func)->call(); - } - -private: - // Stored as pointer to function and pointer to optional object - // Function pointer is stored as union of possible function types - // to guarantee proper size and alignment - struct _class; - union { - void (*_staticfunc)(); - void (*_boundfunc)(_class *); - void (_class::*_methodfunc)(); - } _func; - void *_obj; - - // Dynamically dispatched operations - const struct ops { - R(*call)(const void *); - void (*move)(void *, const void *); - void (*dtor)(void *); - } *_ops; - - // Generate operations for function object - template <typename F> - void generate(const F &f) - { - static const ops ops = { - &Callback::function_call<F>, - &Callback::function_move<F>, - &Callback::function_dtor<F>, - }; - - MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F), - "Type F must not exceed the size of the Callback class"); - memset(this, 0, sizeof(Callback)); - new (this) F(f); - _ops = &ops; - } - - // Function attributes - template <typename F> - static R function_call(const void *p) - { - return (*(F *)p)(); - } - - template <typename F> - static void function_move(void *d, const void *p) - { - new (d) F(*(F *)p); - } - - template <typename F> - static void function_dtor(void *p) - { - ((F *)p)->~F(); - } - - // Wrappers for functions with context - template <typename O, typename M> - struct method_context { - M method; - O *obj; - - method_context(O *obj, M method) - : method(method), obj(obj) {} - - R operator()() const - { - return (obj->*method)(); - } - }; - - template <typename F, typename A> - struct function_context { - F func; - A *arg; - - function_context(F func, A *arg) - : func(func), arg(arg) {} - - R operator()() const - { - return func(arg); - } - }; -}; - -/** Callback class based on template specialization - * - * @note Synchronization level: Not protected - */ -template <typename R, typename A0> -class Callback<R(A0)> { -public: - /** Create a Callback with a static function - * @param func Static function to attach - */ - Callback(R(*func)(A0) = 0) - { - if (!func) { - memset(this, 0, sizeof(Callback)); - } else { - generate(func); - } - } - - /** Attach a Callback - * @param func The Callback to attach - */ - Callback(const Callback<R(A0)> &func) - { - if (func._ops) { - func._ops->move(this, &func); - } - _ops = func._ops; - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(U *obj, R(T::*method)(A0)) - { - generate(method_context<T, R(T::*)(A0)>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(const U *obj, R(T::*method)(A0) const) - { - generate(method_context<const T, R(T::*)(A0) const>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(volatile U *obj, R(T::*method)(A0) volatile) - { - generate(method_context<volatile T, R(T::*)(A0) volatile>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(const volatile U *obj, R(T::*method)(A0) const volatile) - { - generate(method_context<const volatile T, R(T::*)(A0) const volatile>(obj, method)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(T *, A0), U *arg) - { - generate(function_context<R(*)(T *, A0), T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(const T *, A0), const U *arg) - { - generate(function_context<R(*)(const T *, A0), const T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(volatile T *, A0), volatile U *arg) - { - generate(function_context<R(*)(volatile T *, A0), volatile T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(const volatile T *, A0), const volatile U *arg) - { - generate(function_context<R(*)(const volatile T *, A0), const volatile T>(func, arg)); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0))) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0) const)) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0) volatile)) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0) const volatile)) - { - generate(f); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(U *obj, R(*func)(T *, A0)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(const U *obj, R(*func)(const T *, A0)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(volatile U *obj, R(*func)(volatile T *, A0)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(const volatile U *obj, R(*func)(const volatile T *, A0)) - { - new (this) Callback(func, obj); - } - - /** Destroy a callback - */ - ~Callback() - { - if (_ops) { - _ops->dtor(this); - } - } - - /** Attach a static function - * @param func Static function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(A0)) - { - this->~Callback(); - new (this) Callback(func); - } - - /** Attach a Callback - * @param func The Callback to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const Callback<R(A0)> &func) - { - this->~Callback(); - new (this) Callback(func); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(U *obj, R(T::*method)(A0)) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const U *obj, R(T::*method)(A0) const) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(volatile U *obj, R(T::*method)(A0) volatile) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const volatile U *obj, R(T::*method)(A0) const volatile) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(T *, A0), U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(const T *, A0), const U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(volatile T *, A0), volatile U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(const volatile T *, A0), const volatile U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0))) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0) const)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0) volatile)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0) const volatile)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(U *obj, R(*func)(T *, A0)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(const U *obj, R(*func)(const T *, A0)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(volatile U *obj, R(*func)(volatile T *, A0)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(const volatile U *obj, R(*func)(const volatile T *, A0)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Assign a callback - */ - Callback &operator=(const Callback &that) - { - if (this != &that) { - this->~Callback(); - new (this) Callback(that); - } - - return *this; - } - - /** Call the attached function - */ - R call(A0 a0) const - { - MBED_ASSERT(_ops); - return _ops->call(this, a0); - } - - /** Call the attached function - */ - R operator()(A0 a0) const - { - return call(a0); - } - - /** Test if function has been attached - */ - operator bool() const - { - return _ops; - } - - /** Test for equality - */ - friend bool operator==(const Callback &l, const Callback &r) - { - return memcmp(&l, &r, sizeof(Callback)) == 0; - } - - /** Test for inequality - */ - friend bool operator!=(const Callback &l, const Callback &r) - { - return !(l == r); - } - - /** Static thunk for passing as C-style function - * @param func Callback to call passed as void pointer - * @param a0 An argument to be called with function func - * @return the value as determined by func which is of - * type and determined by the signature of func - */ - static R thunk(void *func, A0 a0) - { - return static_cast<Callback *>(func)->call(a0); - } - -private: - // Stored as pointer to function and pointer to optional object - // Function pointer is stored as union of possible function types - // to guarantee proper size and alignment - struct _class; - union { - void (*_staticfunc)(A0); - void (*_boundfunc)(_class *, A0); - void (_class::*_methodfunc)(A0); - } _func; - void *_obj; - - // Dynamically dispatched operations - const struct ops { - R(*call)(const void *, A0); - void (*move)(void *, const void *); - void (*dtor)(void *); - } *_ops; - - // Generate operations for function object - template <typename F> - void generate(const F &f) - { - static const ops ops = { - &Callback::function_call<F>, - &Callback::function_move<F>, - &Callback::function_dtor<F>, - }; - - MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F), - "Type F must not exceed the size of the Callback class"); - memset(this, 0, sizeof(Callback)); - new (this) F(f); - _ops = &ops; - } - - // Function attributes - template <typename F> - static R function_call(const void *p, A0 a0) - { - return (*(F *)p)(a0); - } - - template <typename F> - static void function_move(void *d, const void *p) - { - new (d) F(*(F *)p); - } - - template <typename F> - static void function_dtor(void *p) - { - ((F *)p)->~F(); - } - - // Wrappers for functions with context - template <typename O, typename M> - struct method_context { - M method; - O *obj; - - method_context(O *obj, M method) - : method(method), obj(obj) {} - - R operator()(A0 a0) const - { - return (obj->*method)(a0); - } - }; - - template <typename F, typename A> - struct function_context { - F func; - A *arg; - - function_context(F func, A *arg) - : func(func), arg(arg) {} - - R operator()(A0 a0) const - { - return func(arg, a0); - } - }; -}; - -/** Callback class based on template specialization - * - * @note Synchronization level: Not protected - */ -template <typename R, typename A0, typename A1> -class Callback<R(A0, A1)> { -public: - /** Create a Callback with a static function - * @param func Static function to attach - */ - Callback(R(*func)(A0, A1) = 0) - { - if (!func) { - memset(this, 0, sizeof(Callback)); - } else { - generate(func); - } - } - - /** Attach a Callback - * @param func The Callback to attach - */ - Callback(const Callback<R(A0, A1)> &func) - { - if (func._ops) { - func._ops->move(this, &func); - } - _ops = func._ops; - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(U *obj, R(T::*method)(A0, A1)) - { - generate(method_context<T, R(T::*)(A0, A1)>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(const U *obj, R(T::*method)(A0, A1) const) - { - generate(method_context<const T, R(T::*)(A0, A1) const>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(volatile U *obj, R(T::*method)(A0, A1) volatile) - { - generate(method_context<volatile T, R(T::*)(A0, A1) volatile>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(const volatile U *obj, R(T::*method)(A0, A1) const volatile) - { - generate(method_context<const volatile T, R(T::*)(A0, A1) const volatile>(obj, method)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(T *, A0, A1), U *arg) - { - generate(function_context<R(*)(T *, A0, A1), T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(const T *, A0, A1), const U *arg) - { - generate(function_context<R(*)(const T *, A0, A1), const T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(volatile T *, A0, A1), volatile U *arg) - { - generate(function_context<R(*)(volatile T *, A0, A1), volatile T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(const volatile T *, A0, A1), const volatile U *arg) - { - generate(function_context<R(*)(const volatile T *, A0, A1), const volatile T>(func, arg)); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1))) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1) const)) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1) volatile)) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1) const volatile)) - { - generate(f); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(U *obj, R(*func)(T *, A0, A1)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(const U *obj, R(*func)(const T *, A0, A1)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(volatile U *obj, R(*func)(volatile T *, A0, A1)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(const volatile U *obj, R(*func)(const volatile T *, A0, A1)) - { - new (this) Callback(func, obj); - } - - /** Destroy a callback - */ - ~Callback() - { - if (_ops) { - _ops->dtor(this); - } - } - - /** Attach a static function - * @param func Static function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(A0, A1)) - { - this->~Callback(); - new (this) Callback(func); - } - - /** Attach a Callback - * @param func The Callback to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const Callback<R(A0, A1)> &func) - { - this->~Callback(); - new (this) Callback(func); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(U *obj, R(T::*method)(A0, A1)) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const U *obj, R(T::*method)(A0, A1) const) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(volatile U *obj, R(T::*method)(A0, A1) volatile) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const volatile U *obj, R(T::*method)(A0, A1) const volatile) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(T *, A0, A1), U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(const T *, A0, A1), const U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(volatile T *, A0, A1), volatile U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(const volatile T *, A0, A1), const volatile U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1))) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1) const)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1) volatile)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1) const volatile)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(U *obj, R(*func)(T *, A0, A1)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(const U *obj, R(*func)(const T *, A0, A1)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(volatile U *obj, R(*func)(volatile T *, A0, A1)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(const volatile U *obj, R(*func)(const volatile T *, A0, A1)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Assign a callback - */ - Callback &operator=(const Callback &that) - { - if (this != &that) { - this->~Callback(); - new (this) Callback(that); - } - - return *this; - } - - /** Call the attached function - */ - R call(A0 a0, A1 a1) const - { - MBED_ASSERT(_ops); - return _ops->call(this, a0, a1); - } - - /** Call the attached function - */ - R operator()(A0 a0, A1 a1) const - { - return call(a0, a1); - } - - /** Test if function has been attached - */ - operator bool() const - { - return _ops; - } - - /** Test for equality - */ - friend bool operator==(const Callback &l, const Callback &r) - { - return memcmp(&l, &r, sizeof(Callback)) == 0; - } - - /** Test for inequality - */ - friend bool operator!=(const Callback &l, const Callback &r) - { - return !(l == r); - } - - /** Static thunk for passing as C-style function - * @param func Callback to call passed as void pointer - * @param a0 An argument to be called with function func - * @param a1 An argument to be called with function func - * @return the value as determined by func which is of - * type and determined by the signature of func - */ - static R thunk(void *func, A0 a0, A1 a1) - { - return static_cast<Callback *>(func)->call(a0, a1); - } - -private: - // Stored as pointer to function and pointer to optional object - // Function pointer is stored as union of possible function types - // to guarantee proper size and alignment - struct _class; - union { - void (*_staticfunc)(A0, A1); - void (*_boundfunc)(_class *, A0, A1); - void (_class::*_methodfunc)(A0, A1); - } _func; - void *_obj; - - // Dynamically dispatched operations - const struct ops { - R(*call)(const void *, A0, A1); - void (*move)(void *, const void *); - void (*dtor)(void *); - } *_ops; - - // Generate operations for function object - template <typename F> - void generate(const F &f) - { - static const ops ops = { - &Callback::function_call<F>, - &Callback::function_move<F>, - &Callback::function_dtor<F>, - }; - - MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F), - "Type F must not exceed the size of the Callback class"); - memset(this, 0, sizeof(Callback)); - new (this) F(f); - _ops = &ops; - } - - // Function attributes - template <typename F> - static R function_call(const void *p, A0 a0, A1 a1) - { - return (*(F *)p)(a0, a1); - } - - template <typename F> - static void function_move(void *d, const void *p) - { - new (d) F(*(F *)p); - } - - template <typename F> - static void function_dtor(void *p) - { - ((F *)p)->~F(); - } - - // Wrappers for functions with context - template <typename O, typename M> - struct method_context { - M method; - O *obj; - - method_context(O *obj, M method) - : method(method), obj(obj) {} - - R operator()(A0 a0, A1 a1) const - { - return (obj->*method)(a0, a1); - } - }; - - template <typename F, typename A> - struct function_context { - F func; - A *arg; - - function_context(F func, A *arg) - : func(func), arg(arg) {} - - R operator()(A0 a0, A1 a1) const - { - return func(arg, a0, a1); - } - }; -}; - -/** Callback class based on template specialization - * - * @note Synchronization level: Not protected - */ -template <typename R, typename A0, typename A1, typename A2> -class Callback<R(A0, A1, A2)> { -public: - /** Create a Callback with a static function - * @param func Static function to attach - */ - Callback(R(*func)(A0, A1, A2) = 0) - { - if (!func) { - memset(this, 0, sizeof(Callback)); - } else { - generate(func); - } - } - - /** Attach a Callback - * @param func The Callback to attach - */ - Callback(const Callback<R(A0, A1, A2)> &func) - { - if (func._ops) { - func._ops->move(this, &func); - } - _ops = func._ops; - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(U *obj, R(T::*method)(A0, A1, A2)) - { - generate(method_context<T, R(T::*)(A0, A1, A2)>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(const U *obj, R(T::*method)(A0, A1, A2) const) - { - generate(method_context<const T, R(T::*)(A0, A1, A2) const>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(volatile U *obj, R(T::*method)(A0, A1, A2) volatile) - { - generate(method_context<volatile T, R(T::*)(A0, A1, A2) volatile>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(const volatile U *obj, R(T::*method)(A0, A1, A2) const volatile) - { - generate(method_context<const volatile T, R(T::*)(A0, A1, A2) const volatile>(obj, method)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(T *, A0, A1, A2), U *arg) - { - generate(function_context<R(*)(T *, A0, A1, A2), T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(const T *, A0, A1, A2), const U *arg) - { - generate(function_context<R(*)(const T *, A0, A1, A2), const T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(volatile T *, A0, A1, A2), volatile U *arg) - { - generate(function_context<R(*)(volatile T *, A0, A1, A2), volatile T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(const volatile T *, A0, A1, A2), const volatile U *arg) - { - generate(function_context<R(*)(const volatile T *, A0, A1, A2), const volatile T>(func, arg)); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2))) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2) const)) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2) volatile)) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2) const volatile)) - { - generate(f); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(U *obj, R(*func)(T *, A0, A1, A2)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(const U *obj, R(*func)(const T *, A0, A1, A2)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(volatile U *obj, R(*func)(volatile T *, A0, A1, A2)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(const volatile U *obj, R(*func)(const volatile T *, A0, A1, A2)) - { - new (this) Callback(func, obj); - } - - /** Destroy a callback - */ - ~Callback() - { - if (_ops) { - _ops->dtor(this); - } - } - - /** Attach a static function - * @param func Static function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(A0, A1, A2)) - { - this->~Callback(); - new (this) Callback(func); - } - - /** Attach a Callback - * @param func The Callback to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const Callback<R(A0, A1, A2)> &func) - { - this->~Callback(); - new (this) Callback(func); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(U *obj, R(T::*method)(A0, A1, A2)) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const U *obj, R(T::*method)(A0, A1, A2) const) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(volatile U *obj, R(T::*method)(A0, A1, A2) volatile) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const volatile U *obj, R(T::*method)(A0, A1, A2) const volatile) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(T *, A0, A1, A2), U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(const T *, A0, A1, A2), const U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(volatile T *, A0, A1, A2), volatile U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(const volatile T *, A0, A1, A2), const volatile U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2))) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2) const)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2) volatile)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2) const volatile)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(U *obj, R(*func)(T *, A0, A1, A2)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(const U *obj, R(*func)(const T *, A0, A1, A2)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(volatile U *obj, R(*func)(volatile T *, A0, A1, A2)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(const volatile U *obj, R(*func)(const volatile T *, A0, A1, A2)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Assign a callback - */ - Callback &operator=(const Callback &that) - { - if (this != &that) { - this->~Callback(); - new (this) Callback(that); - } - - return *this; - } - - /** Call the attached function - */ - R call(A0 a0, A1 a1, A2 a2) const - { - MBED_ASSERT(_ops); - return _ops->call(this, a0, a1, a2); - } - - /** Call the attached function - */ - R operator()(A0 a0, A1 a1, A2 a2) const - { - return call(a0, a1, a2); - } - - /** Test if function has been attached - */ - operator bool() const - { - return _ops; - } - - /** Test for equality - */ - friend bool operator==(const Callback &l, const Callback &r) - { - return memcmp(&l, &r, sizeof(Callback)) == 0; - } - - /** Test for inequality - */ - friend bool operator!=(const Callback &l, const Callback &r) - { - return !(l == r); - } - - /** Static thunk for passing as C-style function - * @param func Callback to call passed as void pointer - * @param a0 An argument to be called with function func - * @param a1 An argument to be called with function func - * @param a2 An argument to be called with function func - * @return the value as determined by func which is of - * type and determined by the signature of func - */ - static R thunk(void *func, A0 a0, A1 a1, A2 a2) - { - return static_cast<Callback *>(func)->call(a0, a1, a2); - } - -private: - // Stored as pointer to function and pointer to optional object - // Function pointer is stored as union of possible function types - // to guarantee proper size and alignment - struct _class; - union { - void (*_staticfunc)(A0, A1, A2); - void (*_boundfunc)(_class *, A0, A1, A2); - void (_class::*_methodfunc)(A0, A1, A2); - } _func; - void *_obj; - - // Dynamically dispatched operations - const struct ops { - R(*call)(const void *, A0, A1, A2); - void (*move)(void *, const void *); - void (*dtor)(void *); - } *_ops; - - // Generate operations for function object - template <typename F> - void generate(const F &f) - { - static const ops ops = { - &Callback::function_call<F>, - &Callback::function_move<F>, - &Callback::function_dtor<F>, - }; - - MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F), - "Type F must not exceed the size of the Callback class"); - memset(this, 0, sizeof(Callback)); - new (this) F(f); - _ops = &ops; - } - - // Function attributes - template <typename F> - static R function_call(const void *p, A0 a0, A1 a1, A2 a2) - { - return (*(F *)p)(a0, a1, a2); - } - - template <typename F> - static void function_move(void *d, const void *p) - { - new (d) F(*(F *)p); - } - - template <typename F> - static void function_dtor(void *p) - { - ((F *)p)->~F(); - } - - // Wrappers for functions with context - template <typename O, typename M> - struct method_context { - M method; - O *obj; - - method_context(O *obj, M method) - : method(method), obj(obj) {} - - R operator()(A0 a0, A1 a1, A2 a2) const - { - return (obj->*method)(a0, a1, a2); - } - }; - - template <typename F, typename A> - struct function_context { - F func; - A *arg; - - function_context(F func, A *arg) - : func(func), arg(arg) {} - - R operator()(A0 a0, A1 a1, A2 a2) const - { - return func(arg, a0, a1, a2); - } - }; -}; - -/** Callback class based on template specialization - * - * @note Synchronization level: Not protected - */ -template <typename R, typename A0, typename A1, typename A2, typename A3> -class Callback<R(A0, A1, A2, A3)> { -public: - /** Create a Callback with a static function - * @param func Static function to attach - */ - Callback(R(*func)(A0, A1, A2, A3) = 0) - { - if (!func) { - memset(this, 0, sizeof(Callback)); - } else { - generate(func); - } - } - - /** Attach a Callback - * @param func The Callback to attach - */ - Callback(const Callback<R(A0, A1, A2, A3)> &func) - { - if (func._ops) { - func._ops->move(this, &func); - } - _ops = func._ops; - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(U *obj, R(T::*method)(A0, A1, A2, A3)) - { - generate(method_context<T, R(T::*)(A0, A1, A2, A3)>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(const U *obj, R(T::*method)(A0, A1, A2, A3) const) - { - generate(method_context<const T, R(T::*)(A0, A1, A2, A3) const>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(volatile U *obj, R(T::*method)(A0, A1, A2, A3) volatile) - { - generate(method_context<volatile T, R(T::*)(A0, A1, A2, A3) volatile>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(const volatile U *obj, R(T::*method)(A0, A1, A2, A3) const volatile) - { - generate(method_context<const volatile T, R(T::*)(A0, A1, A2, A3) const volatile>(obj, method)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(T *, A0, A1, A2, A3), U *arg) - { - generate(function_context<R(*)(T *, A0, A1, A2, A3), T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(const T *, A0, A1, A2, A3), const U *arg) - { - generate(function_context<R(*)(const T *, A0, A1, A2, A3), const T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(volatile T *, A0, A1, A2, A3), volatile U *arg) - { - generate(function_context<R(*)(volatile T *, A0, A1, A2, A3), volatile T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(const volatile T *, A0, A1, A2, A3), const volatile U *arg) - { - generate(function_context<R(*)(const volatile T *, A0, A1, A2, A3), const volatile T>(func, arg)); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3))) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3) const)) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3) volatile)) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3) const volatile)) - { - generate(f); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(U *obj, R(*func)(T *, A0, A1, A2, A3)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(const U *obj, R(*func)(const T *, A0, A1, A2, A3)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(volatile U *obj, R(*func)(volatile T *, A0, A1, A2, A3)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(const volatile U *obj, R(*func)(const volatile T *, A0, A1, A2, A3)) - { - new (this) Callback(func, obj); - } - - /** Destroy a callback - */ - ~Callback() - { - if (_ops) { - _ops->dtor(this); - } - } - - /** Attach a static function - * @param func Static function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(A0, A1, A2, A3)) - { - this->~Callback(); - new (this) Callback(func); - } - - /** Attach a Callback - * @param func The Callback to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const Callback<R(A0, A1, A2, A3)> &func) - { - this->~Callback(); - new (this) Callback(func); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(U *obj, R(T::*method)(A0, A1, A2, A3)) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const U *obj, R(T::*method)(A0, A1, A2, A3) const) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(volatile U *obj, R(T::*method)(A0, A1, A2, A3) volatile) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const volatile U *obj, R(T::*method)(A0, A1, A2, A3) const volatile) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(T *, A0, A1, A2, A3), U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(const T *, A0, A1, A2, A3), const U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(volatile T *, A0, A1, A2, A3), volatile U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(const volatile T *, A0, A1, A2, A3), const volatile U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3))) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3) const)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3) volatile)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3) const volatile)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(U *obj, R(*func)(T *, A0, A1, A2, A3)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(const U *obj, R(*func)(const T *, A0, A1, A2, A3)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(volatile U *obj, R(*func)(volatile T *, A0, A1, A2, A3)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(const volatile U *obj, R(*func)(const volatile T *, A0, A1, A2, A3)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Assign a callback - */ - Callback &operator=(const Callback &that) - { - if (this != &that) { - this->~Callback(); - new (this) Callback(that); - } - - return *this; - } - - /** Call the attached function - */ - R call(A0 a0, A1 a1, A2 a2, A3 a3) const - { - MBED_ASSERT(_ops); - return _ops->call(this, a0, a1, a2, a3); - } - - /** Call the attached function - */ - R operator()(A0 a0, A1 a1, A2 a2, A3 a3) const - { - return call(a0, a1, a2, a3); - } - - /** Test if function has been attached - */ - operator bool() const - { - return _ops; - } - - /** Test for equality - */ - friend bool operator==(const Callback &l, const Callback &r) - { - return memcmp(&l, &r, sizeof(Callback)) == 0; - } - - /** Test for inequality - */ - friend bool operator!=(const Callback &l, const Callback &r) - { - return !(l == r); - } - - /** Static thunk for passing as C-style function - * @param func Callback to call passed as void pointer - * @param a0 An argument to be called with function func - * @param a1 An argument to be called with function func - * @param a2 An argument to be called with function func - * @param a3 An argument to be called with function func - * @return the value as determined by func which is of - * type and determined by the signature of func - */ - static R thunk(void *func, A0 a0, A1 a1, A2 a2, A3 a3) - { - return static_cast<Callback *>(func)->call(a0, a1, a2, a3); - } - -private: - // Stored as pointer to function and pointer to optional object - // Function pointer is stored as union of possible function types - // to guarantee proper size and alignment - struct _class; - union { - void (*_staticfunc)(A0, A1, A2, A3); - void (*_boundfunc)(_class *, A0, A1, A2, A3); - void (_class::*_methodfunc)(A0, A1, A2, A3); - } _func; - void *_obj; - - // Dynamically dispatched operations - const struct ops { - R(*call)(const void *, A0, A1, A2, A3); - void (*move)(void *, const void *); - void (*dtor)(void *); - } *_ops; - - // Generate operations for function object - template <typename F> - void generate(const F &f) - { - static const ops ops = { - &Callback::function_call<F>, - &Callback::function_move<F>, - &Callback::function_dtor<F>, - }; - - MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F), - "Type F must not exceed the size of the Callback class"); - memset(this, 0, sizeof(Callback)); - new (this) F(f); - _ops = &ops; - } - - // Function attributes - template <typename F> - static R function_call(const void *p, A0 a0, A1 a1, A2 a2, A3 a3) - { - return (*(F *)p)(a0, a1, a2, a3); - } - - template <typename F> - static void function_move(void *d, const void *p) - { - new (d) F(*(F *)p); - } - - template <typename F> - static void function_dtor(void *p) - { - ((F *)p)->~F(); - } - - // Wrappers for functions with context - template <typename O, typename M> - struct method_context { - M method; - O *obj; - - method_context(O *obj, M method) - : method(method), obj(obj) {} - - R operator()(A0 a0, A1 a1, A2 a2, A3 a3) const - { - return (obj->*method)(a0, a1, a2, a3); - } - }; - - template <typename F, typename A> - struct function_context { - F func; - A *arg; - - function_context(F func, A *arg) - : func(func), arg(arg) {} - - R operator()(A0 a0, A1 a1, A2 a2, A3 a3) const - { - return func(arg, a0, a1, a2, a3); - } - }; -}; - -/** Callback class based on template specialization - * - * @note Synchronization level: Not protected - */ -template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4> -class Callback<R(A0, A1, A2, A3, A4)> { -public: - /** Create a Callback with a static function - * @param func Static function to attach - */ - Callback(R(*func)(A0, A1, A2, A3, A4) = 0) - { - if (!func) { - memset(this, 0, sizeof(Callback)); - } else { - generate(func); - } - } - - /** Attach a Callback - * @param func The Callback to attach - */ - Callback(const Callback<R(A0, A1, A2, A3, A4)> &func) - { - if (func._ops) { - func._ops->move(this, &func); - } - _ops = func._ops; - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(U *obj, R(T::*method)(A0, A1, A2, A3, A4)) - { - generate(method_context<T, R(T::*)(A0, A1, A2, A3, A4)>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(const U *obj, R(T::*method)(A0, A1, A2, A3, A4) const) - { - generate(method_context<const T, R(T::*)(A0, A1, A2, A3, A4) const>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(volatile U *obj, R(T::*method)(A0, A1, A2, A3, A4) volatile) - { - generate(method_context<volatile T, R(T::*)(A0, A1, A2, A3, A4) volatile>(obj, method)); - } - - /** Create a Callback with a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - */ - template<typename T, typename U> - Callback(const volatile U *obj, R(T::*method)(A0, A1, A2, A3, A4) const volatile) - { - generate(method_context<const volatile T, R(T::*)(A0, A1, A2, A3, A4) const volatile>(obj, method)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(T *, A0, A1, A2, A3, A4), U *arg) - { - generate(function_context<R(*)(T *, A0, A1, A2, A3, A4), T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(const T *, A0, A1, A2, A3, A4), const U *arg) - { - generate(function_context<R(*)(const T *, A0, A1, A2, A3, A4), const T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(volatile T *, A0, A1, A2, A3, A4), volatile U *arg) - { - generate(function_context<R(*)(volatile T *, A0, A1, A2, A3, A4), volatile T>(func, arg)); - } - - /** Create a Callback with a static function and bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - */ - template<typename T, typename U> - Callback(R(*func)(const volatile T *, A0, A1, A2, A3, A4), const volatile U *arg) - { - generate(function_context<R(*)(const volatile T *, A0, A1, A2, A3, A4), const volatile T>(func, arg)); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3, A4))) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3, A4) const)) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3, A4) volatile)) - { - generate(f); - } - - /** Create a Callback with a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - */ - template <typename F> - Callback(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3, A4) const volatile)) - { - generate(f); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(U *obj, R(*func)(T *, A0, A1, A2, A3, A4)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(const U *obj, R(*func)(const T *, A0, A1, A2, A3, A4)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(volatile U *obj, R(*func)(volatile T *, A0, A1, A2, A3, A4)) - { - new (this) Callback(func, obj); - } - - /** Create a Callback with a static function and bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to Callback(func, arg) - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to Callback(func, arg)") - Callback(const volatile U *obj, R(*func)(const volatile T *, A0, A1, A2, A3, A4)) - { - new (this) Callback(func, obj); - } - - /** Destroy a callback - */ - ~Callback() - { - if (_ops) { - _ops->dtor(this); - } - } - - /** Attach a static function - * @param func Static function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(A0, A1, A2, A3, A4)) - { - this->~Callback(); - new (this) Callback(func); - } - - /** Attach a Callback - * @param func The Callback to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const Callback<R(A0, A1, A2, A3, A4)> &func) - { - this->~Callback(); - new (this) Callback(func); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(U *obj, R(T::*method)(A0, A1, A2, A3, A4)) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const U *obj, R(T::*method)(A0, A1, A2, A3, A4) const) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(volatile U *obj, R(T::*method)(A0, A1, A2, A3, A4) volatile) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a member function - * @param obj Pointer to object to invoke member function on - * @param method Member function to attach - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template<typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const volatile U *obj, R(T::*method)(A0, A1, A2, A3, A4) const volatile) - { - this->~Callback(); - new (this) Callback(obj, method); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(T *, A0, A1, A2, A3, A4), U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(const T *, A0, A1, A2, A3, A4), const U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(volatile T *, A0, A1, A2, A3, A4), volatile U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a static function with a bound pointer - * @param func Static function to attach - * @param arg Pointer argument to function - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(R(*func)(const volatile T *, A0, A1, A2, A3, A4), const volatile U *arg) - { - this->~Callback(); - new (this) Callback(func, arg); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3, A4))) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3, A4) const)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3, A4) volatile)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a function object - * @param f Function object to attach - * @note The function object is limited to a single word of storage - * @deprecated - * Replaced by simple assignment 'Callback cb = func' - */ - template <typename F> - MBED_DEPRECATED_SINCE("mbed-os-5.4", - "Replaced by simple assignment 'Callback cb = func") - void attach(const volatile F f, MBED_ENABLE_IF_CALLBACK_COMPATIBLE(F, R(F::*)(A0, A1, A2, A3, A4) const volatile)) - { - this->~Callback(); - new (this) Callback(f); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(U *obj, R(*func)(T *, A0, A1, A2, A3, A4)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(const U *obj, R(*func)(const T *, A0, A1, A2, A3, A4)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(volatile U *obj, R(*func)(volatile T *, A0, A1, A2, A3, A4)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Attach a static function with a bound pointer - * @param obj Pointer to object to bind to function - * @param func Static function to attach - * @deprecated - * Arguments to callback have been reordered to attach(func, arg) - */ - template <typename T, typename U> - MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to attach(func, arg)") - void attach(const volatile U *obj, R(*func)(const volatile T *, A0, A1, A2, A3, A4)) - { - this->~Callback(); - new (this) Callback(func, obj); - } - - /** Assign a callback - */ - Callback &operator=(const Callback &that) - { - if (this != &that) { - this->~Callback(); - new (this) Callback(that); - } - - return *this; - } - - /** Call the attached function - */ - R call(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const - { - MBED_ASSERT(_ops); - return _ops->call(this, a0, a1, a2, a3, a4); - } - - /** Call the attached function - */ - R operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const - { - return call(a0, a1, a2, a3, a4); - } - - /** Test if function has been attached - */ - operator bool() const - { - return _ops; - } - - /** Test for equality - */ - friend bool operator==(const Callback &l, const Callback &r) - { - return memcmp(&l, &r, sizeof(Callback)) == 0; - } - - /** Test for inequality - */ - friend bool operator!=(const Callback &l, const Callback &r) - { - return !(l == r); - } - - /** Static thunk for passing as C-style function - * @param func Callback to call passed as void pointer - * @param a0 An argument to be called with function func - * @param a1 An argument to be called with function func - * @param a2 An argument to be called with function func - * @param a3 An argument to be called with function func - * @param a4 An argument to be called with function func - * @return the value as determined by func which is of - * type and determined by the signature of func - */ - static R thunk(void *func, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) - { - return static_cast<Callback *>(func)->call(a0, a1, a2, a3, a4); - } - -private: - // Stored as pointer to function and pointer to optional object - // Function pointer is stored as union of possible function types - // to guarantee proper size and alignment - struct _class; - union { - void (*_staticfunc)(A0, A1, A2, A3, A4); - void (*_boundfunc)(_class *, A0, A1, A2, A3, A4); - void (_class::*_methodfunc)(A0, A1, A2, A3, A4); - } _func; - void *_obj; - - // Dynamically dispatched operations - const struct ops { - R(*call)(const void *, A0, A1, A2, A3, A4); - void (*move)(void *, const void *); - void (*dtor)(void *); - } *_ops; - - // Generate operations for function object - template <typename F> - void generate(const F &f) - { - static const ops ops = { - &Callback::function_call<F>, - &Callback::function_move<F>, - &Callback::function_dtor<F>, - }; - - MBED_STATIC_ASSERT(sizeof(Callback) - sizeof(_ops) >= sizeof(F), - "Type F must not exceed the size of the Callback class"); - memset(this, 0, sizeof(Callback)); - new (this) F(f); - _ops = &ops; - } - - // Function attributes - template <typename F> - static R function_call(const void *p, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) - { - return (*(F *)p)(a0, a1, a2, a3, a4); - } - - template <typename F> - static void function_move(void *d, const void *p) - { - new (d) F(*(F *)p); - } - - template <typename F> - static void function_dtor(void *p) - { - ((F *)p)->~F(); - } - - // Wrappers for functions with context - template <typename O, typename M> - struct method_context { - M method; - O *obj; - - method_context(O *obj, M method) - : method(method), obj(obj) {} - - R operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const - { - return (obj->*method)(a0, a1, a2, a3, a4); - } - }; - - template <typename F, typename A> - struct function_context { - F func; - A *arg; - - function_context(F func, A *arg) - : func(func), arg(arg) {} - - R operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const - { - return func(arg, a0, a1, a2, a3, a4); - } - }; -}; - -// Internally used event type -typedef Callback<void(int)> event_callback_t; - - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @return Callback with inferred type - */ -template <typename R> -Callback<R()> callback(R(*func)() = 0) -{ - return Callback<R()>(func); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @return Callback with inferred type - */ -template <typename R> -Callback<R()> callback(const Callback<R()> &func) -{ - return Callback<R()>(func); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R> -Callback<R()> callback(U *obj, R(T::*method)()) -{ - return Callback<R()>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R> -Callback<R()> callback(const U *obj, R(T::*method)() const) -{ - return Callback<R()>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R> -Callback<R()> callback(volatile U *obj, R(T::*method)() volatile) -{ - return Callback<R()>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R> -Callback<R()> callback(const volatile U *obj, R(T::*method)() const volatile) -{ - return Callback<R()>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R> -Callback<R()> callback(R(*func)(T *), U *arg) -{ - return Callback<R()>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R> -Callback<R()> callback(R(*func)(const T *), const U *arg) -{ - return Callback<R()>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R> -Callback<R()> callback(R(*func)(volatile T *), volatile U *arg) -{ - return Callback<R()>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R> -Callback<R()> callback(R(*func)(const volatile T *), const volatile U *arg) -{ - return Callback<R()>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R()> callback(U *obj, R(*func)(T *)) -{ - return Callback<R()>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R()> callback(const U *obj, R(*func)(const T *)) -{ - return Callback<R()>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R()> callback(volatile U *obj, R(*func)(volatile T *)) -{ - return Callback<R()>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R()> callback(const volatile U *obj, R(*func)(const volatile T *)) -{ - return Callback<R()>(func, obj); -} - - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @return Callback with inferred type - */ -template <typename R, typename A0> -Callback<R(A0)> callback(R(*func)(A0) = 0) -{ - return Callback<R(A0)>(func); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @return Callback with inferred type - */ -template <typename R, typename A0> -Callback<R(A0)> callback(const Callback<R(A0)> &func) -{ - return Callback<R(A0)>(func); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0> -Callback<R(A0)> callback(U *obj, R(T::*method)(A0)) -{ - return Callback<R(A0)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0> -Callback<R(A0)> callback(const U *obj, R(T::*method)(A0) const) -{ - return Callback<R(A0)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0> -Callback<R(A0)> callback(volatile U *obj, R(T::*method)(A0) volatile) -{ - return Callback<R(A0)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0> -Callback<R(A0)> callback(const volatile U *obj, R(T::*method)(A0) const volatile) -{ - return Callback<R(A0)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0> -Callback<R(A0)> callback(R(*func)(T *, A0), U *arg) -{ - return Callback<R(A0)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0> -Callback<R(A0)> callback(R(*func)(const T *, A0), const U *arg) -{ - return Callback<R(A0)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0> -Callback<R(A0)> callback(R(*func)(volatile T *, A0), volatile U *arg) -{ - return Callback<R(A0)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0> -Callback<R(A0)> callback(R(*func)(const volatile T *, A0), const volatile U *arg) -{ - return Callback<R(A0)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0)> callback(U *obj, R(*func)(T *, A0)) -{ - return Callback<R(A0)>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0)> callback(const U *obj, R(*func)(const T *, A0)) -{ - return Callback<R(A0)>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0)> callback(volatile U *obj, R(*func)(volatile T *, A0)) -{ - return Callback<R(A0)>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0)> callback(const volatile U *obj, R(*func)(const volatile T *, A0)) -{ - return Callback<R(A0)>(func, obj); -} - - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @return Callback with inferred type - */ -template <typename R, typename A0, typename A1> -Callback<R(A0, A1)> callback(R(*func)(A0, A1) = 0) -{ - return Callback<R(A0, A1)>(func); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @return Callback with inferred type - */ -template <typename R, typename A0, typename A1> -Callback<R(A0, A1)> callback(const Callback<R(A0, A1)> &func) -{ - return Callback<R(A0, A1)>(func); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1> -Callback<R(A0, A1)> callback(U *obj, R(T::*method)(A0, A1)) -{ - return Callback<R(A0, A1)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1> -Callback<R(A0, A1)> callback(const U *obj, R(T::*method)(A0, A1) const) -{ - return Callback<R(A0, A1)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1> -Callback<R(A0, A1)> callback(volatile U *obj, R(T::*method)(A0, A1) volatile) -{ - return Callback<R(A0, A1)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1> -Callback<R(A0, A1)> callback(const volatile U *obj, R(T::*method)(A0, A1) const volatile) -{ - return Callback<R(A0, A1)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1> -Callback<R(A0, A1)> callback(R(*func)(T *, A0, A1), U *arg) -{ - return Callback<R(A0, A1)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1> -Callback<R(A0, A1)> callback(R(*func)(const T *, A0, A1), const U *arg) -{ - return Callback<R(A0, A1)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1> -Callback<R(A0, A1)> callback(R(*func)(volatile T *, A0, A1), volatile U *arg) -{ - return Callback<R(A0, A1)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1> -Callback<R(A0, A1)> callback(R(*func)(const volatile T *, A0, A1), const volatile U *arg) -{ - return Callback<R(A0, A1)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1)> callback(U *obj, R(*func)(T *, A0, A1)) -{ - return Callback<R(A0, A1)>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1)> callback(const U *obj, R(*func)(const T *, A0, A1)) -{ - return Callback<R(A0, A1)>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1)> callback(volatile U *obj, R(*func)(volatile T *, A0, A1)) -{ - return Callback<R(A0, A1)>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1)> callback(const volatile U *obj, R(*func)(const volatile T *, A0, A1)) -{ - return Callback<R(A0, A1)>(func, obj); -} - - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @return Callback with inferred type - */ -template <typename R, typename A0, typename A1, typename A2> -Callback<R(A0, A1, A2)> callback(R(*func)(A0, A1, A2) = 0) -{ - return Callback<R(A0, A1, A2)>(func); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @return Callback with inferred type - */ -template <typename R, typename A0, typename A1, typename A2> -Callback<R(A0, A1, A2)> callback(const Callback<R(A0, A1, A2)> &func) -{ - return Callback<R(A0, A1, A2)>(func); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1, typename A2> -Callback<R(A0, A1, A2)> callback(U *obj, R(T::*method)(A0, A1, A2)) -{ - return Callback<R(A0, A1, A2)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1, typename A2> -Callback<R(A0, A1, A2)> callback(const U *obj, R(T::*method)(A0, A1, A2) const) -{ - return Callback<R(A0, A1, A2)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1, typename A2> -Callback<R(A0, A1, A2)> callback(volatile U *obj, R(T::*method)(A0, A1, A2) volatile) -{ - return Callback<R(A0, A1, A2)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1, typename A2> -Callback<R(A0, A1, A2)> callback(const volatile U *obj, R(T::*method)(A0, A1, A2) const volatile) -{ - return Callback<R(A0, A1, A2)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2> -Callback<R(A0, A1, A2)> callback(R(*func)(T *, A0, A1, A2), U *arg) -{ - return Callback<R(A0, A1, A2)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2> -Callback<R(A0, A1, A2)> callback(R(*func)(const T *, A0, A1, A2), const U *arg) -{ - return Callback<R(A0, A1, A2)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2> -Callback<R(A0, A1, A2)> callback(R(*func)(volatile T *, A0, A1, A2), volatile U *arg) -{ - return Callback<R(A0, A1, A2)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2> -Callback<R(A0, A1, A2)> callback(R(*func)(const volatile T *, A0, A1, A2), const volatile U *arg) -{ - return Callback<R(A0, A1, A2)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1, A2)> callback(U *obj, R(*func)(T *, A0, A1, A2)) -{ - return Callback<R(A0, A1, A2)>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1, A2)> callback(const U *obj, R(*func)(const T *, A0, A1, A2)) -{ - return Callback<R(A0, A1, A2)>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1, A2)> callback(volatile U *obj, R(*func)(volatile T *, A0, A1, A2)) -{ - return Callback<R(A0, A1, A2)>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1, A2)> callback(const volatile U *obj, R(*func)(const volatile T *, A0, A1, A2)) -{ - return Callback<R(A0, A1, A2)>(func, obj); -} - - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @return Callback with inferred type - */ -template <typename R, typename A0, typename A1, typename A2, typename A3> -Callback<R(A0, A1, A2, A3)> callback(R(*func)(A0, A1, A2, A3) = 0) -{ - return Callback<R(A0, A1, A2, A3)>(func); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @return Callback with inferred type - */ -template <typename R, typename A0, typename A1, typename A2, typename A3> -Callback<R(A0, A1, A2, A3)> callback(const Callback<R(A0, A1, A2, A3)> &func) -{ - return Callback<R(A0, A1, A2, A3)>(func); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> -Callback<R(A0, A1, A2, A3)> callback(U *obj, R(T::*method)(A0, A1, A2, A3)) -{ - return Callback<R(A0, A1, A2, A3)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> -Callback<R(A0, A1, A2, A3)> callback(const U *obj, R(T::*method)(A0, A1, A2, A3) const) -{ - return Callback<R(A0, A1, A2, A3)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> -Callback<R(A0, A1, A2, A3)> callback(volatile U *obj, R(T::*method)(A0, A1, A2, A3) volatile) -{ - return Callback<R(A0, A1, A2, A3)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> -Callback<R(A0, A1, A2, A3)> callback(const volatile U *obj, R(T::*method)(A0, A1, A2, A3) const volatile) -{ - return Callback<R(A0, A1, A2, A3)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> -Callback<R(A0, A1, A2, A3)> callback(R(*func)(T *, A0, A1, A2, A3), U *arg) -{ - return Callback<R(A0, A1, A2, A3)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> -Callback<R(A0, A1, A2, A3)> callback(R(*func)(const T *, A0, A1, A2, A3), const U *arg) -{ - return Callback<R(A0, A1, A2, A3)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> -Callback<R(A0, A1, A2, A3)> callback(R(*func)(volatile T *, A0, A1, A2, A3), volatile U *arg) -{ - return Callback<R(A0, A1, A2, A3)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> -Callback<R(A0, A1, A2, A3)> callback(R(*func)(const volatile T *, A0, A1, A2, A3), const volatile U *arg) -{ - return Callback<R(A0, A1, A2, A3)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1, A2, A3)> callback(U *obj, R(*func)(T *, A0, A1, A2, A3)) -{ - return Callback<R(A0, A1, A2, A3)>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1, A2, A3)> callback(const U *obj, R(*func)(const T *, A0, A1, A2, A3)) -{ - return Callback<R(A0, A1, A2, A3)>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1, A2, A3)> callback(volatile U *obj, R(*func)(volatile T *, A0, A1, A2, A3)) -{ - return Callback<R(A0, A1, A2, A3)>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1, A2, A3)> callback(const volatile U *obj, R(*func)(const volatile T *, A0, A1, A2, A3)) -{ - return Callback<R(A0, A1, A2, A3)>(func, obj); -} - - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @return Callback with inferred type - */ -template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4> -Callback<R(A0, A1, A2, A3, A4)> callback(R(*func)(A0, A1, A2, A3, A4) = 0) -{ - return Callback<R(A0, A1, A2, A3, A4)>(func); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @return Callback with inferred type - */ -template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4> -Callback<R(A0, A1, A2, A3, A4)> callback(const Callback<R(A0, A1, A2, A3, A4)> &func) -{ - return Callback<R(A0, A1, A2, A3, A4)>(func); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> -Callback<R(A0, A1, A2, A3, A4)> callback(U *obj, R(T::*method)(A0, A1, A2, A3, A4)) -{ - return Callback<R(A0, A1, A2, A3, A4)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> -Callback<R(A0, A1, A2, A3, A4)> callback(const U *obj, R(T::*method)(A0, A1, A2, A3, A4) const) -{ - return Callback<R(A0, A1, A2, A3, A4)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> -Callback<R(A0, A1, A2, A3, A4)> callback(volatile U *obj, R(T::*method)(A0, A1, A2, A3, A4) volatile) -{ - return Callback<R(A0, A1, A2, A3, A4)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param method Member function to attach - * @return Callback with inferred type - */ -template<typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> -Callback<R(A0, A1, A2, A3, A4)> callback(const volatile U *obj, R(T::*method)(A0, A1, A2, A3, A4) const volatile) -{ - return Callback<R(A0, A1, A2, A3, A4)>(obj, method); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> -Callback<R(A0, A1, A2, A3, A4)> callback(R(*func)(T *, A0, A1, A2, A3, A4), U *arg) -{ - return Callback<R(A0, A1, A2, A3, A4)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> -Callback<R(A0, A1, A2, A3, A4)> callback(R(*func)(const T *, A0, A1, A2, A3, A4), const U *arg) -{ - return Callback<R(A0, A1, A2, A3, A4)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> -Callback<R(A0, A1, A2, A3, A4)> callback(R(*func)(volatile T *, A0, A1, A2, A3, A4), volatile U *arg) -{ - return Callback<R(A0, A1, A2, A3, A4)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param func Static function to attach - * @param arg Pointer argument to function - * @return Callback with inferred type - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> -Callback<R(A0, A1, A2, A3, A4)> callback(R(*func)(const volatile T *, A0, A1, A2, A3, A4), const volatile U *arg) -{ - return Callback<R(A0, A1, A2, A3, A4)>(func, arg); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1, A2, A3, A4)> callback(U *obj, R(*func)(T *, A0, A1, A2, A3, A4)) -{ - return Callback<R(A0, A1, A2, A3, A4)>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1, A2, A3, A4)> callback(const U *obj, R(*func)(const T *, A0, A1, A2, A3, A4)) -{ - return Callback<R(A0, A1, A2, A3, A4)>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1, A2, A3, A4)> callback(volatile U *obj, R(*func)(volatile T *, A0, A1, A2, A3, A4)) -{ - return Callback<R(A0, A1, A2, A3, A4)>(func, obj); -} - -/** Create a callback class with type inferred from the arguments - * - * @param obj Optional pointer to object to bind to function - * @param func Static function to attach - * @return Callback with inferred type - * @deprecated - * Arguments to callback have been reordered to callback(func, arg) - */ -template <typename T, typename U, typename R, typename A0, typename A1, typename A2, typename A3, typename A4> -MBED_DEPRECATED_SINCE("mbed-os-5.1", - "Arguments to callback have been reordered to callback(func, arg)") -Callback<R(A0, A1, A2, A3, A4)> callback(const volatile U *obj, R(*func)(const volatile T *, A0, A1, A2, A3, A4)) -{ - return Callback<R(A0, A1, A2, A3, A4)>(func, obj); -} - -/**@}*/ - -/**@}*/ - -} // namespace mbed - -#endif