146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)$$ This is a pump file for generating file templates.  Pump is a python
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)$$ script that is part of the Google Test suite of utilities.  Description
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)$$ can be found here:
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)$$
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)$$ http://code.google.com/p/googletest/wiki/PumpManual
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)$$
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)$$ See comment for MAX_ARITY in base/bind.h.pump.
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)$var MAX_ARITY = 7
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_CALLBACK_TRACKER_INTERNAL_H_
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_CALLBACK_TRACKER_INTERNAL_H_
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/callback.h"
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/callback_internal.h"
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/memory/weak_ptr.h"
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace sync_file_system {
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace drive_backend {
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class CallbackTracker;
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace internal {
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class AbortHelper {
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  explicit AbortHelper(CallbackTracker* tracker);
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ~AbortHelper();
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::WeakPtr<AbortHelper> AsWeakPtr();
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  static scoped_ptr<AbortHelper> TakeOwnership(
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const base::WeakPtr<AbortHelper>& abort_helper);
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CallbackTracker* tracker_;  // Not owned.
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::WeakPtrFactory<AbortHelper> weak_ptr_factory_;
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AbortHelper);
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)template <typename>
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)struct InvokeAndInvalidateHelper;
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)$range ARITY 0..MAX_ARITY
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)$for ARITY [[
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)$range ARG 1..ARITY
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)template <$for ARG , [[typename A$(ARG)]]>
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)struct InvokeAndInvalidateHelper<void($for ARG , [[A$(ARG)]])> {
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  static void Run(const base::WeakPtr<AbortHelper>& abort_helper,
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  const base::Callback<void($for ARG , [[A$(ARG)]])>& callback
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)$if ARITY != 0 [[, ]]
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)$for ARG , [[A$(ARG) a$(ARG)]]
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)) {
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_ptr<AbortHelper> deleter = AbortHelper::TakeOwnership(abort_helper);
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (deleter) {
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      callback.Run(
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)$for ARG , [[base::internal::CallbackForward(a$(ARG))]]);
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)]]  $$ for ARITY
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace internal
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace drive_backend
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace sync_file_system
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_CALLBACK_TRACKER_INTERNAL_H_
74