1// Copyright (C) 2012 The Libphonenumber Authors 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14// 15// Author: Philippe Liard. 16// 17// Light implementation emulating base/callback.h. This is an internal header, 18// users should not depend on it. 19// Note that this implementation is very limited for now and 20// libphonenumber-specific. 21 22#ifndef I18N_PHONENUMBERS_CALLBACK_H_ 23#define I18N_PHONENUMBERS_CALLBACK_H_ 24 25namespace i18n { 26namespace phonenumbers { 27 28template <typename R, typename A1, typename A2, typename A3, typename A4> 29class ResultCallback4 { 30 public: 31 virtual ~ResultCallback4() {} 32 virtual R Run(A1 a1, A2 a2, A3 a3, A4 a4) = 0; 33}; 34 35template <typename R, typename A1, typename A2, typename A3, typename A4> 36class FunctionCallback4 : public ResultCallback4<R, A1, A2, A3, A4> { 37 public: 38 typedef R (FunctionType)(A1, A2, A3, A4); 39 40 explicit FunctionCallback4(FunctionType* function) : function_(function) {} 41 virtual ~FunctionCallback4() {} 42 43 virtual R Run(A1 a1, A2 a2, A3 a3, A4 a4) { 44 return function_(a1, a2, a3, a4); 45 } 46 47 private: 48 FunctionType* const function_; 49}; 50 51template <typename T, typename R, typename A1, typename A2, typename A3, 52 typename A4> 53class ConstMethodCallback4 : public ResultCallback4<R, A1, A2, A3, A4> { 54 public: 55 typedef R (T::*MethodType)(A1, A2, A3, A4) const; 56 57 ConstMethodCallback4(const T* instance, MethodType method) 58 : instance_(instance), 59 method_(method) {} 60 virtual ~ConstMethodCallback4() {} 61 62 virtual R Run(A1 a1, A2 a2, A3 a3, A4 a4) { 63 return (instance_->*method_)(a1, a2, a3, a4); 64 } 65 66 private: 67 const T* const instance_; 68 MethodType const method_; 69}; 70 71template <typename R, typename A1, typename A2, typename A3, typename A4> 72ResultCallback4<R, A1, A2, A3, A4>* NewPermanentCallback( 73 R (*function)(A1, A2, A3, A4)) { 74 return new FunctionCallback4<R, A1, A2, A3, A4>(function); 75} 76 77template <typename T, typename R, typename A1, typename A2, typename A3, 78 typename A4> 79ResultCallback4<R, A1, A2, A3, A4>* NewPermanentCallback( 80 const T* instance, 81 R (T::*method)(A1, A2, A3, A4) const) { 82 return new ConstMethodCallback4<T, R, A1, A2, A3, A4>(instance, method); 83} 84 85} // namespace phonenumbers 86} // namespace i18n 87 88#endif // I18N_PHONENUMBERS_CALLBACK_H_ 89