// Copyright 2018 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.

// WARNING: THIS FILE IS MACHINE GENERATED. DO NOT EDIT.
// Generated from the banjo.examples.references banjo file

#pragma once

#include <type_traits>

namespace ddk {
namespace internal {

DDKTL_INTERNAL_DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(has_in_out_protocol_protocol_do_something, InOutProtocolDoSomething,
        void (C::*)(some_type_t* param));

DDKTL_INTERNAL_DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(has_in_out_protocol_protocol_do_some_other_thing, InOutProtocolDoSomeOtherThing,
        void (C::*)(const some_type_t* param));

DDKTL_INTERNAL_DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(has_in_out_protocol_protocol_do_some_default_thing, InOutProtocolDoSomeDefaultThing,
        void (C::*)(const some_type_t* param));


template <typename D>
constexpr void CheckInOutProtocolProtocolSubclass() {
    static_assert(internal::has_in_out_protocol_protocol_do_something<D>::value,
        "InOutProtocolProtocol subclasses must implement "
        "void InOutProtocolDoSomething(some_type_t* param);");

    static_assert(internal::has_in_out_protocol_protocol_do_some_other_thing<D>::value,
        "InOutProtocolProtocol subclasses must implement "
        "void InOutProtocolDoSomeOtherThing(const some_type_t* param);");

    static_assert(internal::has_in_out_protocol_protocol_do_some_default_thing<D>::value,
        "InOutProtocolProtocol subclasses must implement "
        "void InOutProtocolDoSomeDefaultThing(const some_type_t* param);");

}


} // namespace internal
} // namespace ddk
