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