/****************************************************************************** * Copyright (c) 2018(-2023) STMicroelectronics. * All rights reserved. * * This file is part of the TouchGFX 4.22.0 distribution. * * This software is licensed under terms that can be found in the LICENSE file in * the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * *******************************************************************************/ /** * @file touchgfx/Callback.hpp * * Declares the touchgfx::GenericCallback and touchgfx::Callback classes. */ #ifndef TOUCHGFX_CALLBACK_HPP #define TOUCHGFX_CALLBACK_HPP namespace touchgfx { /** * GenericCallback is the base class for callbacks. * * The reason this base class exists, is that a normal Callback requires the class type * where the callback function resides to be known. This is problematic for ie. * framework widgets like AbstractButton, on which it should be possible to register a * callback on object types that are user-specific and thus unknown to AbstractButton. * This is solved by having AbstractButton contain a pointer to a GenericCallback * instead. This pointer must then be initialized to point on an instance of Callback, * created by the user, which is initialized with the appropriate object type. * * @tparam T1 The type of the first argument in the member function, or void if none. * @tparam T2 The type of the second argument in the member function, or void if none. * @tparam T3 The type of the third argument in the member function, or void if none. * * @see Callback * * @note As with Callback, this class exists in four versions to support callback functions * taking zero, one, two or three arguments. */ template class GenericCallback { public: /** Finalizes an instance of the GenericCallback class. */ virtual ~GenericCallback() { } /** * Calls the member function. Do not call execute unless isValid() returns true (ie. a * pointer to the object and the function has been set). * * @param val1 This value will be passed as the first argument in the function call. * @param val2 This value will be passed as the second argument in the function call. * @param val3 This value will be passed as the third argument in the function call. */ virtual void execute(T1 val1, T2 val2, T3 val3) = 0; /** * Function to check whether the Callback has been initialized with values. * * @return true If the callback is valid (i.e. safe to call execute). */ virtual bool isValid() const = 0; }; /** * GenericCallback is the base class for callbacks. * * The reason this base class exists, is that a normal Callback requires the class type * where the callback function resides to be known. This is problematic for ie. * framework widgets like AbstractButton, on which it should be possible to register a * callback on object types that are user-specific and thus unknown to AbstractButton. * This is solved by having AbstractButton contain a pointer to a GenericCallback * instead. This pointer must then be initialized to point on an instance of Callback, * created by the user, which is initialized with the appropriate object type. * * @tparam T1 The type of the first argument in the member function, or void if none. * @tparam T2 The type of the second argument in the member function, or void if none. * * @see Callback * * @note As with Callback, this class exists in four versions to support callback functions * taking zero, one, two or three arguments. */ template class GenericCallback { public: /** Finalizes an instance of the void> class. */ virtual ~GenericCallback() { } /** * Calls the member function. Do not call execute unless isValid() returns true (ie. a * pointer to the object and the function has been set). * * @param val1 This value will be passed as the first argument in the function call. * @param val2 This value will be passed as the second argument in the function call. */ virtual void execute(T1 val1, T2 val2) = 0; /** * Function to check whether the Callback has been initialized with values. * * @return true If the callback is valid (i.e. safe to call execute). */ virtual bool isValid() const = 0; }; /** * GenericCallback is the base class for callbacks. * * The reason this base class exists, is that a normal Callback requires the class type * where the callback function resides to be known. This is problematic for ie. * framework widgets like AbstractButton, on which it should be possible to register a * callback on object types that are user-specific and thus unknown to AbstractButton. * This is solved by having AbstractButton contain a pointer to a GenericCallback * instead. This pointer must then be initialized to point on an instance of Callback, * created by the user, which is initialized with the appropriate object type. * * @tparam T1 The type of the first argument in the member function, or void if none. * * @see Callback * * @note As with Callback, this class exists in four versions to support callback functions * taking zero, one, two or three arguments. */ template class GenericCallback { public: /** Finalizes an instance of the void> class. */ virtual ~GenericCallback() { } /** * Calls the member function. Do not call execute unless isValid() returns true (ie. a * pointer to the object and the function has been set). * * @param val1 This value will be passed as the first argument in the function call. */ virtual void execute(T1 val1) = 0; /** * Function to check whether the Callback has been initialized with values. * * @return true If the callback is valid (i.e. safe to call execute). */ virtual bool isValid() const = 0; }; /** * GenericCallback is the base class for callbacks. * * The reason this base class exists, is that a normal Callback requires the class type * where the callback function resides to be known. This is problematic for ie. * framework widgets like AbstractButton, on which it should be possible to register a * callback on object types that are user-specific and thus unknown to AbstractButton. * This is solved by having AbstractButton contain a pointer to a GenericCallback * instead. This pointer must then be initialized to point on an instance of Callback, * created by the user, which is initialized with the appropriate object type. * * @see Callback * * @note As with Callback, this class exists in four versions to support callback functions * taking zero, one, two or three arguments. */ template <> class GenericCallback { public: /** Finalizes an instance of the GenericCallback class. */ virtual ~GenericCallback() { } /** * Calls the member function. Do not call execute unless isValid() returns true (ie. a * pointer to the object and the function has been set). */ virtual void execute() = 0; /** * Function to check whether the Callback has been initialized with values. * * @return true If the callback is valid (i.e. safe to call execute). */ virtual bool isValid() const = 0; }; /** * A Callback is basically a wrapper of a pointer-to-member-function. * * It is used for registering callbacks between widgets. For instance, a Button can be * configured to call a member function when it is clicked. * * The class is templated in order to provide the class type of the object in which the * member function resides, and the argument types of the function to call. * * The Callback class exists in four versions, for supporting member functions with 0, * 1, 2 or 3 arguments. The compiler will infer which type to use automatically. * * @tparam dest_type The type of the class in which the member function resides. * @tparam T1 The type of the first argument in the member function, or void if none. * @tparam T2 The type of the second argument in the member function, or void if none. * @tparam T3 The type of the third argument in the member function, or void if none. * * @note The member function to call must return void. The function can have zero, one, two or * three arguments of any type. */ template struct Callback : public GenericCallback { /** Initializes a new instance of the Callback class. */ Callback() : pobject(0), pmemfun(0) { } /** * Initializes a Callback with an object and a pointer to the member function in that object to * call. * * Initializes a Callback with an object and a pointer to the member function in that object to * call. * * @param [in] pObject Pointer to the object on which the function should be called. * @param [in] pmemfun_3 Address of member function. This is the version where function takes * three arguments. */ Callback(dest_type* pObject, void (dest_type::*pmemfun_3)(T1, T2, T3)) : pobject(pObject), pmemfun(pmemfun_3) { } /** * Calls the member function. Do not call execute unless isValid() returns true (ie. a * pointer to the object and the function has been set). * * @param t1 This value will be passed as the first argument in the function call. * @param t2 This value will be passed as the second argument in the function call. * @param t3 This value will be passed as the third argument in the function call. */ virtual void execute(T1 t1, T2 t2, T3 t3) { (pobject->*pmemfun)(t1, t2, t3); } /** * Function to check whether the Callback has been initialized with values. * * @return true If the callback is valid (i.e. safe to call execute). */ virtual bool isValid() const { return (pobject != 0) && (pmemfun != 0); } private: dest_type* pobject; void (dest_type::*pmemfun)(T1, T2, T3); }; /** * A Callback is basically a wrapper of a pointer-to-member-function. * * It is used for registering callbacks between widgets. For instance, a Button can be * configured to call a member function when it is clicked. * * The class is templated in order to provide the class type of the object in which the * member function resides, and the argument types of the function to call. * * The Callback class exists in four versions, for supporting member functions with 0, 1, * 2 or 3 arguments. The compiler will infer which type to use automatically. * * @tparam dest_type The type of the class in which the member function resides. * @tparam T1 The type of the first argument in the member function, or void if none. * @tparam T2 The type of the second argument in the member function, or void if none. * * @note The member function to call must return void. The function can have zero, one, two or * three arguments of any type. */ template struct Callback : public GenericCallback { /** Initializes a new instance of the Callback class. */ Callback() : pobject(0), pmemfun(0) { } /** * Initializes a Callback with an object and a pointer to the member function in that object to * call. * * @param [in] pObject Pointer to the object on which the function should be called. * @param [in] pmemfun_2 Address of member function. This is the version where function takes two * arguments. */ Callback(dest_type* pObject, void (dest_type::*pmemfun_2)(T1, T2)) : pobject(pObject), pmemfun(pmemfun_2) { } /** * Calls the member function. Do not call execute unless isValid() returns true (ie. a * pointer to the object and the function has been set). * * @param t1 This value will be passed as the first argument in the function call. * @param t2 This value will be passed as the second argument in the function call. */ virtual void execute(T1 t1, T2 t2) { (pobject->*pmemfun)(t1, t2); } /** * Function to check whether the Callback has been initialized with values. * * @return true If the callback is valid (i.e. safe to call execute). */ virtual bool isValid() const { return (pobject != 0) && (pmemfun != 0); } private: dest_type* pobject; void (dest_type::*pmemfun)(T1, T2); }; /** * A Callback is basically a wrapper of a pointer-to-member-function. * * It is used for registering callbacks between widgets. For instance, a Button can be * configured to call a member function when it is clicked. * * The class is templated in order to provide the class type of the object in which the * member function resides, and the argument types of the function to call. * * The Callback class exists in four versions, for supporting member functions with 0, 1, * 2 or 3 arguments. The compiler will infer which type to use automatically. * * @tparam dest_type The type of the class in which the member function resides. * @tparam T1 The type of the first argument in the member function, or void if none. * * @note The member function to call must return void. The function can have zero, one, two or * three arguments of any type. */ template struct Callback : public GenericCallback { /** Initializes a new instance of the Callback class. */ Callback() : pobject(0), pmemfun(0) { } /** * Initializes a Callback with an object and a pointer to the member function in that object to * call. * * @param [in] pObject Pointer to the object on which the function should be called. * @param [in] pmemfun_1 Address of member function. This is the version where function takes one * argument. */ Callback(dest_type* pObject, void (dest_type::*pmemfun_1)(T1)) : pobject(pObject), pmemfun(pmemfun_1) { } /** * Calls the member function. Do not call execute unless isValid() returns true (ie. a * pointer to the object and the function has been set). * * @param t1 This value will be passed as the first argument in the function call. * * @see isValid */ virtual void execute(T1 t1) { (pobject->*pmemfun)(t1); } /** * Query if this object is valid. * * @return true if valid, false if not. */ virtual bool isValid() const { return (pobject != 0) && (pmemfun != 0); } private: dest_type* pobject; void (dest_type::*pmemfun)(T1); }; /** * A Callback is basically a wrapper of a pointer-to-member-function. * * It is used for registering callbacks between widgets. For instance, a Button can be * configured to call a member function when it is clicked. * * The class is templated in order to provide the class type of the object in which the * member function resides, and the argument types of the function to call. * * The Callback class exists in four versions, for supporting member functions with 0, 1, * 2 or 3 arguments. The compiler will infer which type to use automatically. * * @tparam dest_type The type of the class in which the member function resides. * * @note The member function to call must return void. The function can have zero, one, two or * three arguments of any type. */ template struct Callback : public GenericCallback<> { /** Initializes a new instance of the Callback class. */ Callback() : pobject(0), pmemfun(0) { } /** * Initializes a Callback with an object and a pointer to the member function in that object to * call. * * @param [in] pObject Pointer to the object on which the function should be called. * @param [in] pmemfun_0 Address of member function. This is the version where function takes zero * arguments. */ Callback(dest_type* pObject, void (dest_type::*pmemfun_0)()) : pobject(pObject), pmemfun(pmemfun_0) { } /** * Calls the member function. Do not call execute unless isValid() returns true (ie. a * pointer to the object and the function has been set). */ virtual void execute() { (pobject->*pmemfun)(); } /** * Function to check whether the Callback has been initialized with values. * * @return true If the callback is valid (i.e. safe to call execute). */ virtual bool isValid() const { return (pobject != 0) && (pmemfun != 0); } private: dest_type* pobject; void (dest_type::*pmemfun)(); }; } // namespace touchgfx #endif // TOUCHGFX_CALLBACK_HPP