Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/security/sandbox/chromium/base/callback.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file.
4
5
#ifndef BASE_CALLBACK_H_
6
#define BASE_CALLBACK_H_
7
8
#include "base/callback_forward.h"
9
#include "base/callback_internal.h"
10
11
// NOTE: Header files that do not require the full definition of Callback or
12
// Closure should #include "base/callback_forward.h" instead of this file.
13
14
// -----------------------------------------------------------------------------
15
// Usage documentation
16
// -----------------------------------------------------------------------------
17
//
18
// See //docs/callback.md for documentation.
19
20
namespace base {
21
22
template <typename R, typename... Args>
23
class OnceCallback<R(Args...)> : public internal::CallbackBase {
24
 public:
25
  using RunType = R(Args...);
26
  using PolymorphicInvoke = R (*)(internal::BindStateBase*, Args&&...);
27
28
  OnceCallback() : internal::CallbackBase(nullptr) {}
29
30
  explicit OnceCallback(internal::BindStateBase* bind_state)
31
      : internal::CallbackBase(bind_state) {}
32
33
  OnceCallback(const OnceCallback&) = delete;
34
  OnceCallback& operator=(const OnceCallback&) = delete;
35
36
  OnceCallback(OnceCallback&&) = default;
37
  OnceCallback& operator=(OnceCallback&&) = default;
38
39
  OnceCallback(RepeatingCallback<RunType> other)
40
      : internal::CallbackBase(std::move(other)) {}
41
42
  OnceCallback& operator=(RepeatingCallback<RunType> other) {
43
    static_cast<internal::CallbackBase&>(*this) = std::move(other);
44
    return *this;
45
  }
46
47
  bool Equals(const OnceCallback& other) const { return EqualsInternal(other); }
48
49
  R Run(Args... args) const & {
50
    static_assert(!sizeof(*this),
51
                  "OnceCallback::Run() may only be invoked on a non-const "
52
                  "rvalue, i.e. std::move(callback).Run().");
53
    NOTREACHED();
54
  }
55
56
  R Run(Args... args) && {
57
    // Move the callback instance into a local variable before the invocation,
58
    // that ensures the internal state is cleared after the invocation.
59
    // It's not safe to touch |this| after the invocation, since running the
60
    // bound function may destroy |this|.
61
    OnceCallback cb = std::move(*this);
62
    PolymorphicInvoke f =
63
        reinterpret_cast<PolymorphicInvoke>(cb.polymorphic_invoke());
64
    return f(cb.bind_state_.get(), std::forward<Args>(args)...);
65
  }
66
};
67
68
template <typename R, typename... Args>
69
class RepeatingCallback<R(Args...)> : public internal::CallbackBaseCopyable {
70
 public:
71
  using RunType = R(Args...);
72
  using PolymorphicInvoke = R (*)(internal::BindStateBase*, Args&&...);
73
74
  RepeatingCallback() : internal::CallbackBaseCopyable(nullptr) {}
75
76
  explicit RepeatingCallback(internal::BindStateBase* bind_state)
77
0
      : internal::CallbackBaseCopyable(bind_state) {}
78
79
  // Copyable and movabl.
80
0
  RepeatingCallback(const RepeatingCallback&) = default;
81
  RepeatingCallback& operator=(const RepeatingCallback&) = default;
82
0
  RepeatingCallback(RepeatingCallback&&) = default;
83
  RepeatingCallback& operator=(RepeatingCallback&&) = default;
84
85
  bool Equals(const RepeatingCallback& other) const {
86
    return EqualsInternal(other);
87
  }
88
89
0
  R Run(Args... args) const & {
90
0
    PolymorphicInvoke f =
91
0
        reinterpret_cast<PolymorphicInvoke>(this->polymorphic_invoke());
92
0
    return f(this->bind_state_.get(), std::forward<Args>(args)...);
93
0
  }
94
95
  R Run(Args... args) && {
96
    // Move the callback instance into a local variable before the invocation,
97
    // that ensures the internal state is cleared after the invocation.
98
    // It's not safe to touch |this| after the invocation, since running the
99
    // bound function may destroy |this|.
100
    RepeatingCallback cb = std::move(*this);
101
    PolymorphicInvoke f =
102
        reinterpret_cast<PolymorphicInvoke>(cb.polymorphic_invoke());
103
    return f(cb.bind_state_.get(), std::forward<Args>(args)...);
104
  }
105
};
106
107
}  // namespace base
108
109
#endif  // BASE_CALLBACK_H_