blob: ca68c15436b2d4e9b2c56e61e2fcb937205cc44e [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <ddktl/device-internal.h>
#include <zircon/types.h>
#include <fbl/type_support.h>
#include <fbl/unique_ptr.h>
#include <stdint.h>
namespace ddk {
namespace internal {
DECLARE_HAS_MEMBER_FN(has_block_set_callbacks, BlockSetCallbacks);
DECLARE_HAS_MEMBER_FN(has_block_get_info, BlockGetInfo);
DECLARE_HAS_MEMBER_FN(has_block_read, BlockRead);
DECLARE_HAS_MEMBER_FN(has_block_write, BlockWrite);
template <typename D>
constexpr void CheckBlockProtocolSubclass() {
static_assert(internal::has_block_set_callbacks<D>::value,
"BlockProtocol subclasses must implement BlockSetCallbacks");
static_assert(fbl::is_same<decltype(&D::BlockSetCallbacks),
void (D::*)(block_callbacks_t*)>::value,
"BlockSetCallbacks must be a non-static member function with signature "
"'void BlockSetCallbacks(block_callbacks_t* cb)', and be visible to "
"ddk::BlockProtocol<D> (either because they are public, or because of "
"friendship).");
static_assert(internal::has_block_get_info<D>::value,
"BlockProtocol subclasses must implement BlockGetInfo");
static_assert(fbl::is_same<decltype(&D::BlockGetInfo),
void (D::*)(block_info_t*)>::value,
"BlockStop must be a non-static member function with signature "
"'void BlockGetInfo(block_info_t* info)', and be visible to "
"ddk::BlockProtocol<D> (either because they are public, or because "
"of friendship).");
static_assert(internal::has_block_read<D>::value,
"BlockProtocol subclasses must implement BlockRead");
static_assert(fbl::is_same<decltype(&D::BlockRead),
void (D::*)(zx_handle_t, uint64_t, uint64_t, uint64_t, void*)>::value,
"BlockRead must be a non-static member function with signature "
"'void BlockRead(zx_handle_t, uint64_t, uint64_t, uint64_t, void*)', and be "
"visible to ddk::BlockProtocol<D> (either because they are public, or because of "
"friendship).");
static_assert(internal::has_block_write<D>::value,
"BlockProtocol subclasses must implement BlockWrite");
static_assert(fbl::is_same<decltype(&D::BlockWrite),
void (D::*)(zx_handle_t, uint64_t, uint64_t, uint64_t, void*)>::value,
"BlockWrite must be a non-static member function with signature "
"'void BlockWrite(zx_handle_t, uint64_t, uint64_t, uint64_t, void*)', and be "
"visible to ddk::BlockProtocol<D> (either because they are public, or because of "
"friendship).");
}
} // namespace internal
} // namespace ddk