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

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

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

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

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

std::shared_ptr<::test_placementofattributes::ExampleXUnion::Storage_>
test_placementofattributes::ExampleXUnion::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_>();
  }
}

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_>();
  }
}
