Merge f1e068d5c577a019f1f6c199f2e3f21859c45d13 into d72f9c8aea6817cdf1ca0ac10887f328de7f3da2

This commit is contained in:
Jeremy Nimmer 2026-03-31 11:33:35 -04:00 committed by GitHub
commit c38dd0780a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -99,6 +99,7 @@ class [[nodiscard]] ParamGenerator;
template <typename T>
class [[nodiscard]] ParamIteratorInterface {
public:
ParamIteratorInterface() = default;
virtual ~ParamIteratorInterface() = default;
// A pointer to the base generator instance.
// Used only for the purposes of iterator comparison
@ -121,6 +122,9 @@ class [[nodiscard]] ParamIteratorInterface {
// element in the sequence generated by the generator.
// Used for implementing ParamGenerator<T>::operator==().
virtual bool Equals(const ParamIteratorInterface& other) const = 0;
protected:
// Make available for subclasses to use to implement Clone().
ParamIteratorInterface(const ParamIteratorInterface&) = default;
};
// Class iterating over elements provided by an implementation of
@ -844,7 +848,7 @@ class [[nodiscard]] CartesianProductGenerator
template <class I>
class IteratorImpl;
template <size_t... I>
class IteratorImpl<std::index_sequence<I...>>
class IteratorImpl<std::index_sequence<I...>> final
: public ParamIteratorInterface<ParamType> {
public:
IteratorImpl(const ParamGeneratorInterface<ParamType>* base,
@ -856,7 +860,7 @@ class [[nodiscard]] CartesianProductGenerator
current_(is_end ? end_ : begin_) {
ComputeCurrentValue();
}
~IteratorImpl() override = default;
~IteratorImpl() final = default;
const ParamGeneratorInterface<ParamType>* BaseGenerator() const override {
return base_;
@ -900,6 +904,8 @@ class [[nodiscard]] CartesianProductGenerator
}
private:
IteratorImpl(const IteratorImpl&) = default;
template <size_t ThisI>
void AdvanceIfEnd() {
if (std::get<ThisI>(current_) != std::get<ThisI>(end_)) return;