36 #ifndef GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ 
   37 #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ 
   49 #include <type_traits> 
   50 #include <unordered_map> 
   62 template <
class ParamType>
 
   73   template <
class ParamType>
 
   89                                            const CodeLocation& code_location);
 
  118   virtual const T* 
Current() 
const = 0;
 
  128 template <
typename T>
 
  138     if (
this != &other) 
impl_.reset(other.
impl_->Clone());
 
  159     return !(*
this == other);
 
  165   std::unique_ptr<ParamIteratorInterface<T>> 
impl_;
 
  170 template <
typename T>
 
  187 template <
typename T>
 
  204   std::shared_ptr<const ParamGeneratorInterface<T>> 
impl_;
 
  211 template <
typename T, 
typename IncrementT>
 
  251           << 
"The program attempted to compare iterators " 
  252           << 
"from different generators." << std::endl;
 
  253       const int other_index =
 
  254           CheckedDowncastToActualType<const Iterator>(&other)->
index_;
 
  255       return index_ == other_index;
 
  276                                const IncrementT& step) {
 
  278     for (
T i = begin; i < end; i = static_cast<T>(
i + step)) end_index++;
 
  297 template <
typename T>
 
  300   template <
typename ForwardIterator>
 
  318              typename ContainerType::const_iterator iterator)
 
  347           << 
"The program attempted to compare iterators " 
  348           << 
"from different generators." << std::endl;
 
  350              CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
 
  381 template <
class ParamType>
 
  383   return std::to_string(info.
index);
 
  386 template <
typename T = 
int>
 
  388   static_assert(
sizeof(
T) == 0, 
"Empty arguments are not allowed.");
 
  390 template <
typename T = 
int>
 
  397 template <
class TestClass>
 
  405     return new TestClass();
 
  419 template <
class ParamType>
 
  435 template <
class TestSuite>
 
  504 template <
class TestSuite>
 
  533                       const char* test_base_name,
 
  537         new TestInfo(test_base_name, meta_factory, std::move(code_location)));
 
  542                                 GeneratorCreationFunc* 
func,
 
  544                                 const char* file, 
