31template <
size_t requiredFlagBitsPerItem>
37 FlagCache() =
default;
39 explicit FlagCache (
size_t items)
40 : flags (divCeil (items, groupsPerWord))
42 std::fill (flags.begin(), flags.end(), 0);
45 void set (
size_t index, FlagType bits)
47 const auto flagIndex = index / groupsPerWord;
48 jassert (flagIndex < flags.size());
49 const auto groupIndex = index - (flagIndex * groupsPerWord);
56 template <
typename Callback>
57 void ifSet (Callback&& callback)
59 for (
size_t flagIndex = 0; flagIndex < flags.size(); ++flagIndex)
63 for (
size_t group = 0; group < groupsPerWord; ++group)
65 const auto masked = moveFromGroupPosition (prevFlags, group);
68 callback ((flagIndex * groupsPerWord) + group, masked);
75 std::fill (flags.begin(), flags.end(), 0);
88 static constexpr FlagType moveToGroupPosition (FlagType ungrouped,
size_t groupIndex)
90 return (ungrouped & groupMask) << (groupIndex * bitsPerFlagGroup);
101 static constexpr FlagType moveFromGroupPosition (FlagType grouped,
size_t groupIndex)
103 return (grouped >> (groupIndex * bitsPerFlagGroup)) & groupMask;
106 static constexpr size_t findNextPowerOfTwoImpl (
size_t n,
size_t shift)
108 return shift == 32 ? n : findNextPowerOfTwoImpl (n | (n >> shift), shift * 2);
111 static constexpr size_t findNextPowerOfTwo (
size_t value)
113 return findNextPowerOfTwoImpl (value - 1, 1) + 1;
116 static constexpr size_t divCeil (
size_t a,
size_t b)
118 return (a / b) + ((a % b) != 0);
121 static constexpr size_t bitsPerFlagGroup = findNextPowerOfTwo (requiredFlagBitsPerItem);
122 static constexpr size_t groupsPerWord = (8 *
sizeof (FlagType)) / bitsPerFlagGroup;
123 static constexpr FlagType groupMask = ((FlagType) 1 << requiredFlagBitsPerItem) - 1;
128template <
size_t requiredFlagBitsPerItem>
129class FlaggedFloatCache
132 FlaggedFloatCache() =
default;
134 explicit FlaggedFloatCache (
size_t sizeIn)
138 std::fill (values.begin(), values.end(), 0.0f);
141 size_t size() const noexcept {
return values.size(); }
143 float exchangeValue (
size_t index,
float value)
149 void setBits (
size_t index, uint32_t bits) { flags.set (index, bits); }
151 void setValueAndBits (
size_t index,
float value, uint32_t bits)
153 exchangeValue (index, value);
154 setBits (index, bits);
157 float get (
size_t index)
const noexcept
166 template <
typename Callback>
167 void ifSet (Callback&& callback)
169 flags.ifSet ([
this, &callback] (
size_t groupIndex, uint32_t bits)
177 FlagCache<requiredFlagBitsPerItem> flags;
auto & get(ProcessorChain< Processors... > &chain) noexcept
Non-member equivalent of ProcessorChain::get which avoids awkward member template syntax.