summaryrefslogtreecommitdiff
path: root/callback.h
diff options
context:
space:
mode:
Diffstat (limited to 'callback.h')
-rw-r--r--callback.h88
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_