1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#ifndef EVENT_BASE_UTILS_H 17094332d3Sopenharmony_ci#define EVENT_BASE_UTILS_H 18094332d3Sopenharmony_ci 19094332d3Sopenharmony_ci#include <cstdio> 20094332d3Sopenharmony_ci#include <stdarg.h> 21094332d3Sopenharmony_ci#include <iostream> 22094332d3Sopenharmony_ci#include <unistd.h> 23094332d3Sopenharmony_ci#include <memory> 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_ciclass Event { 26094332d3Sopenharmony_ci}; 27094332d3Sopenharmony_ci 28094332d3Sopenharmony_citemplate<typename T, typename... Args> 29094332d3Sopenharmony_ciclass EventBase { 30094332d3Sopenharmony_citypedef T (Event::*pMemFunc)(T arg, Args... args); 31094332d3Sopenharmony_cipublic: 32094332d3Sopenharmony_ci EventBase() 33094332d3Sopenharmony_ci { 34094332d3Sopenharmony_ci m_obj = NULL; 35094332d3Sopenharmony_ci m_func = NULL; 36094332d3Sopenharmony_ci } 37094332d3Sopenharmony_ci 38094332d3Sopenharmony_ci template<class _func_type> 39094332d3Sopenharmony_ci void Associate(Event* obj, _func_type func) 40094332d3Sopenharmony_ci { 41094332d3Sopenharmony_ci m_obj = obj; 42094332d3Sopenharmony_ci m_func = static_cast<pMemFunc>(func); 43094332d3Sopenharmony_ci } 44094332d3Sopenharmony_ci template<class _func_type> 45094332d3Sopenharmony_ci void DisAssociate(Event* obj, _func_type func) 46094332d3Sopenharmony_ci { 47094332d3Sopenharmony_ci if (obj != m_obj) { 48094332d3Sopenharmony_ci return; 49094332d3Sopenharmony_ci } 50094332d3Sopenharmony_ci m_func = NULL; 51094332d3Sopenharmony_ci } 52094332d3Sopenharmony_ci 53094332d3Sopenharmony_ci void SendEvent(T arg, Args... args) 54094332d3Sopenharmony_ci { 55094332d3Sopenharmony_ci (m_obj->*pMemFunc(m_func))(arg, args...); 56094332d3Sopenharmony_ci } 57094332d3Sopenharmony_ci 58094332d3Sopenharmony_ciprivate: 59094332d3Sopenharmony_ci Event* m_obj; 60094332d3Sopenharmony_ci pMemFunc m_func; 61094332d3Sopenharmony_ci}; 62094332d3Sopenharmony_ci 63094332d3Sopenharmony_ci/*************************event array**************************************/ 64094332d3Sopenharmony_citemplate<typename T, typename... Args> 65094332d3Sopenharmony_ciclass EventBaseArray { 66094332d3Sopenharmony_ci#define EVENT_LIST_MAX_NUM (10) 67094332d3Sopenharmony_citypedef T (Event::*pMemFunc)(T arg, Args... args); 68094332d3Sopenharmony_cipublic: 69094332d3Sopenharmony_ci EventBaseArray() 70094332d3Sopenharmony_ci { 71094332d3Sopenharmony_ci m_totalFunc = 0; 72094332d3Sopenharmony_ci m_obj = NULL; 73094332d3Sopenharmony_ci for (int i = 0; i < EVENT_LIST_MAX_NUM; i++) { 74094332d3Sopenharmony_ci m_func[i] = NULL; 75094332d3Sopenharmony_ci } 76094332d3Sopenharmony_ci } 77094332d3Sopenharmony_ci 78094332d3Sopenharmony_ci template<class _func_type> 79094332d3Sopenharmony_ci void Associate(Event* obj, _func_type func) 80094332d3Sopenharmony_ci { 81094332d3Sopenharmony_ci m_obj = obj; 82094332d3Sopenharmony_ci m_func[m_totalFunc] = static_cast<pMemFunc>(func); 83094332d3Sopenharmony_ci m_totalFunc++; 84094332d3Sopenharmony_ci } 85094332d3Sopenharmony_ci 86094332d3Sopenharmony_ci template<class _func_type> 87094332d3Sopenharmony_ci void DisAssociate(Event* obj, _func_type func) 88094332d3Sopenharmony_ci { 89094332d3Sopenharmony_ci if (obj != m_obj) { 90094332d3Sopenharmony_ci return; 91094332d3Sopenharmony_ci } 92094332d3Sopenharmony_ci int i; 93094332d3Sopenharmony_ci for (i = 0; i < m_totalFunc; i++) { 94094332d3Sopenharmony_ci if (m_func[i] == func) { 95094332d3Sopenharmony_ci break; 96094332d3Sopenharmony_ci } 97094332d3Sopenharmony_ci } 98094332d3Sopenharmony_ci for (i = 0; i < m_totalFunc - 1; i++) { 99094332d3Sopenharmony_ci m_func[i] = m_func[i + 1]; 100094332d3Sopenharmony_ci } 101094332d3Sopenharmony_ci 102094332d3Sopenharmony_ci m_func[i] = NULL; 103094332d3Sopenharmony_ci m_totalFunc--; 104094332d3Sopenharmony_ci } 105094332d3Sopenharmony_ci 106094332d3Sopenharmony_ci void SendEvent(T arg, Args... args) 107094332d3Sopenharmony_ci { 108094332d3Sopenharmony_ci for (int i = 0; i < m_totalFunc; i++) { 109094332d3Sopenharmony_ci if (m_func[i] != NULL) { 110094332d3Sopenharmony_ci ((m_obj->*pMemFunc(m_func[i])))(arg, args...); 111094332d3Sopenharmony_ci } 112094332d3Sopenharmony_ci } 113094332d3Sopenharmony_ci } 114094332d3Sopenharmony_ci 115094332d3Sopenharmony_ciprivate: 116094332d3Sopenharmony_ci Event* m_obj; 117094332d3Sopenharmony_ci pMemFunc m_func[EVENT_LIST_MAX_NUM]; 118094332d3Sopenharmony_ci int m_totalFunc; 119094332d3Sopenharmony_ci}; 120094332d3Sopenharmony_ci#endif 121