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

#include <android/hardware/neuralnetworks/1.2/types.h>
#include <cutils/compiler.h>
#include <hidl/Status.h>
#include <log/log.h>

#include <inttypes.h>
#include <utility>

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

::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::ExtraParams() {
  static_assert(
      offsetof(::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams,
               hidl_d) == 0,
      "wrong offset");
  static_assert(
      offsetof(::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams,
               hidl_u) == 8,
      "wrong offset");

  ::std::memset(&hidl_u, 0, sizeof(hidl_u));
  ::std::memset(reinterpret_cast<uint8_t*>(this) + 1, 0, 7);
  // no padding to zero starting at offset 32

  hidl_d = hidl_discriminator::none;
  new (&hidl_u.none)::android::hidl::safe_union::V1_0::Monostate();
}

::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::
    ~ExtraParams() {
  hidl_destructUnion();
}

::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::ExtraParams(
    ExtraParams&& other)
    : ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams() {
  switch (other.hidl_d) {
    case hidl_discriminator::none: {
      new (&hidl_u.none)::android::hidl::safe_union::V1_0::Monostate(
          std::move(other.hidl_u.none));
      break;
    }
    case hidl_discriminator::channelQuant: {
      new (&hidl_u.channelQuant)::android::hardware::neuralnetworks::V1_2::
          SymmPerChannelQuantParams(std::move(other.hidl_u.channelQuant));
      break;
    }
    case hidl_discriminator::extension: {
      new (&hidl_u.extension)::android::hardware::hidl_vec<uint8_t>(
          std::move(other.hidl_u.extension));
      break;
    }
    default: {
      ::android::hardware::details::logAlwaysFatal(
          ("Unknown union discriminator (value: " +
           std::to_string((uint8_t)other.hidl_d) + ").")
              .c_str());
    }
  }

  hidl_d = other.hidl_d;
}

::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::ExtraParams(
    const ExtraParams& other)
    : ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams() {
  switch (other.hidl_d) {
    case hidl_discriminator::none: {
      new (&hidl_u.none)::android::hidl::safe_union::V1_0::Monostate(
          other.hidl_u.none);
      break;
    }
    case hidl_discriminator::channelQuant: {
      new (&hidl_u.channelQuant)::android::hardware::neuralnetworks::V1_2::
          SymmPerChannelQuantParams(other.hidl_u.channelQuant);
      break;
    }
    case hidl_discriminator::extension: {
      new (&hidl_u.extension)::android::hardware::hidl_vec<uint8_t>(
          other.hidl_u.extension);
      break;
    }
    default: {
      ::android::hardware::details::logAlwaysFatal(
          ("Unknown union discriminator (value: " +
           std::to_string((uint8_t)other.hidl_d) + ").")
              .c_str());
    }
  }

  hidl_d = other.hidl_d;
}

::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams&(
    ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::operator=)(
    ExtraParams&& other) {
  if (this == &other) {
    return *this;
  }

  switch (other.hidl_d) {
    case hidl_discriminator::none: {
      none(std::move(other.hidl_u.none));
      break;
    }
    case hidl_discriminator::channelQuant: {
      channelQuant(std::move(other.hidl_u.channelQuant));
      break;
    }
    case hidl_discriminator::extension: {
      extension(std::move(other.hidl_u.extension));
      break;
    }
    default: {
      ::android::hardware::details::logAlwaysFatal(
          ("Unknown union discriminator (value: " +
           std::to_string((uint8_t)other.hidl_d) + ").")
              .c_str());
    }
  }
  return *this;
}

::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams&(
    ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::operator=)(
    const ExtraParams& other) {
  if (this == &other) {
    return *this;
  }

  switch (other.hidl_d) {
    case hidl_discriminator::none: {
      none(other.hidl_u.none);
      break;
    }
    case hidl_discriminator::channelQuant: {
      channelQuant(other.hidl_u.channelQuant);
      break;
    }
    case hidl_discriminator::extension: {
      extension(other.hidl_u.extension);
      break;
    }
    default: {
      ::android::hardware::details::logAlwaysFatal(
          ("Unknown union discriminator (value: " +
           std::to_string((uint8_t)other.hidl_d) + ").")
              .c_str());
    }
  }
  return *this;
}

void ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::
    hidl_destructUnion() {
  switch (hidl_d) {
    case hidl_discriminator::none: {
      ::android::hardware::details::destructElement(&(hidl_u.none));
      break;
    }
    case hidl_discriminator::channelQuant: {
      ::android::hardware::details::destructElement(&(hidl_u.channelQuant));
      break;
    }
    case hidl_discriminator::extension: {
      ::android::hardware::details::destructElement(&(hidl_u.extension));
      break;
    }
    default: {
      ::android::hardware::details::logAlwaysFatal(
          ("Unknown union discriminator (value: " +
           std::to_string((uint8_t)hidl_d) + ").")
              .c_str());
    }
  }
}

void ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::none(
    const ::android::hidl::safe_union::V1_0::Monostate& o) {
  if (hidl_d != hidl_discriminator::none) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.none)::android::hidl::safe_union::V1_0::Monostate(o);
    hidl_d = hidl_discriminator::none;
  } else if (&(hidl_u.none) != &o) {
    hidl_u.none = o;
  }
}

void ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::none(
    ::android::hidl::safe_union::V1_0::Monostate&& o) {
  if (hidl_d != hidl_discriminator::none) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.none)::android::hidl::safe_union::V1_0::Monostate(
        std::move(o));
    hidl_d = hidl_discriminator::none;
  } else if (&(hidl_u.none) != &o) {
    hidl_u.none = std::move(o);
  }
}

::android::hidl::safe_union::V1_0::Monostate&(
    ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::none)() {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::none)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::none));
  }

  return hidl_u.none;
}

const ::android::hidl::safe_union::V1_0::Monostate&(
    ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::none)()
    const {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::none)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::none));
  }

  return hidl_u.none;
}

void ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::
    channelQuant(const ::android::hardware::neuralnetworks::V1_2::
                     SymmPerChannelQuantParams& o) {
  if (hidl_d != hidl_discriminator::channelQuant) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.channelQuant)::android::hardware::neuralnetworks::V1_2::
        SymmPerChannelQuantParams(o);
    hidl_d = hidl_discriminator::channelQuant;
  } else if (&(hidl_u.channelQuant) != &o) {
    hidl_u.channelQuant = o;
  }
}

void ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::
    channelQuant(
        ::android::hardware::neuralnetworks::V1_2::SymmPerChannelQuantParams&&
            o) {
  if (hidl_d != hidl_discriminator::channelQuant) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.channelQuant)::android::hardware::neuralnetworks::V1_2::
        SymmPerChannelQuantParams(std::move(o));
    hidl_d = hidl_discriminator::channelQuant;
  } else if (&(hidl_u.channelQuant) != &o) {
    hidl_u.channelQuant = std::move(o);
  }
}

::android::hardware::neuralnetworks::V1_2::SymmPerChannelQuantParams&(
    ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::
        channelQuant)() {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::channelQuant)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::channelQuant));
  }

  return hidl_u.channelQuant;
}

const ::android::hardware::neuralnetworks::V1_2::SymmPerChannelQuantParams&(
    ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::
        channelQuant)() const {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::channelQuant)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::channelQuant));
  }

  return hidl_u.channelQuant;
}

void ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::extension(
    const ::android::hardware::hidl_vec<uint8_t>& o) {
  if (hidl_d != hidl_discriminator::extension) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.extension)::android::hardware::hidl_vec<uint8_t>(o);
    hidl_d = hidl_discriminator::extension;
  } else if (&(hidl_u.extension) != &o) {
    hidl_u.extension = o;
  }
}

void ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::extension(
    ::android::hardware::hidl_vec<uint8_t>&& o) {
  if (hidl_d != hidl_discriminator::extension) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.extension)::android::hardware::hidl_vec<uint8_t>(std::move(o));
    hidl_d = hidl_discriminator::extension;
  } else if (&(hidl_u.extension) != &o) {
    hidl_u.extension = std::move(o);
  }
}

::android::hardware::hidl_vec<uint8_t>&(
    ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::
        extension)() {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::extension)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::extension));
  }

  return hidl_u.extension;
}

const ::android::hardware::hidl_vec<uint8_t>&(
    ::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::
        extension)() const {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::extension)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::extension));
  }

  return hidl_u.extension;
}

::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::hidl_union::
    hidl_union() {}

::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::hidl_union::
    ~hidl_union() {}

::android::hardware::neuralnetworks::V1_2::Operand::ExtraParams::
    hidl_discriminator(::android::hardware::neuralnetworks::V1_2::Operand::
                           ExtraParams::getDiscriminator)() const {
  return hidl_d;
}

::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::FmqRequestDatum() {
  static_assert(
      offsetof(::android::hardware::neuralnetworks::V1_2::FmqRequestDatum,
               hidl_d) == 0,
      "wrong offset");
  static_assert(
      offsetof(::android::hardware::neuralnetworks::V1_2::FmqRequestDatum,
               hidl_u) == 4,
      "wrong offset");

  ::std::memset(&hidl_u, 0, sizeof(hidl_u));
  ::std::memset(reinterpret_cast<uint8_t*>(this) + 1, 0, 3);
  // no padding to zero starting at offset 24

  hidl_d = hidl_discriminator::packetInformation;
  new (&hidl_u.packetInformation)::android::hardware::neuralnetworks::V1_2::
      FmqRequestDatum::PacketInformation();
}

::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::~FmqRequestDatum() {
  hidl_destructUnion();
}

