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