15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GOOGLE_CACHEINVALIDATION_DEPS_CALLBACK_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GOOGLE_CACHEINVALIDATION_DEPS_CALLBACK_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind_helpers.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define INVALIDATION_CALLBACK1_TYPE(Arg1) ::base::Callback<void(Arg1)>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Below are a collection of types and functions that adapt base::Callback's
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pass-by-value semantics to the pointer-based callback system that
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cacheinvalidation needs.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace invalidation {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef ::base::Closure Closure;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsCallbackRepeatable(const T* callback) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The default cacheinvalidation Callbacks may be self-deleting. We don't
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // support this behave, so we already return true to indicate that the
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cacheinvalidation implementation should delete our Callbacks.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Identity<T>::type is a typedef of T. Useful for preventing the
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compiler from inferring the type of an argument in templates.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T>
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Identity {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef T type;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The cacheinvalidation callback system expects to take the callback by
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pointer and handle the ownership semantics itself.  Adapting the
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Chromium Callback system requires returning a dynamically allocated
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copy of the result of Bind().
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Closure* NewPermanentCallback(void (*fn)()) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new ::base::Closure(::base::Bind(fn));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T1, class T2>
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Closure* NewPermanentCallback(
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T1* object, void (T2::*method)()) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new ::base::Closure(::base::Bind(method, base::Unretained(object)));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T1, class T2, typename Arg1>
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)::base::Callback<void(Arg1)>* NewPermanentCallback(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T1* object, void (T2::*method)(Arg1)) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new ::base::Callback<void(Arg1)>(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ::base::Bind(method, base::Unretained(object)));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T1, class T2, typename Arg1>
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Closure* NewPermanentCallback(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T1* object,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void (T2::*method)(Arg1),
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typename internal::Identity<Arg1>::type arg1) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new ::base::Closure(::base::Bind(method, base::Unretained(object),
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          arg1));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Arg1, typename Arg2>
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Closure* NewPermanentCallback(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void (*fn)(Arg1, Arg2),
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typename internal::Identity<Arg1>::type arg1,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typename internal::Identity<Arg2>::type arg2) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new ::base::Closure(::base::Bind(fn, arg1, arg2));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T1, class T2, typename Arg1, typename Arg2>
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Closure* NewPermanentCallback(
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T1* object,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void (T2::*method)(Arg1, Arg2),
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typename internal::Identity<Arg1>::type arg1,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typename internal::Identity<Arg2>::type arg2) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new ::base::Closure(::base::Bind(method, base::Unretained(object),
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          arg1, arg2));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T1, class T2, typename Arg1, typename Arg2>
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)::base::Callback<void(Arg2)>* NewPermanentCallback(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T1* object,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void (T2::*method)(Arg1, Arg2),
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typename internal::Identity<Arg1>::type arg1) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new ::base::Callback<void(Arg2)>(
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ::base::Bind(method, base::Unretained(object), arg1));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T1, class T2, typename Arg1, typename Arg2, typename Arg3>
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Closure* NewPermanentCallback(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T1* object,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void (T2::*method)(Arg1, Arg2, Arg3),
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typename internal::Identity<Arg1>::type arg1,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typename internal::Identity<Arg2>::type arg2,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typename internal::Identity<Arg3>::type arg3) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new ::base::Closure(::base::Bind(method, base::Unretained(object),
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          arg1, arg2, arg3));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T1, class T2, typename Arg1, typename Arg2, typename Arg3,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          typename Arg4>
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Closure* NewPermanentCallback(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T1* object,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void (T2::*method)(Arg1, Arg2, Arg3, Arg4),
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typename internal::Identity<Arg1>::type arg1,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typename internal::Identity<Arg2>::type arg2,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typename internal::Identity<Arg3>::type arg3,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typename internal::Identity<Arg4>::type arg4) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new ::base::Closure(::base::Bind(method, base::Unretained(object),
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          arg1, arg2, arg3, arg4));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates a Closure that runs |callback| on |arg|. The returned Closure owns
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |callback|.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename ArgType>
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Closure* NewPermanentCallback(
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INVALIDATION_CALLBACK1_TYPE(ArgType)* callback,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typename internal::Identity<ArgType>::type arg) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new ::base::Closure(::base::Bind(
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &::base::Callback<void(ArgType)>::Run, base::Owned(callback), arg));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace invalidation
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GOOGLE_CACHEINVALIDATION_DEPS_CALLBACK_H_
136