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

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

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

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

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

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

::android::hardware::Return<void> IDevice::getHashChain(
    getHashChain_cb _hidl_cb) {
  _hidl_cb(
      {/* 278817920bfd5292a7713f97f1832cca53de3de640f7670e413d97c6e7fd581c */
       (uint8_t[32]){39,  136, 23,  146, 11,  253, 82,  146, 167, 113, 63,
                     151, 241, 131, 44,  202, 83,  222, 61,  230, 64,  247,
                     103, 14,  65,  61,  151, 198, 231, 253, 88,  28},
       /* fb382e986c10b8fbb797a8546e8f9ea6d1107bfe6f3fb7e57f6bbbf1f807a906 */
       (uint8_t[32]){251, 56,  46,  152, 108, 16,  184, 251, 183, 151, 168,
                     84,  110, 143, 158, 166, 209, 16,  123, 254, 111, 63,
                     183, 229, 127, 107, 187, 241, 248, 7,   169, 6},
       /* 7698dc2382a2eeb43541840e3ee624f34108efdfb976b2bfa7c13ef15fb8c4c4 */
       (uint8_t[32]){118, 152, 220, 35,  130, 162, 238, 180, 53,  65,  132,
                     14,  62,  230, 36,  243, 65,  8,   239, 223, 185, 118,
                     178, 191, 167, 193, 62,  241, 95,  184, 196, 196},
       /* 5804ca86611d72e5481f022b3a0c1b334217f2e4988dad25730c42af2d1f4d1c */
       (uint8_t[32]){88,  4,  202, 134, 97, 29,  114, 229, 72,  31,  2,
                     43,  58, 12,  27,  51, 66,  23,  242, 228, 152, 141,
                     173, 37, 115, 12,  66, 175, 45,  31,  77,  28},
       /* 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> IDevice::setHALInstrumentation() {
  return ::android::hardware::Void();
}

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

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

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

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

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

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

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