::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::FmqRequestDatum(
    FmqRequestDatum&& other)
    : ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum() {
  switch (other.hidl_d) {
    case hidl_discriminator::packetInformation: {
      new (&hidl_u.packetInformation)::android::hardware::neuralnetworks::V1_2::
          FmqRequestDatum::PacketInformation(
              std::move(other.hidl_u.packetInformation));
      break;
    }
    case hidl_discriminator::inputOperandInformation: {
      new (&hidl_u.inputOperandInformation)::android::hardware::neuralnetworks::
          V1_2::FmqRequestDatum::OperandInformation(
              std::move(other.hidl_u.inputOperandInformation));
      break;
    }
    case hidl_discriminator::inputOperandDimensionValue: {
      new (&hidl_u.inputOperandDimensionValue)
          uint32_t(std::move(other.hidl_u.inputOperandDimensionValue));
      break;
    }
    case hidl_discriminator::outputOperandInformation: {
      new (&hidl_u.outputOperandInformation)::android::hardware::
          neuralnetworks::V1_2::FmqRequestDatum::OperandInformation(
              std::move(other.hidl_u.outputOperandInformation));
      break;
    }
    case hidl_discriminator::outputOperandDimensionValue: {
      new (&hidl_u.outputOperandDimensionValue)
          uint32_t(std::move(other.hidl_u.outputOperandDimensionValue));
      break;
    }
    case hidl_discriminator::poolIdentifier: {
      new (&hidl_u.poolIdentifier)
          int32_t(std::move(other.hidl_u.poolIdentifier));
      break;
    }
    case hidl_discriminator::measureTiming: {
      new (&hidl_u.measureTiming)::android::hardware::neuralnetworks::V1_2::
          MeasureTiming(std::move(other.hidl_u.measureTiming));
      break;
    }
    default: {
      ::android::hardware::details::logAlwaysFatal(
          ("Unknown union discriminator (value: " +
           std::to_string((uint8_t)other.hidl_d) + ").")
              .c_str());
    }
  }

  hidl_d = other.hidl_d;
}

::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::FmqRequestDatum(
    const FmqRequestDatum& other)
    : ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum() {
  switch (other.hidl_d) {
    case hidl_discriminator::packetInformation: {
      new (&hidl_u.packetInformation)::android::hardware::neuralnetworks::V1_2::
          FmqRequestDatum::PacketInformation(other.hidl_u.packetInformation);
      break;
    }
    case hidl_discriminator::inputOperandInformation: {
      new (&hidl_u.inputOperandInformation)::android::hardware::neuralnetworks::
          V1_2::FmqRequestDatum::OperandInformation(
              other.hidl_u.inputOperandInformation);
      break;
    }
    case hidl_discriminator::inputOperandDimensionValue: {
      new (&hidl_u.inputOperandDimensionValue)
          uint32_t(other.hidl_u.inputOperandDimensionValue);
      break;
    }
    case hidl_discriminator::outputOperandInformation: {
      new (&hidl_u.outputOperandInformation)::android::hardware::
          neuralnetworks::V1_2::FmqRequestDatum::OperandInformation(
              other.hidl_u.outputOperandInformation);
      break;
    }
    case hidl_discriminator::outputOperandDimensionValue: {
      new (&hidl_u.outputOperandDimensionValue)
          uint32_t(other.hidl_u.outputOperandDimensionValue);
      break;
    }
    case hidl_discriminator::poolIdentifier: {
      new (&hidl_u.poolIdentifier) int32_t(other.hidl_u.poolIdentifier);
      break;
    }
    case hidl_discriminator::measureTiming: {
      new (&hidl_u.measureTiming)::android::hardware::neuralnetworks::V1_2::
          MeasureTiming(other.hidl_u.measureTiming);
      break;
    }
    default: {
      ::android::hardware::details::logAlwaysFatal(
          ("Unknown union discriminator (value: " +
           std::to_string((uint8_t)other.hidl_d) + ").")
              .c_str());
    }
  }

  hidl_d = other.hidl_d;
}

::android::hardware::neuralnetworks::V1_2::FmqRequestDatum&(
    ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::operator=)(
    FmqRequestDatum&& other) {
  if (this == &other) {
    return *this;
  }

  switch (other.hidl_d) {
    case hidl_discriminator::packetInformation: {
      packetInformation(std::move(other.hidl_u.packetInformation));
      break;
    }
    case hidl_discriminator::inputOperandInformation: {
      inputOperandInformation(std::move(other.hidl_u.inputOperandInformation));
      break;
    }
    case hidl_discriminator::inputOperandDimensionValue: {
      inputOperandDimensionValue(
          std::move(other.hidl_u.inputOperandDimensionValue));
      break;
    }
    case hidl_discriminator::outputOperandInformation: {
      outputOperandInformation(
          std::move(other.hidl_u.outputOperandInformation));
      break;
    }
    case hidl_discriminator::outputOperandDimensionValue: {
      outputOperandDimensionValue(
          std::move(other.hidl_u.outputOperandDimensionValue));
      break;
    }
    case hidl_discriminator::poolIdentifier: {
      poolIdentifier(std::move(other.hidl_u.poolIdentifier));
      break;
    }
    case hidl_discriminator::measureTiming: {
      measureTiming(std::move(other.hidl_u.measureTiming));
      break;
    }
    default: {
      ::android::hardware::details::logAlwaysFatal(
          ("Unknown union discriminator (value: " +
           std::to_string((uint8_t)other.hidl_d) + ").")
              .c_str());
    }
  }
  return *this;
}

