// 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++-adapter -r android.hardware:hardware/interfaces \
//   android.hardware.neuralnetworks@1.2

#include <android/hardware/neuralnetworks/1.2/APreparedModel.h>
#include <android/hardware/neuralnetworks/1.0/AExecutionCallback.h>
#include <android/hardware/neuralnetworks/1.0/APreparedModel.h>
#include <android/hardware/neuralnetworks/1.2/ABurstCallback.h>
#include <android/hardware/neuralnetworks/1.2/ABurstContext.h>
#include <android/hardware/neuralnetworks/1.2/AExecutionCallback.h>
#include <android/hardware/neuralnetworks/1.2/IPreparedModel.h>
#include <hidladapter/HidlBinderAdapter.h>

/*
#include <android/hardware/neuralnetworks/1.2/AExecutionCallback.h>
#include <android/hidl/base/1.0/ABase.h>
*/

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

APreparedModel::APreparedModel(
    const ::android::sp<
        ::android::hardware::neuralnetworks::V1_2::IPreparedModel>& impl)
    : mImpl(impl) {
}  // Methods from ::android::hardware::neuralnetworks::V1_0::IPreparedModel
   // follow.
::android::hardware::Return<
    ::android::hardware::neuralnetworks::V1_0::ErrorStatus>
APreparedModel::execute(
    const ::android::hardware::neuralnetworks::V1_0::Request& request,
    const ::android::sp<
        ::android::hardware::neuralnetworks::V1_0::IExecutionCallback>&
        callback) {
  auto _hidl_out = mImpl->execute(
      request,
      static_cast<::android::sp<
          ::android::hardware::neuralnetworks::V1_0::IExecutionCallback>>(
          ::android::hardware::neuralnetworks::V1_0::IExecutionCallback::
              castFrom(::android::hardware::details::adaptWithDefault(
                  static_cast<
                      ::android::sp<::android::hardware::neuralnetworks::V1_0::
                                        IExecutionCallback>>(callback),
                  [&] {
                    return new ::android::hardware::neuralnetworks::V1_0::
                        AExecutionCallback(callback);
                  }))));
  if (!_hidl_out.isOkUnchecked()) {
    return _hidl_out;
  }
  return _hidl_out;
}

// Methods from ::android::hardware::neuralnetworks::V1_2::IPreparedModel
// follow.
::android::hardware::Return<
    ::android::hardware::neuralnetworks::V1_0::ErrorStatus>
APreparedModel::execute_1_2(
    const ::android::hardware::neuralnetworks::V1_0::Request& request,
    ::android::hardware::neuralnetworks::V1_2::MeasureTiming measure,
    const ::android::sp<
        ::android::hardware::neuralnetworks::V1_2::IExecutionCallback>&
        callback) {
  auto _hidl_out = mImpl->execute_1_2(
      request, measure,
      static_cast<::android::sp<
          ::android::hardware::neuralnetworks::V1_2::IExecutionCallback>>(
          ::android::hardware::neuralnetworks::V1_2::IExecutionCallback::
              castFrom(::android::hardware::details::adaptWithDefault(
                  static_cast<
                      ::android::sp<::android::hardware::neuralnetworks::V1_2::
                                        IExecutionCallback>>(callback),
                  [&] {
                    return new ::android::hardware::neuralnetworks::V1_2::
                        AExecutionCallback(callback);
                  }))));
  if (!_hidl_out.isOkUnchecked()) {
    return _hidl_out;
  }
  return _hidl_out;
}
::android::hardware::Return<void> APreparedModel::executeSynchronously(
    const ::android::hardware::neuralnetworks::V1_0::Request& request,
    ::android::hardware::neuralnetworks::V1_2::MeasureTiming measure,
    executeSynchronously_cb _hidl_cb) {
  executeSynchronously_cb _hidl_cb_wrapped =
      [&](::android::hardware::neuralnetworks::V1_0::ErrorStatus status,
          const ::android::hardware::hidl_vec<
              ::android::hardware::neuralnetworks::V1_2::OutputShape>&
              outputShapes,
          const ::android::hardware::neuralnetworks::V1_2::Timing& timing) {
        return _hidl_cb(status, outputShapes, timing);
      };
  auto _hidl_out =
      mImpl->executeSynchronously(request, measure, _hidl_cb_wrapped);
  return _hidl_out;
}
::android::hardware::Return<void> APreparedModel::configureExecutionBurst(
    const ::android::sp<
        ::android::hardware::neuralnetworks::V1_2::IBurstCallback>& callback,
    const ::android::hardware::MQDescriptorSync<
        ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum>&
        requestChannel,
    const ::android::hardware::MQDescriptorSync<
        ::android::hardware::neuralnetworks::V1_2::FmqResultDatum>&
        resultChannel,
    configureExecutionBurst_cb _hidl_cb) {
  configureExecutionBurst_cb _hidl_cb_wrapped =
      [&](::android::hardware::neuralnetworks::V1_0::ErrorStatus status,
          const ::android::sp<
              ::android::hardware::neuralnetworks::V1_2::IBurstContext>&
              context) {
        return _hidl_cb(
            status,
            static_cast<::android::sp<
                ::android::hardware::neuralnetworks::V1_2::IBurstContext>>(
                ::android::hardware::neuralnetworks::V1_2::IBurstContext::
                    castFrom(::android::hardware::details::adaptWithDefault(
                        static_cast<
                            ::android::sp<::android::hardware::neuralnetworks::
                                              V1_2::IBurstContext>>(context),
                        [&] {
                          return new ::android::hardware::neuralnetworks::V1_2::
                              ABurstContext(context);
                        }))));
      };
  auto _hidl_out = mImpl->configureExecutionBurst(
      static_cast<::android::sp<
          ::android::hardware::neuralnetworks::V1_2::IBurstCallback>>(
          ::android::hardware::neuralnetworks::V1_2::IBurstCallback::castFrom(
              ::android::hardware::details::adaptWithDefault(
                  static_cast<
                      ::android::sp<::android::hardware::neuralnetworks::V1_2::
                                        IBurstCallback>>(callback),
                  [&] {
                    return new ::android::hardware::neuralnetworks::V1_2::
                        ABurstCallback(callback);
                  }))),
      requestChannel, resultChannel, _hidl_cb_wrapped);
  return _hidl_out;
}

// Methods from ::android::hidl::base::V1_0::IBase follow.

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