constexpr void reinit_expected()

in src/iceberg/expected.h [322:346]


constexpr void reinit_expected(First& new_val, Second& old_val, Args&&... args) noexcept(
    std::is_nothrow_constructible_v<First, Args...>) {
  if constexpr (std::is_nothrow_constructible_v<First, Args...>) {
    if constexpr (!std::is_trivially_destructible_v<Second>) {
      old_val.~Second();
    }
    std::construct_at(std::addressof(new_val), std::forward<Args>(args)...);
  } else if constexpr (std::is_nothrow_move_constructible_v<First>) {
    First tmp(std::forward<Args>(args)...);
    if constexpr (!std::is_trivially_destructible_v<Second>) {
      old_val.~Second();
    }
    std::construct_at(std::addressof(new_val), std::move(tmp));
  } else {
    Second tmp(std::move(old_val));
    if constexpr (!std::is_trivially_destructible_v<Second>) {
      old_val.~Second();
    }

    expected_detail::ReinitGuard<Second> guard{std::addressof(old_val),
                                               std::addressof(tmp)};
    std::construct_at(std::addressof(new_val), std::forward<Args>(args)...);
    guard._target = nullptr;
  }
}