int line) {
 
  545     instantiations_.emplace_back(std::move(instantiation_name), func, name_func,
 
  555     bool generated_instantiations = 
false;
 
  557     std::string test_suite_name;
 
  558     std::string test_name;
 
  559     for (
const std::shared_ptr<TestInfo>& test_info : 
tests_) {
 
  561         const std::string& instantiation_name = instantiation.name;
 
  564         const char* file = instantiation.file;
 
  565         int line = instantiation.line;
 
  567         if (!instantiation_name.empty())
 
  568           test_suite_name = instantiation_name + 
"/";
 
  570           test_suite_name.clear();
 
  574         std::set<std::string> test_param_names;
 
  575         for (
const auto& param : generator) {
 
  576           generated_instantiations = 
true;
 
  580           std::string param_name =
 
  584               << 
"Parameterized test name '" << param_name
 
  585               << 
"' is invalid (contains spaces, dashes, or any " 
  586                  "non-alphanumeric characters other than underscores), in " 
  587               << file << 
" line " << line << 
"" << std::endl;
 
  590               << 
"Duplicate parameterized test name '" << param_name << 
"', in " 
  591               << file << 
" line " << line << std::endl;
 
  593           if (!test_info->test_base_name.empty()) {
 
  594             test_name.append(test_info->test_base_name).append(
"/");
 
  596           test_name += param_name;
 
  598           test_param_names.insert(std::move(param_name));
 
  601               test_suite_name, test_name.c_str(),
 
  607               test_info->test_meta_factory->CreateTestFactory(param));
 
  613     if (!generated_instantiations) {
 
  643         : 
name(std::move(name_in)),
 
  659     if (name.empty()) 
return false;
 
  662     for (std::string::size_type index = 0; index < name.size(); ++index) {
 
  663       if (!
IsAlNum(name[index]) && name[index] != 
'_') 
return false;
 
  680 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 
  681 template <
class TestCase>
 
  683 #endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 
  696       delete test_suite_info;
 
  702   template <
class TestSuite>
 
  704       std::string test_suite_name, 
CodeLocation code_location) {
 
  710       if (test_suite_info->GetTestSuiteTypeId() != GetTypeId<TestSuite>()) {
 
  721             CheckedDowncastToActualType<ParameterizedTestSuiteInfo<TestSuite>>(
 
  725     if (typed_test_info == 
nullptr) {
 
  727           test_suite_name, std::move(code_location));
 
  732     return typed_test_info;
 
  736       test_suite_info->RegisterTests();
 
  740 #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 
  741   template <
class TestCase>
 
  743       std::string test_case_name, 
CodeLocation code_location) {
 
  744     return GetTestSuitePatternHolder<TestCase>(std::move(test_case_name),
 
  745                                                std::move(code_location));
 
  748 #endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_ 
  787   std::map<std::string, TypeParameterizedTestSuiteInfo> 
suites_;
 
  794 template <
class Container>
 
  803 template <typename... Ts>
 
  808   template <
typename T>
 
  810     return ValuesIn(MakeVector<T>(std::make_index_sequence<
sizeof...(Ts)>()));
 
  814   template <
typename T, 
size_t... I>
 
  816     return std::vector<T>{
static_cast<T>(v_.template Get<I>())...};
 
  824 template <typename... 
T>
 
  825 class CartesianProductGenerator
 
  828   typedef ::std::tuple<T...> ParamType;
 
  832   ~CartesianProductGenerator() 
override = 
default;
 
  834   ParamIteratorInterface<ParamType>* Begin()
 const override {
 
  835     return new Iterator(
this, generators_, 
false);
 
  837   ParamIteratorInterface<ParamType>* End()
 const override {
 
  838     return new Iterator(
this, generators_, 
true);
 
  844   template <
size_t... I>
 
  845   class IteratorImpl<std::index_sequence<I...>>
 
  846       : 
public ParamIteratorInterface<ParamType> {
 
  848     IteratorImpl(
const ParamGeneratorInterface<ParamType>* base,
 
  849                  const std::tuple<ParamGenerator<T>...>& generators,
 
  852           begin_(std::get<I>(generators).begin()...),
 
  853           end_(std::get<I>(generators).end()...),
 
  854           current_(is_end ? end_ : begin_) {
 
  855       ComputeCurrentValue();
 
  857     ~IteratorImpl() 
override = 
default;
 
  859     const ParamGeneratorInterface<ParamType>* BaseGenerator()
 const override {
 
  864     void Advance()
 override {
 
  867       ++std::get<
sizeof...(T) - 1>(current_);
 
  869       AdvanceIfEnd<
sizeof...(T) - 1>();
 
  870       ComputeCurrentValue();
 
  872     ParamIteratorInterface<ParamType>* Clone()
 const override {
 
  873       return new IteratorImpl(*
this);
 
  876     const ParamType* Current()
 const override { 
return current_value_.get(); }
 
  878     bool Equals(
const ParamIteratorInterface<ParamType>& other)
 const override {
 
  882           << 
"The program attempted to compare iterators " 
  883           << 
"from different generators." << std::endl;
 
  884       const IteratorImpl* typed_other =
 
  885           CheckedDowncastToActualType<const IteratorImpl>(&other);
 
  890       if (AtEnd() && typed_other->AtEnd()) 
return true;
 
  894           (same = same && std::get<I>(current_) ==
 
  895                               std::get<I>(typed_other->current_))...};
 
  901     template <
size_t ThisI>
 
  902     void AdvanceIfEnd() {
 
  903       if (std::get<ThisI>(current_) != std::get<ThisI>(end_)) 
return;
 
  905       bool last = ThisI == 0;
 
  911       constexpr 
size_t NextI = ThisI - (ThisI != 0);
 
  912       std::get<ThisI>(current_) = std::get<ThisI>(begin_);
 
  913       ++std::get<NextI>(current_);
 
  914       AdvanceIfEnd<NextI>();
 
  917     void ComputeCurrentValue() {
 
  919         current_value_ = std::make_shared<ParamType>(*std::get<I>(current_)...);
 
  924           (at_end = at_end || std::get<I>(current_) == std::get<I>(end_))...};
 
  929     const ParamGeneratorInterface<ParamType>* 
const base_;
 
  930     std::tuple<typename ParamGenerator<T>::iterator...> begin_;
 
  931     std::tuple<typename ParamGenerator<T>::iterator...> end_;
 
  932     std::tuple<typename ParamGenerator<T>::iterator...> current_;
 
  933     std::shared_ptr<ParamType> current_value_;
 
  936   using Iterator = IteratorImpl<std::make_index_sequence<
sizeof...(T)>>;
 
  938   std::tuple<ParamGenerator<T>...> generators_;
 
  941 template <
class... Gen>
 
  945   template <
typename... T>
 
  948         new CartesianProductGenerator<T...>(generators_));
 
  955 template <
typename From, 
typename To>
 
  959       : generator_(std::move(gen)) {}
 
  962     return new Iterator(
this, generator_.begin(), generator_.end());
 
  965     return new Iterator(
this, generator_.end(), generator_.end());
 
  973         : base_(base), it_(it), end_(end) {
 
  974       if (it_ != end_) 
value_ = std::make_shared<To>(
static_cast<To>(*it_));
 
  983       if (it_ != end_) 
value_ = std::make_shared<To>(
static_cast<To>(*it_));
 
  993           << 
"The program attempted to compare iterators " 
  994           << 
"from different generators." << std::endl;
 
  996           CheckedDowncastToActualType<const Iterator>(&other)->it_;
 
  997       return it_ == other_it;
 
 1012 template <
class Gen>
 
 1016       : generator_(std::move(g)) {}
 
 1018   template <
typename T>
 
 1030 #endif  // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ 
::std::unordered_map< std::string, size_t > suite_name_to_info_index_
 
virtual TypeId GetTestSuiteTypeId() const =0
 
virtual ParamIteratorInterface< T > * End() const =0
 
::std::vector< T > ContainerType
 
::std::vector< std::shared_ptr< TestInfo >> TestInfoContainer
 
~RangeGenerator() override=default
 
const ParamGeneratorInterface< T > *const base_
 
ParamGenerator(const ParamGenerator &other)
 
static SetUpTearDownSuiteFuncType GetTearDownCaseOrSuite(const char *filename, int line_num)
 
std::tuple< Gen...> generators_
 
void RegisterInstantiation(const char *test_suite_name)
 
void operator=(const RangeGenerator &other)
 
ParamIterator< T > iterator
 
std::shared_ptr< To > value_
 
TypeId GetTestSuiteTypeId() const override
 
const std::unique_ptr< TestMetaFactoryBase< ParamType > > test_meta_factory
 
Iterator(const ParamGeneratorInterface< T > *base, T value, int index, IncrementT step)
 
bool operator==(const ParamIterator &other) const 
 
~ParameterizedTestSuiteRegistry()
 
ParamIteratorInterface< T > * End() const override
 
void operator=(const Iterator &other)
 
::std::string PrintToString(const T &value)
 
const ContainerType container_
 
virtual ~ParamIteratorInterface()=default
 
ParamIterator< From > it_
 
ParameterizedTestSuiteInfo< TestSuite > * GetTestSuitePatternHolder(std::string test_suite_name, CodeLocation code_location)
 
virtual bool Equals(const ParamIteratorInterface &other) const =0
 
const ParamGeneratorInterface< To > * BaseGenerator() const override
 
GeneratorCreationFunc * generator
 
Iterator(const Iterator &other)
 
ParameterizedTestSuiteRegistry & operator=(const ParameterizedTestSuiteRegistry &)=delete
 
constexpr bool Equals(const char(&a)[N], const char(&b)[M])
 
ParameterizedTestFactory & operator=(const ParameterizedTestFactory &)=delete
 
const To * Current() const override
 
ParamConverterGenerator(ParamGenerator< Gen > g)
 
::std::vector< InstantiationInfo > InstantiationContainer
 
TestSuiteInfoContainer test_suite_infos_
 
InstantiationInfo(std::string name_in, GeneratorCreationFunc *generator_in, ParamNameGeneratorFunc *name_func_in, const char *file_in, int line_in)
 
TestParamInfo(const ParamType &a_param, size_t an_index)
 
CartesianProductHolder(const Gen &...g)
 
static bool IsValidParamName(const std::string &name)
 
const CodeLocation code_location
 
std::vector< T > MakeVector(std::index_sequence< I...>) const 
 
ParamIteratorInterface< To > * Begin() const override
 
RangeGenerator(T begin, T end, IncrementT step)
 
ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
 
std::unique_ptr< const T > value_
 
internal::ParamGenerator< typename std::iterator_traits< ForwardIterator >::value_type > ValuesIn(ForwardIterator begin, ForwardIterator end)
 
ParamGenerator & operator=(const ParamGenerator &other)
 
bool Equals(const ParamIteratorInterface< T > &other) const override
 
GTEST_API_ void ReportInvalidTestSuiteType(const char *test_suite_name, const CodeLocation &code_location)
 
ParamIterator(const ParamIterator &other)
 
Test * CreateTest() override
 
CodeLocation code_location_
 
ParamIteratorInterface< T > * Begin() const override
 
virtual const T * Current() const =0
 
ParamGenerator< Gen > generator_
 
ParamIteratorInterface< T > * Clone() const override
 
ParamIteratorInterface< To > * End() const override
 
ParameterizedTestSuiteRegistry()=default
 
const ParamGeneratorInterface< T > *const base_
 
void RegisterTests() override
 
ContainerType::const_iterator iterator_
 
static int CalculateEndIndex(const T &begin, const T &end, const IncrementT &step)
 
expr expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c *expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 c
 
Iterator(const ParamGeneratorInterface< To > *base, ParamIterator< From > it, ParamIterator< From > end)
 
~Iterator() override=default
 
ParamIteratorInterface< To > * Clone() const override
 
virtual ~ParamGeneratorInterface()=default
 
#define GTEST_CHECK_(condition)
 
TestClass::ParamType ParamType
 
ParameterizedTestSuiteInfoBase()
 
ParamIterator operator++(int)
 
ptrdiff_t difference_type
 
std::string(const TestParamInfo< ParamType > &) ParamNameGeneratorFunc
 
ParamGeneratorConverter(ParamGenerator< From > gen)
 
void operator=(const ValuesInIteratorRangeGenerator &other)
 
GTEST_DISABLE_MSC_WARNINGS_POP_() inline const char *SkipComma(const char *str)
 
std::map< std::string, TypeParameterizedTestSuiteInfo > suites_
 
int AddTestSuiteInstantiation(std::string instantiation_name, GeneratorCreationFunc *func, ParamNameGeneratorFunc *name_func, const char *file, int line)
 
~ValuesInIteratorRangeGenerator() override=default
 
ParameterizedTestSuiteInfo & operator=(const ParameterizedTestSuiteInfo &)=delete
 
const ParamGeneratorInterface< T > * BaseGenerator() const override
 
bool operator!=(const ParamIterator &other) const 
 
TestInfo(const char *a_test_base_name, TestMetaFactoryBase< ParamType > *a_test_meta_factory, CodeLocation a_code_location)
 
const std::string test_base_name
 
ParameterizedTestCaseInfo< TestCase > * GetTestCasePatternHolder(std::string test_case_name, CodeLocation code_location)
 
virtual ~ParameterizedTestSuiteInfoBase()=default
 
bool Equals(const ParamIteratorInterface< To > &other) const override
 
InstantiationContainer instantiations_
 
const std::string test_suite_name_
 
virtual void RegisterTests()=0
 
virtual ParamIteratorInterface< T > * Begin() const =0
 
std::string operator()(const TestParamInfo< ParamType > &info) const 
 
const ParamType parameter_
 
::std::vector< ParameterizedTestSuiteInfoBase * > TestSuiteInfoContainer
 
GTEST_API_ void InsertSyntheticTestCase(const std::string &name, CodeLocation location, bool has_test_p)
 
GTEST_API_ TestInfo * MakeAndRegisterTestInfo(std::string test_suite_name, const char *name, const char *type_param, const char *value_param, CodeLocation code_location, TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc, TearDownTestSuiteFunc tear_down_tc, TestFactoryBase *factory)
 
ParamNameGeneratorFunc * name_func
 
std::string DefaultParamName(const TestParamInfo< ParamType > &info)
 
ParamIterator(ParamIteratorInterface< T > *impl)
 
virtual const ParamGeneratorInterface< T > * BaseGenerator() const =0
 
ParamIteratorInterface< T > * Begin() const override
 
ParamGenerator(ParamGeneratorInterface< T > *impl)
 
const T * operator->() const 
 
ParameterizedTestFactory(ParamType parameter)
 
const T * Current() const override
 
ParamIteratorInterface< T > * End() const override
 
void RegisterTestSuite(const char *test_suite_name, CodeLocation code_location)
 
TypeParameterizedTestSuiteInfo(CodeLocation c)
 
void CheckForInstantiations()
 
static SetUpTearDownSuiteFuncType GetSetUpCaseOrSuite(const char *filename, int line_num)
 
std::unique_ptr< ParamIteratorInterface< T > > impl_
 
ParamGenerator< From > generator_
 
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251) class GTEST_API_ TypedTestSuitePState
 
const ParamGeneratorInterface< To > *const base_
 
const T func(int n, T *x)
 
ParameterizedTestSuiteInfo(std::string name, CodeLocation code_location)
 
Iterator(const ParamGeneratorInterface< T > *base, typename ContainerType::const_iterator iterator)
 
const std::string & GetTestSuiteName() const override
 
ParameterizedTestSuiteInfoBase & operator=(const ParameterizedTestSuiteInfoBase &)=delete
 
virtual ParamIteratorInterface * Clone() const =0
 
const T & operator*() const 
 
ParamIteratorInterface< T > * Clone() const override
 
~Iterator() override=default
 
const ParamGeneratorInterface< T > * BaseGenerator() const override
 
const T * Current() const override
 
typename TestSuite::ParamType ParamType
 
void AddTestPattern(const char *, const char *test_base_name, TestMetaFactoryBase< ParamType > *meta_factory, CodeLocation code_location)
 
ParamIterator & operator=(const ParamIterator &other)
 
bool Equals(const ParamIteratorInterface< T > &other) const override
 
std::shared_ptr< const ParamGeneratorInterface< T > > impl_
 
virtual const std::string & GetTestSuiteName() const =0
 
CodeLocation code_location
 
ParamIterator< From > end_
 
ParamIterator & operator++()