File indexing completed on 2026-11-07 10:11:33
0001
0002
0003
0004
0005
0006
0007
0008 #pragma once
0009
0010 #include <algorithm>
0011
0012 #include "corecel/Assert.hh"
0013 #include "corecel/Types.hh"
0014
0015 namespace celeritas
0016 {
0017 namespace detail
0018 {
0019
0020 struct PrimaryCapacityInput
0021 {
0022 size_type track_slots{};
0023 size_type initializer_capacity{};
0024 size_type secondary_capacity{};
0025 size_type queued{};
0026 size_type alive{};
0027 };
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037 inline size_type calc_primary_capacity(PrimaryCapacityInput const& input)
0038 {
0039 CELER_EXPECT(input.queued <= input.initializer_capacity);
0040 CELER_EXPECT(input.alive <= input.track_slots);
0041
0042 size_type const available_before_init = input.initializer_capacity
0043 - input.queued;
0044 size_type const vacancies = input.track_slots - input.alive;
0045 size_type const unfilled_vacancies
0046 = vacancies > input.queued ? vacancies - input.queued : 0;
0047 if (unfilled_vacancies >= available_before_init)
0048 {
0049
0050 return available_before_init;
0051 }
0052
0053 size_type const queued_after_init
0054 = input.queued > vacancies ? input.queued - vacancies : 0;
0055 size_type const secondary_reserve
0056 = std::min(input.secondary_capacity, input.initializer_capacity);
0057 size_type const queue_capacity = input.initializer_capacity
0058 - secondary_reserve;
0059 size_type const available_after_init = queued_after_init < queue_capacity
0060 ? queue_capacity
0061 - queued_after_init
0062 : 0;
0063
0064
0065 return unfilled_vacancies
0066 + std::min(available_after_init,
0067 available_before_init - unfilled_vacancies);
0068 }
0069
0070
0071 }
0072 }