Home | History | Annotate | Download | only in phonenumbers
      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 
     25 namespace i18n {
     26 namespace phonenumbers {
     27 
     28 template <typename R, typename A1, typename A2, typename A3, typename A4>
     29 class ResultCallback4 {
     30  public:
     31   virtual ~ResultCallback4() {}
     32   virtual R Run(A1 a1, A2 a2, A3 a3, A4 a4) = 0;
     33 };
     34 
     35 template <typename R, typename A1, typename A2, typename A3, typename A4>
     36 class 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 
     51 template <typename T, typename R, typename A1, typename A2, typename A3,
     52           typename A4>
     53 class 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 
     71 template <typename R, typename A1, typename A2, typename A3, typename A4>
     72 ResultCallback4<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 
     77 template <typename T, typename R, typename A1, typename A2, typename A3,
     78           typename A4>
     79 ResultCallback4<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