// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/functional/callback_internal.h"

#include <utility>

#include "base/check.h"
#include "base/notreached.h"

namespace base::internal {

namespace {

bool QueryCancellationTraitsForNonCancellables(
    const BindStateBase*,
    BindStateBase::CancellationQueryMode mode) {
  // Non-cancellables are never cancelled and always valid, which means the
  // response for each mode is the same as its underlying value.
  return std::to_underlying(mode);
}

}  // namespace

void BindStateBaseRefCountTraits::Destruct(const BindStateBase* bind_state) {
  bind_state->destructor_(bind_state);
}

BindStateBase::BindStateBase(InvokeFuncStorage polymorphic_invoke,
                             DestructorPtr destructor)
    : BindStateBase(polymorphic_invoke,
                    destructor,
                    &QueryCancellationTraitsForNonCancellables) {}

BindStateBase::BindStateBase(
    InvokeFuncStorage polymorphic_invoke,
    DestructorPtr destructor,
    QueryCancellationTraitsPtr query_cancellation_traits)
    : polymorphic_invoke_(polymorphic_invoke),
      destructor_(destructor),
      query_cancellation_traits_(query_cancellation_traits) {}

BindStateHolder& BindStateHolder::operator=(BindStateHolder&&) noexcept =
    default;

BindStateHolder::BindStateHolder(const BindStateHolder&) = default;

BindStateHolder& BindStateHolder::operator=(const BindStateHolder&) = default;

BindStateHolder::~BindStateHolder() = default;

void BindStateHolder::Reset() {
  bind_state_ = nullptr;
}

bool BindStateHolder::IsCancelled() const {
  DCHECK(bind_state_);
  return bind_state_->IsCancelled();
}

bool BindStateHolder::MaybeValid() const {
  DCHECK(bind_state_);
  return bind_state_->MaybeValid();
}

}  // namespace base::internal
