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

// This is the boilerplate implementation of the IAllocator HAL interface,
// generated by the hidl-gen tool and then modified for use on Chrome OS.
// Modifications include:
// - Removal of non boiler plate client and server related code.
// - Reformatting to meet the Chrome OS coding standards.
//
// Originally generated with the command:
// $ hidl-gen -o output -L c++ -r android.hardware:hardware/interfaces \
//   android.hardware.neuralnetworks@1.3

#define LOG_TAG "android.hardware.neuralnetworks@1.3::FencedExecutionCallback"

#include <android/hardware/neuralnetworks/1.3/IFencedExecutionCallback.h>
#include <hidl/HidlTransportSupport.h>
#include <hidl/Status.h>

#include <utility>

namespace android {
namespace hardware {
namespace neuralnetworks {
namespace V1_3 {

const char* IFencedExecutionCallback::descriptor(
    "android.hardware.neuralnetworks@1.3::IFencedExecutionCallback");

::android::hardware::Return<void> IFencedExecutionCallback::interfaceChain(
    interfaceChain_cb _hidl_cb) {
  _hidl_cb({
      ::android::hardware::neuralnetworks::V1_3::IFencedExecutionCallback::
          descriptor,
      ::android::hidl::base::V1_0::IBase::descriptor,
  });
  return ::android::hardware::Void();
}

::android::hardware::Return<void> IFencedExecutionCallback::debug(
    const ::android::hardware::hidl_handle& fd,
    const ::android::hardware::hidl_vec<::android::hardware::hidl_string>&
        options) {
  (void)fd;
  (void)options;
  return ::android::hardware::Void();
}

::android::hardware::Return<void> IFencedExecutionCallback::interfaceDescriptor(
    interfaceDescriptor_cb _hidl_cb) {
  _hidl_cb(::android::hardware::neuralnetworks::V1_3::IFencedExecutionCallback::
               descriptor);
  return ::android::hardware::Void();
}

::android::hardware::Return<void> IFencedExecutionCallback::getHashChain(
    getHashChain_cb _hidl_cb) {
  _hidl_cb(
      {/* 6e904be0ddca5ae1de8eba020e6c38ed935ea7d80cd08f47787f137a0ca58555 */
       (uint8_t[32]){110, 144, 75,  224, 221, 202, 90, 225, 222, 142, 186,
                     2,   14,  108, 56,  237, 147, 94, 167, 216, 12,  208,
                     143, 71,  120, 127, 19,  122, 12, 165, 133, 85},
       /* ec7fd79ed02dfa85bc499426adae3ebe23ef0524f3cd6957139324b83b18ca4c */
       (uint8_t[32]){236, 127, 215, 158, 208, 45,  250, 133, 188, 73,  148,
                     38,  173, 174, 62,  190, 35,  239, 5,   36,  243, 205,
                     105, 87,  19,  147, 36,  184, 59,  24,  202, 76}});
  return ::android::hardware::Void();
}

::android::hardware::Return<void>
IFencedExecutionCallback::setHALInstrumentation() {
  return ::android::hardware::Void();
}

::android::hardware::Return<bool> IFencedExecutionCallback::linkToDeath(
    const ::android::sp<::android::hardware::hidl_death_recipient>& recipient,
    uint64_t cookie) {
  (void)cookie;
  return (recipient != nullptr);
}

::android::hardware::Return<void> IFencedExecutionCallback::ping() {
  return ::android::hardware::Void();
}

::android::hardware::Return<void> IFencedExecutionCallback::getDebugInfo(
    getDebugInfo_cb _hidl_cb) {
  ::android::hidl::base::V1_0::DebugInfo info = {};
  info.pid = -1;
  info.ptr = 0;
  info.arch =
#if defined(__LP64__)
      ::android::hidl::base::V1_0::DebugInfo::Architecture::IS_64BIT;
#else
      ::android::hidl::base::V1_0::DebugInfo::Architecture::IS_32BIT;
#endif
  _hidl_cb(info);
  return ::android::hardware::Void();
}

::android::hardware::Return<void>
IFencedExecutionCallback::notifySyspropsChanged() {
  ::android::report_sysprop_change();
  return ::android::hardware::Void();
}

::android::hardware::Return<bool> IFencedExecutionCallback::unlinkToDeath(
    const ::android::sp<::android::hardware::hidl_death_recipient>& recipient) {
  return (recipient != nullptr);
}

::android::hardware::Return<::android::sp<
    ::android::hardware::neuralnetworks::V1_3::IFencedExecutionCallback>>
IFencedExecutionCallback::castFrom(
    const ::android::sp<
        ::android::hardware::neuralnetworks::V1_3::IFencedExecutionCallback>&
        parent,
    bool /* emitError */) {
  return parent;
}

::android::hardware::Return<::android::sp<
    ::android::hardware::neuralnetworks::V1_3::IFencedExecutionCallback>>
IFencedExecutionCallback::castFrom(
    const ::android::sp<::android::hidl::base::V1_0::IBase>& parent,
    bool emitError) {
  return ::android::hardware::details::castInterface<
      IFencedExecutionCallback, ::android::hidl::base::V1_0::IBase>(
      parent, "android.hardware.neuralnetworks@1.3::IFencedExecutionCallback",
      emitError);
}

}  // namespace V1_3
}  // namespace neuralnetworks
}  // namespace hardware
}  // namespace android
