core: service: Add FunctionInfoTyped to allow expanding existing interfaces
This commit is contained in:
		| @@ -142,7 +142,8 @@ template <typename Self> | ||||
| class ServiceFramework : public ServiceFrameworkBase { | ||||
| protected: | ||||
|     /// Contains information about a request type which is handled by the service. | ||||
|     struct FunctionInfo : FunctionInfoBase { | ||||
|     template <typename T> | ||||
|     struct FunctionInfoTyped : FunctionInfoBase { | ||||
|         // TODO(yuriks): This function could be constexpr, but clang is the only compiler that | ||||
|         // doesn't emit an ICE or a wrong diagnostic because of the static_cast. | ||||
|  | ||||
| @@ -155,12 +156,13 @@ protected: | ||||
|          *     the request | ||||
|          * @param name_ human-friendly name for the request. Used mostly for logging purposes. | ||||
|          */ | ||||
|         FunctionInfo(u32 expected_header_, HandlerFnP<Self> handler_callback_, const char* name_) | ||||
|         FunctionInfoTyped(u32 expected_header_, HandlerFnP<T> handler_callback_, const char* name_) | ||||
|             : FunctionInfoBase{ | ||||
|                   expected_header_, | ||||
|                   // Type-erase member function pointer by casting it down to the base class. | ||||
|                   static_cast<HandlerFnP<ServiceFrameworkBase>>(handler_callback_), name_} {} | ||||
|     }; | ||||
|     using FunctionInfo = FunctionInfoTyped<Self>; | ||||
|  | ||||
|     /** | ||||
|      * Initializes the handler with no functions installed. | ||||
| @@ -175,8 +177,8 @@ protected: | ||||
|         : ServiceFrameworkBase(system_, service_name_, max_sessions_, Invoker) {} | ||||
|  | ||||
|     /// Registers handlers in the service. | ||||
|     template <std::size_t N> | ||||
|     void RegisterHandlers(const FunctionInfo (&functions)[N]) { | ||||
|     template <typename T = Self, std::size_t N> | ||||
|     void RegisterHandlers(const FunctionInfoTyped<T> (&functions)[N]) { | ||||
|         RegisterHandlers(functions, N); | ||||
|     } | ||||
|  | ||||
| @@ -184,13 +186,14 @@ protected: | ||||
|      * Registers handlers in the service. Usually prefer using the other RegisterHandlers | ||||
|      * overload in order to avoid needing to specify the array size. | ||||
|      */ | ||||
|     void RegisterHandlers(const FunctionInfo* functions, std::size_t n) { | ||||
|     template <typename T = Self> | ||||
|     void RegisterHandlers(const FunctionInfoTyped<T>* functions, std::size_t n) { | ||||
|         RegisterHandlersBase(functions, n); | ||||
|     } | ||||
|  | ||||
|     /// Registers handlers in the service. | ||||
|     template <std::size_t N> | ||||
|     void RegisterHandlersTipc(const FunctionInfo (&functions)[N]) { | ||||
|     template <typename T = Self, std::size_t N> | ||||
|     void RegisterHandlersTipc(const FunctionInfoTyped<T> (&functions)[N]) { | ||||
|         RegisterHandlersTipc(functions, N); | ||||
|     } | ||||
|  | ||||
| @@ -198,7 +201,8 @@ protected: | ||||
|      * Registers handlers in the service. Usually prefer using the other RegisterHandlers | ||||
|      * overload in order to avoid needing to specify the array size. | ||||
|      */ | ||||
|     void RegisterHandlersTipc(const FunctionInfo* functions, std::size_t n) { | ||||
|     template <typename T = Self> | ||||
|     void RegisterHandlersTipc(const FunctionInfoTyped<T>* functions, std::size_t n) { | ||||
|         RegisterHandlersBaseTipc(functions, n); | ||||
|     } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 german77
					german77