// 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.2

#define LOG_TAG "android.hardware.neuralnetworks@1.2::BurstContext"

#include <android/hardware/neuralnetworks/1.2/IBurstContext.h>
#include <hidl/HidlTransportSupport.h>
#include <hidl/Status.h>

namespace android {
namespace hardware {
namespace neuralnetworks {
namespace V1_2 {

const char* IBurstContext::descriptor(
    "android.hardware.neuralnetworks@1.2::IBurstContext");

// Methods from ::android::hidl::base::V1_0::IBase follow.
::android::hardware::Return<void> IBurstContext::interfaceChain(
    interfaceChain_cb _hidl_cb) {
  _hidl_cb({
      ::android::hardware::neuralnetworks::V1_2::IBurstContext::descriptor,
      ::android::hidl::base::V1_0::IBase::descriptor,
  });
  return ::android::hardware::Void();
}

::android::hardware::Return<void> IBurstContext::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> IBurstContext::interfaceDescriptor(
    interfaceDescriptor_cb _hidl_cb) {
  _hidl_cb(
      ::android::hardware::neuralnetworks::V1_2::IBurstContext::descriptor);
  return ::android::hardware::Void();
}

::android::hardware::Return<void> IBurstContext::getHashChain(
    getHashChain_cb _hidl_cb) {
  _hidl_cb(
      {/* 19877e466ad8c6ed42b38050b77bd010cf7800ff365fdc8574f45bbfda03a758 */
       (uint8_t[32]){25,  135, 126, 70,  106, 216, 198, 237, 66,  179, 128,
                     80,  183, 123, 208, 16,  207, 120, 0,   255, 54,  95,
                     220, 133, 116, 244, 91,  191, 218, 3,   167, 88},
       /* 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> IBurstContext::setHALInstrumentation() {
  return ::android::hardware::Void();
}

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

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

::android::hardware::Return<void> IBurstContext::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> IBurstContext::notifySyspropsChanged() {
  ::android::report_sysprop_change();
  return ::android::hardware::Void();
}

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

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

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

}  // namespace V1_2
}  // namespace neuralnetworks
}  // namespace hardware
}  // namespace android
