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