// 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::Buffer"

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

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

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

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

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

::android::hardware::Return<void> IBuffer::getHashChain(
    getHashChain_cb _hidl_cb) {
  _hidl_cb(
      {/* 65c16331e57f6dd68b3971f06f78fe9e3209afb60630c31705aa355f9a52bf0d */
       (uint8_t[32]){101, 193, 99,  49,  229, 127, 109, 214, 139, 57, 113,
                     240, 111, 120, 254, 158, 50,  9,   175, 182, 6,  48,
                     195, 23,  5,   170, 53,  95,  154, 82,  191, 13},
       /* 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> IBuffer::setHALInstrumentation() {
  return ::android::hardware::Void();
}

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

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

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

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

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

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

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