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

// fidl_experiment = output_index_json

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

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

::test_doccomments::Struct::Storage_ test_doccomments::Struct::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.field)};
}

::test_doccomments::Table::Storage_ test_doccomments::Table::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.field)};
}

std::shared_ptr<::test_doccomments::StrictUnion::Storage_> test_doccomments::StrictUnion::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_doccomments::FlexibleUnion::Storage_> test_doccomments::FlexibleUnion::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
