diff options
Diffstat (limited to 'callback.h')
-rw-r--r-- | callback.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/callback.h b/callback.h new file mode 100644 index 0000000..487fd40 --- /dev/null +++ b/callback.h @@ -0,0 +1,88 @@ +// Copyright (C) 2012 The Libphonenumber Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Author: Philippe Liard. +// +// Light implementation emulating base/callback.h. This is an internal header, +// users should not depend on it. +// Note that this implementation is very limited for now and +// libphonenumber-specific. + +#ifndef I18N_PHONENUMBERS_CALLBACK_H_ +#define I18N_PHONENUMBERS_CALLBACK_H_ + +namespace i18n { +namespace phonenumbers { + +template <typename R, typename A1, typename A2, typename A3, typename A4> +class ResultCallback4 { + public: + virtual ~ResultCallback4() {} + virtual R Run(A1 a1, A2 a2, A3 a3, A4 a4) = 0; +}; + +template <typename R, typename A1, typename A2, typename A3, typename A4> +class FunctionCallback4 : public ResultCallback4<R, A1, A2, A3, A4> { + public: + typedef R (FunctionType)(A1, A2, A3, A4); + + explicit FunctionCallback4(FunctionType* function) : function_(function) {} + virtual ~FunctionCallback4() {} + + virtual R Run(A1 a1, A2 a2, A3 a3, A4 a4) { + return function_(a1, a2, a3, a4); + } + + private: + FunctionType* const function_; +}; + +template <typename T, typename R, typename A1, typename A2, typename A3, + typename A4> +class ConstMethodCallback4 : public ResultCallback4<R, A1, A2, A3, A4> { + public: + typedef R (T::*MethodType)(A1, A2, A3, A4) const; + + ConstMethodCallback4(const T* instance, MethodType method) + : instance_(instance), + method_(method) {} + virtual ~ConstMethodCallback4() {} + + virtual R Run(A1 a1, A2 a2, A3 a3, A4 a4) { + return (instance_->*method_)(a1, a2, a3, a4); + } + + private: + const T* const instance_; + MethodType const method_; +}; + +template <typename R, typename A1, typename A2, typename A3, typename A4> +ResultCallback4<R, A1, A2, A3, A4>* NewPermanentCallback( + R (*function)(A1, A2, A3, A4)) { + return new FunctionCallback4<R, A1, A2, A3, A4>(function); +} + +template <typename T, typename R, typename A1, typename A2, typename A3, + typename A4> +ResultCallback4<R, A1, A2, A3, A4>* NewPermanentCallback( + const T* instance, + R (T::*method)(A1, A2, A3, A4) const) { + return new ConstMethodCallback4<T, R, A1, A2, A3, A4>(instance, method); +} + +} // namespace phonenumbers +} // namespace i18n + +#endif // I18N_PHONENUMBERS_CALLBACK_H_ |