::android::hardware::neuralnetworks::V1_2::FmqRequestDatum&(
    ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::operator=)(
    const FmqRequestDatum& other) {
  if (this == &other) {
    return *this;
  }

  switch (other.hidl_d) {
    case hidl_discriminator::packetInformation: {
      packetInformation(other.hidl_u.packetInformation);
      break;
    }
    case hidl_discriminator::inputOperandInformation: {
      inputOperandInformation(other.hidl_u.inputOperandInformation);
      break;
    }
    case hidl_discriminator::inputOperandDimensionValue: {
      inputOperandDimensionValue(other.hidl_u.inputOperandDimensionValue);
      break;
    }
    case hidl_discriminator::outputOperandInformation: {
      outputOperandInformation(other.hidl_u.outputOperandInformation);
      break;
    }
    case hidl_discriminator::outputOperandDimensionValue: {
      outputOperandDimensionValue(other.hidl_u.outputOperandDimensionValue);
      break;
    }
    case hidl_discriminator::poolIdentifier: {
      poolIdentifier(other.hidl_u.poolIdentifier);
      break;
    }
    case hidl_discriminator::measureTiming: {
      measureTiming(other.hidl_u.measureTiming);
      break;
    }
    default: {
      ::android::hardware::details::logAlwaysFatal(
          ("Unknown union discriminator (value: " +
           std::to_string((uint8_t)other.hidl_d) + ").")
              .c_str());
    }
  }
  return *this;
}

void ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
    hidl_destructUnion() {
  switch (hidl_d) {
    case hidl_discriminator::packetInformation: {
      ::android::hardware::details::destructElement(
          &(hidl_u.packetInformation));
      break;
    }
    case hidl_discriminator::inputOperandInformation: {
      ::android::hardware::details::destructElement(
          &(hidl_u.inputOperandInformation));
      break;
    }
    case hidl_discriminator::inputOperandDimensionValue: {
      ::android::hardware::details::destructElement(
          &(hidl_u.inputOperandDimensionValue));
      break;
    }
    case hidl_discriminator::outputOperandInformation: {
      ::android::hardware::details::destructElement(
          &(hidl_u.outputOperandInformation));
      break;
    }
    case hidl_discriminator::outputOperandDimensionValue: {
      ::android::hardware::details::destructElement(
          &(hidl_u.outputOperandDimensionValue));
      break;
    }
    case hidl_discriminator::poolIdentifier: {
      ::android::hardware::details::destructElement(&(hidl_u.poolIdentifier));
      break;
    }
    case hidl_discriminator::measureTiming: {
      ::android::hardware::details::destructElement(&(hidl_u.measureTiming));
      break;
    }
    default: {
      ::android::hardware::details::logAlwaysFatal(
          ("Unknown union discriminator (value: " +
           std::to_string((uint8_t)hidl_d) + ").")
              .c_str());
    }
  }
}

void ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
    packetInformation(const ::android::hardware::neuralnetworks::V1_2::
                          FmqRequestDatum::PacketInformation& o) {
  if (hidl_d != hidl_discriminator::packetInformation) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.packetInformation)::android::hardware::neuralnetworks::V1_2::
        FmqRequestDatum::PacketInformation(o);
    hidl_d = hidl_discriminator::packetInformation;
  } else if (&(hidl_u.packetInformation) != &o) {
    hidl_u.packetInformation = o;
  }
}

void ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
    packetInformation(::android::hardware::neuralnetworks::V1_2::
                          FmqRequestDatum::PacketInformation&& o) {
  if (hidl_d != hidl_discriminator::packetInformation) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.packetInformation)::android::hardware::neuralnetworks::V1_2::
        FmqRequestDatum::PacketInformation(std::move(o));
    hidl_d = hidl_discriminator::packetInformation;
  } else if (&(hidl_u.packetInformation) != &o) {
    hidl_u.packetInformation = std::move(o);
  }
}

::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::PacketInformation&(
    ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
        packetInformation)() {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::packetInformation)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::packetInformation));
  }

  return hidl_u.packetInformation;
}

const ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
    PacketInformation&(::android::hardware::neuralnetworks::V1_2::
                           FmqRequestDatum::packetInformation)() const {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::packetInformation)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::packetInformation));
  }

  return hidl_u.packetInformation;
}

void ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
    inputOperandInformation(const ::android::hardware::neuralnetworks::V1_2::
                                FmqRequestDatum::OperandInformation& o) {
  if (hidl_d != hidl_discriminator::inputOperandInformation) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.inputOperandInformation)::android::hardware::neuralnetworks::
        V1_2::FmqRequestDatum::OperandInformation(o);
    hidl_d = hidl_discriminator::inputOperandInformation;
  } else if (&(hidl_u.inputOperandInformation) != &o) {
    hidl_u.inputOperandInformation = o;
  }
}

void ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
    inputOperandInformation(::android::hardware::neuralnetworks::V1_2::
                                FmqRequestDatum::OperandInformation&& o) {
  if (hidl_d != hidl_discriminator::inputOperandInformation) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.inputOperandInformation)::android::hardware::neuralnetworks::
        V1_2::FmqRequestDatum::OperandInformation(std::move(o));
    hidl_d = hidl_discriminator::inputOperandInformation;
  } else if (&(hidl_u.inputOperandInformation) != &o) {
    hidl_u.inputOperandInformation = std::move(o);
  }
}

::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::OperandInformation&(
    ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
        inputOperandInformation)() {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::inputOperandInformation)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::inputOperandInformation));
  }

  return hidl_u.inputOperandInformation;
}

const ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
    OperandInformation&(::android::hardware::neuralnetworks::V1_2::
                            FmqRequestDatum::inputOperandInformation)() const {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::inputOperandInformation)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::inputOperandInformation));
  }

  return hidl_u.inputOperandInformation;
}

void ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
    inputOperandDimensionValue(uint32_t o) {
  if (hidl_d != hidl_discriminator::inputOperandDimensionValue) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.inputOperandDimensionValue) uint32_t(o);
    hidl_d = hidl_discriminator::inputOperandDimensionValue;
  } else if (&(hidl_u.inputOperandDimensionValue) != &o) {
    hidl_u.inputOperandDimensionValue = o;
  }
}

uint32_t&(::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
              inputOperandDimensionValue)() {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::inputOperandDimensionValue)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::inputOperandDimensionValue));
  }

  return hidl_u.inputOperandDimensionValue;
}

uint32_t(::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
             inputOperandDimensionValue)() const {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::inputOperandDimensionValue)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::inputOperandDimensionValue));
  }

  return hidl_u.inputOperandDimensionValue;
}

void ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
    outputOperandInformation(const ::android::hardware::neuralnetworks::V1_2::
                                 FmqRequestDatum::OperandInformation& o) {
  if (hidl_d != hidl_discriminator::outputOperandInformation) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.outputOperandInformation)::android::hardware::neuralnetworks::
        V1_2::FmqRequestDatum::OperandInformation(o);
    hidl_d = hidl_discriminator::outputOperandInformation;
  } else if (&(hidl_u.outputOperandInformation) != &o) {
    hidl_u.outputOperandInformation = o;
  }
}

void ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
    outputOperandInformation(::android::hardware::neuralnetworks::V1_2::
                                 FmqRequestDatum::OperandInformation&& o) {
  if (hidl_d != hidl_discriminator::outputOperandInformation) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.outputOperandInformation)::android::hardware::neuralnetworks::
        V1_2::FmqRequestDatum::OperandInformation(std::move(o));
    hidl_d = hidl_discriminator::outputOperandInformation;
  } else if (&(hidl_u.outputOperandInformation) != &o) {
    hidl_u.outputOperandInformation = std::move(o);
  }
}

::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::OperandInformation&(
    ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
        outputOperandInformation)() {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::outputOperandInformation)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::outputOperandInformation));
  }

  return hidl_u.outputOperandInformation;
}

const ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
    OperandInformation&(::android::hardware::neuralnetworks::V1_2::
                            FmqRequestDatum::outputOperandInformation)() const {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::outputOperandInformation)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::outputOperandInformation));
  }

  return hidl_u.outputOperandInformation;
}

void ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
    outputOperandDimensionValue(uint32_t o) {
  if (hidl_d != hidl_discriminator::outputOperandDimensionValue) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.outputOperandDimensionValue) uint32_t(o);
    hidl_d = hidl_discriminator::outputOperandDimensionValue;
  } else if (&(hidl_u.outputOperandDimensionValue) != &o) {
    hidl_u.outputOperandDimensionValue = o;
  }
}

uint32_t&(::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
              outputOperandDimensionValue)() {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::outputOperandDimensionValue)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::outputOperandDimensionValue));
  }

  return hidl_u.outputOperandDimensionValue;
}

uint32_t(::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
             outputOperandDimensionValue)() const {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::outputOperandDimensionValue)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::outputOperandDimensionValue));
  }

  return hidl_u.outputOperandDimensionValue;
}

void ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::poolIdentifier(
    int32_t o) {
  if (hidl_d != hidl_discriminator::poolIdentifier) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.poolIdentifier) int32_t(o);
    hidl_d = hidl_discriminator::poolIdentifier;
  } else if (&(hidl_u.poolIdentifier) != &o) {
    hidl_u.poolIdentifier = o;
  }
}

int32_t&(::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
             poolIdentifier)() {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::poolIdentifier)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::poolIdentifier));
  }

  return hidl_u.poolIdentifier;
}

int32_t(::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
            poolIdentifier)() const {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::poolIdentifier)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::poolIdentifier));
  }

  return hidl_u.poolIdentifier;
}

void ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::measureTiming(
    ::android::hardware::neuralnetworks::V1_2::MeasureTiming o) {
  if (hidl_d != hidl_discriminator::measureTiming) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.measureTiming)::android::hardware::neuralnetworks::V1_2::
        MeasureTiming(o);
    hidl_d = hidl_discriminator::measureTiming;
  } else if (&(hidl_u.measureTiming) != &o) {
    hidl_u.measureTiming = o;
  }
}

::android::hardware::neuralnetworks::V1_2::MeasureTiming&(
    ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
        measureTiming)() {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::measureTiming)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::measureTiming));
  }

  return hidl_u.measureTiming;
}

::android::hardware::neuralnetworks::V1_2::MeasureTiming(
    ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::measureTiming)()
    const {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::measureTiming)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::measureTiming));
  }

  return hidl_u.measureTiming;
}

::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::hidl_union::
    hidl_union() {}

::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::hidl_union::
    ~hidl_union() {}

::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::hidl_discriminator(
    ::android::hardware::neuralnetworks::V1_2::FmqRequestDatum::
        getDiscriminator)() const {
  return hidl_d;
}

::android::hardware::neuralnetworks::V1_2::FmqResultDatum::FmqResultDatum() {
  static_assert(
      offsetof(::android::hardware::neuralnetworks::V1_2::FmqResultDatum,
               hidl_d) == 0,
      "wrong offset");
  static_assert(
      offsetof(::android::hardware::neuralnetworks::V1_2::FmqResultDatum,
               hidl_u) == 8,
      "wrong offset");

  ::std::memset(&hidl_u, 0, sizeof(hidl_u));
  ::std::memset(reinterpret_cast<uint8_t*>(this) + 1, 0, 7);
  // no padding to zero starting at offset 24

  hidl_d = hidl_discriminator::packetInformation;
  new (&hidl_u.packetInformation)::android::hardware::neuralnetworks::V1_2::
      FmqResultDatum::PacketInformation();
}

::android::hardware::neuralnetworks::V1_2::FmqResultDatum::~FmqResultDatum() {
  hidl_destructUnion();
}

::android::hardware::neuralnetworks::V1_2::FmqResultDatum::FmqResultDatum(
    FmqResultDatum&& other)
    : ::android::hardware::neuralnetworks::V1_2::FmqResultDatum() {
  switch (other.hidl_d) {
    case hidl_discriminator::packetInformation: {
      new (&hidl_u.packetInformation)::android::hardware::neuralnetworks::V1_2::
          FmqResultDatum::PacketInformation(
              std::move(other.hidl_u.packetInformation));
      break;
    }
    case hidl_discriminator::operandInformation: {
      new (&hidl_u.operandInformation)::android::hardware::neuralnetworks::
          V1_2::FmqResultDatum::OperandInformation(
              std::move(other.hidl_u.operandInformation));
      break;
    }
    case hidl_discriminator::operandDimensionValue: {
      new (&hidl_u.operandDimensionValue)
          uint32_t(std::move(other.hidl_u.operandDimensionValue));
      break;
    }
    case hidl_discriminator::executionTiming: {
      new (&hidl_u.executionTiming)::android::hardware::neuralnetworks::V1_2::
          Timing(std::move(other.hidl_u.executionTiming));
      break;
    }
    default: {
      ::android::hardware::details::logAlwaysFatal(
          ("Unknown union discriminator (value: " +
           std::to_string((uint8_t)other.hidl_d) + ").")
              .c_str());
    }
  }

  hidl_d = other.hidl_d;
}

