16b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org// Copyright (C) 2013 Google Inc.
26b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//
36b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org// Licensed under the Apache License, Version 2.0 (the "License");
46b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org// you may not use this file except in compliance with the License.
56b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org// You may obtain a copy of the License at
66b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//
76b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org// http://www.apache.org/licenses/LICENSE-2.0
86b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//
96b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org// Unless required by applicable law or agreed to in writing, software
106b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org// distributed under the License is distributed on an "AS IS" BASIS,
116b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org// See the License for the specific language governing permissions and
136b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org// limitations under the License.
146b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//
156b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org// An object to store a pointer to a method in an object with the following
166b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org// signature:
176b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//
188c9b0e35847b85f4cc7434058e4e4ec5d5560c40roubert@google.com//    void Observer::ObserveEvent(bool success, Key key, Data data);
196b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org
206b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org#ifndef I18N_ADDRESSINPUT_CALLBACK_H_
216b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org#define I18N_ADDRESSINPUT_CALLBACK_H_
226b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org
236b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org#include <cassert>
246b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org#include <cstddef>
256b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org
266b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.orgnamespace i18n {
276b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.orgnamespace addressinput {
286b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org
296b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org// Stores a pointer to a method in an object. Sample usage:
306b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//    class MyClass {
316b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//     public:
328c9b0e35847b85f4cc7434058e4e4ec5d5560c40roubert@google.com//      typedef Callback<const MyType&, const MyDataType&> MyCallback;
336769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org//
346b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//      void GetDataAsynchronously() {
356769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org//        scoped_ptr<MyCallback> callback(BuildCallback(
366769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org//            this, &MyClass::OnDataReady));
376b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//        bool success = ...
386b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//        MyKeyType key = ...
396b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//        MyDataType data = ...
406769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org//        (*callback)(success, key, data);
416b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//      }
426b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//
436769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org//      void OnDataReady(bool success,
446769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org//                       const MyKeyType& key,
456769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org//                       const MyDataType& data) {
466b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//        ...
476b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//      }
486b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org//    };
496769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.orgtemplate <typename Key, typename Data>
506b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.orgclass Callback {
516b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org public:
526769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org  virtual ~Callback() {}
538c9b0e35847b85f4cc7434058e4e4ec5d5560c40roubert@google.com  virtual void operator()(bool success, Key key, Data data) const = 0;
546769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org};
556769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org
566769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.orgnamespace {
576769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org
586769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.orgtemplate <typename Observer, typename Key, typename Data>
596769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.orgclass CallbackImpl : public Callback<Key, Data> {
606769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org public:
618c9b0e35847b85f4cc7434058e4e4ec5d5560c40roubert@google.com  typedef void (Observer::*ObserveEvent)(bool, Key, Data);
626b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org
636769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org  CallbackImpl(Observer* observer, ObserveEvent observe_event)
646b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org      : observer_(observer),
656b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org        observe_event_(observe_event) {
666b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org    assert(observer_ != NULL);
676b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org    assert(observe_event_ != NULL);
686b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org  }
696b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org
706769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org  virtual ~CallbackImpl() {}
716b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org
728c9b0e35847b85f4cc7434058e4e4ec5d5560c40roubert@google.com  virtual void operator()(bool success, Key key, Data data) const {
736b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org    (observer_->*observe_event_)(success, key, data);
746b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org  }
756b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org
766b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org private:
776b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org  Observer* observer_;
786b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org  ObserveEvent observe_event_;
796b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org};
806b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org
816769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org}  // namespace
826769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org
836769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org// Returns a callback to |observer->observe_event| method. The caller owns the
846769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org// result.
856769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.orgtemplate <typename Observer, typename Key, typename Data>
866769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.orgCallback<Key, Data>* BuildCallback(
876769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org    Observer* observer,
888c9b0e35847b85f4cc7434058e4e4ec5d5560c40roubert@google.com    void (Observer::*observe_event)(bool, Key, Data)) {
896769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org  return new CallbackImpl<Observer, Key, Data>(observer, observe_event);
906769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org}
916769e09a2e663b157f9270c41ba282510f09bbb6rouslan@chromium.org
926b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org}  // namespace addressinput
936b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org}  // namespace i18n
946b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org
956b9fee1720438cf2a7bee2f2112f672fae24dc36rouslan@chromium.org#endif  // I18N_ADDRESSINPUT_CALLBACK_H_
96