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

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

::test_unknowninteractions::ExampleFlexibleTwoWayResponse::Storage_
test_unknowninteractions::ExampleFlexibleTwoWayResponse::CloneStorage_() const {
  return Storage_{::fidl::internal::NaturalClone(storage_.__reserved)};
}

::test_unknowninteractions::ExampleFlexibleTwoWayTopResponse::Storage_
test_unknowninteractions::ExampleFlexibleTwoWayTopResponse::CloneStorage_()
    const {
  return Storage_{::fidl::internal::NaturalClone(storage_.result)};
}

std::shared_ptr<
    ::test_unknowninteractions::ExampleFlexibleTwoWayResult::Storage_>
test_unknowninteractions::ExampleFlexibleTwoWayResult::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)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}
