// WARNING: This file is machine generated by fidlgen.

// fidl_experiment = output_index_json

#include <fidl/test.placementofattributes/cpp/natural_types.h>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

::test_placementofattributes::ExampleProtocolMethodRequest::Storage_ test_placementofattributes::ExampleProtocolMethodRequest::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.arg)};
}

::test_placementofattributes::ExampleStruct::Storage_ test_placementofattributes::ExampleStruct::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.member)};
}

::test_placementofattributes::ExampleTable::Storage_ test_placementofattributes::ExampleTable::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.member)};
}

std::shared_ptr<::test_placementofattributes::ExampleUnion::Storage_> test_placementofattributes::ExampleUnion::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

#pragma clang diagnostic pop