::android::hardware::neuralnetworks::V1_2::FmqResultDatum::FmqResultDatum(
    const FmqResultDatum& other)
    : ::android::hardware::neuralnetworks::V1_2::FmqResultDatum() {
  switch (other.hidl_d) {
    case hidl_discriminator::packetInformation: {
      new (&hidl_u.packetInformation)::android::hardware::neuralnetworks::V1_2::
          FmqResultDatum::PacketInformation(other.hidl_u.packetInformation);
      break;
    }
    case hidl_discriminator::operandInformation: {
      new (&hidl_u.operandInformation)::android::hardware::neuralnetworks::
          V1_2::FmqResultDatum::OperandInformation(
              other.hidl_u.operandInformation);
      break;
    }
    case hidl_discriminator::operandDimensionValue: {
      new (&hidl_u.operandDimensionValue)
          uint32_t(other.hidl_u.operandDimensionValue);
      break;
    }
    case hidl_discriminator::executionTiming: {
      new (&hidl_u.executionTiming)::android::hardware::neuralnetworks::V1_2::
          Timing(other.hidl_u.executionTiming);
      break;
    }
    default: {
      ::android::hardware::details::logAlwaysFatal(
          ("Unknown union discriminator (value: " +
           std::to_string((uint8_t)other.hidl_d) + ").")
              .c_str());
    }
  }

  hidl_d = other.hidl_d;
}

::android::hardware::neuralnetworks::V1_2::FmqResultDatum&(
    ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::operator=)(
    FmqResultDatum&& other) {
  if (this == &other) {
    return *this;
  }

  switch (other.hidl_d) {
    case hidl_discriminator::packetInformation: {
      packetInformation(std::move(other.hidl_u.packetInformation));
      break;
    }
    case hidl_discriminator::operandInformation: {
      operandInformation(std::move(other.hidl_u.operandInformation));
      break;
    }
    case hidl_discriminator::operandDimensionValue: {
      operandDimensionValue(std::move(other.hidl_u.operandDimensionValue));
      break;
    }
    case hidl_discriminator::executionTiming: {
      executionTiming(std::move(other.hidl_u.executionTiming));
      break;
    }
    default: {
      ::android::hardware::details::logAlwaysFatal(
          ("Unknown union discriminator (value: " +
           std::to_string((uint8_t)other.hidl_d) + ").")
              .c_str());
    }
  }
  return *this;
}

::android::hardware::neuralnetworks::V1_2::FmqResultDatum&(
    ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::operator=)(
    const FmqResultDatum& other) {
  if (this == &other) {
    return *this;
  }

  switch (other.hidl_d) {
    case hidl_discriminator::packetInformation: {
      packetInformation(other.hidl_u.packetInformation);
      break;
    }
    case hidl_discriminator::operandInformation: {
      operandInformation(other.hidl_u.operandInformation);
      break;
    }
    case hidl_discriminator::operandDimensionValue: {
      operandDimensionValue(other.hidl_u.operandDimensionValue);
      break;
    }
    case hidl_discriminator::executionTiming: {
      executionTiming(other.hidl_u.executionTiming);
      break;
    }
    default: {
      ::android::hardware::details::logAlwaysFatal(
          ("Unknown union discriminator (value: " +
           std::to_string((uint8_t)other.hidl_d) + ").")
              .c_str());
    }
  }
  return *this;
}

void ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::
    hidl_destructUnion() {
  switch (hidl_d) {
    case hidl_discriminator::packetInformation: {
      ::android::hardware::details::destructElement(
          &(hidl_u.packetInformation));
      break;
    }
    case hidl_discriminator::operandInformation: {
      ::android::hardware::details::destructElement(
          &(hidl_u.operandInformation));
      break;
    }
    case hidl_discriminator::operandDimensionValue: {
      ::android::hardware::details::destructElement(
          &(hidl_u.operandDimensionValue));
      break;
    }
    case hidl_discriminator::executionTiming: {
      ::android::hardware::details::destructElement(&(hidl_u.executionTiming));
      break;
    }
    default: {
      ::android::hardware::details::logAlwaysFatal(
          ("Unknown union discriminator (value: " +
           std::to_string((uint8_t)hidl_d) + ").")
              .c_str());
    }
  }
}

void ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::
    packetInformation(const ::android::hardware::neuralnetworks::V1_2::
                          FmqResultDatum::PacketInformation& o) {
  if (hidl_d != hidl_discriminator::packetInformation) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.packetInformation)::android::hardware::neuralnetworks::V1_2::
        FmqResultDatum::PacketInformation(o);
    hidl_d = hidl_discriminator::packetInformation;
  } else if (&(hidl_u.packetInformation) != &o) {
    hidl_u.packetInformation = o;
  }
}

void ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::
    packetInformation(::android::hardware::neuralnetworks::V1_2::
                          FmqResultDatum::PacketInformation&& o) {
  if (hidl_d != hidl_discriminator::packetInformation) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.packetInformation)::android::hardware::neuralnetworks::V1_2::
        FmqResultDatum::PacketInformation(std::move(o));
    hidl_d = hidl_discriminator::packetInformation;
  } else if (&(hidl_u.packetInformation) != &o) {
    hidl_u.packetInformation = std::move(o);
  }
}

::android::hardware::neuralnetworks::V1_2::FmqResultDatum::PacketInformation&(
    ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::
        packetInformation)() {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::packetInformation)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::packetInformation));
  }

  return hidl_u.packetInformation;
}

const ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::
    PacketInformation&(::android::hardware::neuralnetworks::V1_2::
                           FmqResultDatum::packetInformation)() const {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::packetInformation)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::packetInformation));
  }

  return hidl_u.packetInformation;
}

void ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::
    operandInformation(const ::android::hardware::neuralnetworks::V1_2::
                           FmqResultDatum::OperandInformation& o) {
  if (hidl_d != hidl_discriminator::operandInformation) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.operandInformation)::android::hardware::neuralnetworks::V1_2::
        FmqResultDatum::OperandInformation(o);
    hidl_d = hidl_discriminator::operandInformation;
  } else if (&(hidl_u.operandInformation) != &o) {
    hidl_u.operandInformation = o;
  }
}

void ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::
    operandInformation(::android::hardware::neuralnetworks::V1_2::
                           FmqResultDatum::OperandInformation&& o) {
  if (hidl_d != hidl_discriminator::operandInformation) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.operandInformation)::android::hardware::neuralnetworks::V1_2::
        FmqResultDatum::OperandInformation(std::move(o));
    hidl_d = hidl_discriminator::operandInformation;
  } else if (&(hidl_u.operandInformation) != &o) {
    hidl_u.operandInformation = std::move(o);
  }
}

::android::hardware::neuralnetworks::V1_2::FmqResultDatum::OperandInformation&(
    ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::
        operandInformation)() {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::operandInformation)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::operandInformation));
  }

  return hidl_u.operandInformation;
}

const ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::
    OperandInformation&(::android::hardware::neuralnetworks::V1_2::
                            FmqResultDatum::operandInformation)() const {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::operandInformation)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::operandInformation));
  }

  return hidl_u.operandInformation;
}

void ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::
    operandDimensionValue(uint32_t o) {
  if (hidl_d != hidl_discriminator::operandDimensionValue) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.operandDimensionValue) uint32_t(o);
    hidl_d = hidl_discriminator::operandDimensionValue;
  } else if (&(hidl_u.operandDimensionValue) != &o) {
    hidl_u.operandDimensionValue = o;
  }
}

uint32_t&(::android::hardware::neuralnetworks::V1_2::FmqResultDatum::
              operandDimensionValue)() {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::operandDimensionValue)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::operandDimensionValue));
  }

  return hidl_u.operandDimensionValue;
}

uint32_t(::android::hardware::neuralnetworks::V1_2::FmqResultDatum::
             operandDimensionValue)() const {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::operandDimensionValue)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::operandDimensionValue));
  }

  return hidl_u.operandDimensionValue;
}

void ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::executionTiming(
    const ::android::hardware::neuralnetworks::V1_2::Timing& o) {
  if (hidl_d != hidl_discriminator::executionTiming) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.executionTiming)::android::hardware::neuralnetworks::V1_2::
        Timing(o);
    hidl_d = hidl_discriminator::executionTiming;
  } else if (&(hidl_u.executionTiming) != &o) {
    hidl_u.executionTiming = o;
  }
}

void ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::executionTiming(
    ::android::hardware::neuralnetworks::V1_2::Timing&& o) {
  if (hidl_d != hidl_discriminator::executionTiming) {
    hidl_destructUnion();
    ::std::memset(&hidl_u, 0, sizeof(hidl_u));

    new (&hidl_u.executionTiming)::android::hardware::neuralnetworks::V1_2::
        Timing(std::move(o));
    hidl_d = hidl_discriminator::executionTiming;
  } else if (&(hidl_u.executionTiming) != &o) {
    hidl_u.executionTiming = std::move(o);
  }
}

::android::hardware::neuralnetworks::V1_2::Timing&(
    ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::
        executionTiming)() {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::executionTiming)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::executionTiming));
  }

  return hidl_u.executionTiming;
}

const ::android::hardware::neuralnetworks::V1_2::Timing&(
    ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::
        executionTiming)() const {
  if (CC_UNLIKELY(hidl_d != hidl_discriminator::executionTiming)) {
    LOG_ALWAYS_FATAL(
        "Bad safe_union access: safe_union has discriminator %" PRIu64
        " but discriminator %" PRIu64 " was accessed.",
        static_cast<uint64_t>(hidl_d),
        static_cast<uint64_t>(hidl_discriminator::executionTiming));
  }

  return hidl_u.executionTiming;
}

::android::hardware::neuralnetworks::V1_2::FmqResultDatum::hidl_union::
    hidl_union() {}

::android::hardware::neuralnetworks::V1_2::FmqResultDatum::hidl_union::
    ~hidl_union() {}

::android::hardware::neuralnetworks::V1_2::FmqResultDatum::hidl_discriminator(
    ::android::hardware::neuralnetworks::V1_2::FmqResultDatum::
        getDiscriminator)() const {
  return hidl_d;
}

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