// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include "Array.hpp" namespace rocRoller { template auto emptySlot(std::array const& array) { return std::ranges::find_if(array, [](auto const& slot) { return !slot; }); } template auto emptySlot(std::array& array) { return std::ranges::find_if(array, [](auto const& slot) { return !slot; }); } template void append(std::array& array, T value) { auto iter = emptySlot(array); AssertFatal(iter != array.end(), "Array is full!"); *iter = std::move(value); } template requires CInputRangeOf void append(std::array& array, C values) { auto arrayIter = emptySlot(array); if constexpr(std::ranges::sized_range) { auto remainingSlots = array.end() - arrayIter; auto numValues = std::ranges::size(values); AssertFatal(remainingSlots >= numValues, "Array is full!", ShowValue(remainingSlots), ShowValue(numValues)); } auto valueIter = values.begin(); for(; valueIter != values.end() && arrayIter != array.end(); ++arrayIter, ++valueIter) { AssertFatal(!*arrayIter, "Array values not contiguous!"); *arrayIter = std::move(*valueIter); } AssertFatal(valueIter == values.end(), "Array is full!"); } }