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