<div dir="ltr"><div><a class="gmail_plusreply" id="plusReplyChip-1" href="mailto:benny.kra@googlemail.com" tabindex="-1">@benny.kra@gmail.com</a>,<br><br></div>This commit is triggering deprecation warnings that cause build failures for warning-as-errors builds:<br><span style="font-family:monospace">clangd/unittests/PrintASTTests.cpp:56:1: error: 'InstantiateTestCase_P_IsDeprecated' is deprecated: INSTANTIATE_TEST_CASE_P is deprecated, please use INSTANTIATE_TEST_SUITE_P [-Werror,-Wdeprecated-declarations]<br>INSTANTIATE_TEST_CASE_P(ASTUtilsTests, ASTUtils,<br>^</span><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, May 14, 2021 at 1:17 PM Benjamin Kramer via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Benjamin Kramer<br>
Date: 2021-05-14T19:16:31+02:00<br>
New Revision: d4d80a2903c1d074008cac653cdb0b5fe39b8a00<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/d4d80a2903c1d074008cac653cdb0b5fe39b8a00" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/d4d80a2903c1d074008cac653cdb0b5fe39b8a00</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/d4d80a2903c1d074008cac653cdb0b5fe39b8a00.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/d4d80a2903c1d074008cac653cdb0b5fe39b8a00.diff</a><br>
<br>
LOG: Bump googletest to 1.10.0<br>
<br>
Added: <br>
llvm/utils/unittest/googlemock/include/gmock/gmock-function-mocker.h<br>
llvm/utils/unittest/googlemock/include/gmock/gmock-nice-strict.h<br>
llvm/utils/unittest/googlemock/include/gmock/internal/gmock-pp.h<br>
llvm/utils/unittest/googletest/include/gtest/gtest-matchers.h<br>
llvm/utils/unittest/googletest/src/gtest-matchers.cc<br>
<br>
Modified: <br>
clang/unittests/AST/ASTImporterGenericRedeclTest.cpp<br>
clang/unittests/AST/ASTImporterODRStrategiesTest.cpp<br>
clang/unittests/AST/ASTImporterObjCTest.cpp<br>
clang/unittests/AST/ASTImporterTest.cpp<br>
clang/unittests/AST/ASTImporterVisibilityTest.cpp<br>
clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp<br>
clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp<br>
clang/unittests/Rename/RenameAliasTest.cpp<br>
clang/unittests/Rename/RenameClassTest.cpp<br>
clang/unittests/Rename/RenameEnumTest.cpp<br>
clang/unittests/Rename/RenameMemberTest.cpp<br>
clang/unittests/StaticAnalyzer/RangeSetTest.cpp<br>
clang/unittests/Tooling/Syntax/BuildTreeTest.cpp<br>
clang/unittests/Tooling/Syntax/MutationsTest.cpp<br>
clang/unittests/Tooling/Syntax/SynthesisTest.cpp<br>
clang/unittests/Tooling/Syntax/TreeTest.cpp<br>
flang/unittests/RuntimeGTest/ListInputTest.cpp<br>
lldb/unittests/Host/SocketTest.cpp<br>
lldb/unittests/Process/Utility/LinuxProcMapsTest.cpp<br>
llvm/include/llvm/Testing/Support/Error.h<br>
llvm/unittests/ADT/BitVectorTest.cpp<br>
llvm/unittests/ADT/DenseMapTest.cpp<br>
llvm/unittests/ADT/DenseSetTest.cpp<br>
llvm/unittests/ADT/IListBaseTest.cpp<br>
llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp<br>
llvm/unittests/ADT/MapVectorTest.cpp<br>
llvm/unittests/ADT/PriorityWorklistTest.cpp<br>
llvm/unittests/ADT/RangeAdapterTest.cpp<br>
llvm/unittests/ADT/STLForwardCompatTest.cpp<br>
llvm/unittests/ADT/SmallVectorTest.cpp<br>
llvm/unittests/ADT/TinyPtrVectorTest.cpp<br>
llvm/unittests/Analysis/ValueTrackingTest.cpp<br>
llvm/unittests/CodeGen/DIETest.cpp<br>
llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp<br>
llvm/unittests/DebugInfo/DWARF/DWARFFormValueTest.cpp<br>
llvm/unittests/FileCheck/FileCheckTest.cpp<br>
llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp<br>
llvm/unittests/IR/PassBuilderCallbacksTest.cpp<br>
llvm/unittests/IR/PatternMatch.cpp<br>
llvm/unittests/IR/ValueMapTest.cpp<br>
llvm/unittests/Passes/PluginsTest.cpp<br>
llvm/unittests/ProfileData/CoverageMappingTest.cpp<br>
llvm/unittests/ProfileData/InstrProfTest.cpp<br>
llvm/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp<br>
llvm/unittests/Support/MathExtrasTest.cpp<br>
llvm/unittests/Support/MemoryTest.cpp<br>
llvm/unittests/Support/TargetParserTest.cpp<br>
llvm/unittests/XRay/FDRProducerConsumerTest.cpp<br>
llvm/unittests/XRay/FDRRecordPrinterTest.cpp<br>
llvm/unittests/XRay/GraphTest.cpp<br>
llvm/utils/unittest/googlemock/include/gmock/gmock-actions.h<br>
llvm/utils/unittest/googlemock/include/gmock/gmock-cardinalities.h<br>
llvm/utils/unittest/googlemock/include/gmock/gmock-generated-actions.h<br>
llvm/utils/unittest/googlemock/include/gmock/gmock-generated-function-mockers.h<br>
llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h<br>
llvm/utils/unittest/googlemock/include/gmock/gmock-matchers.h<br>
llvm/utils/unittest/googlemock/include/gmock/gmock-more-actions.h<br>
llvm/utils/unittest/googlemock/include/gmock/gmock-spec-builders.h<br>
llvm/utils/unittest/googlemock/include/gmock/gmock.h<br>
llvm/utils/unittest/googlemock/include/gmock/internal/gmock-internal-utils.h<br>
llvm/utils/unittest/googlemock/include/gmock/internal/gmock-port.h<br>
llvm/utils/unittest/googlemock/src/gmock-cardinalities.cc<br>
llvm/utils/unittest/googlemock/src/gmock-internal-utils.cc<br>
llvm/utils/unittest/googlemock/src/gmock-matchers.cc<br>
llvm/utils/unittest/googlemock/src/gmock-spec-builders.cc<br>
llvm/utils/unittest/googlemock/src/gmock.cc<br>
llvm/utils/unittest/googletest/include/gtest/gtest-death-test.h<br>
llvm/utils/unittest/googletest/include/gtest/gtest-message.h<br>
llvm/utils/unittest/googletest/include/gtest/gtest-param-test.h<br>
llvm/utils/unittest/googletest/include/gtest/gtest-printers.h<br>
llvm/utils/unittest/googletest/include/gtest/gtest-spi.h<br>
llvm/utils/unittest/googletest/include/gtest/gtest-test-part.h<br>
llvm/utils/unittest/googletest/include/gtest/gtest-typed-test.h<br>
llvm/utils/unittest/googletest/include/gtest/gtest.h<br>
llvm/utils/unittest/googletest/include/gtest/gtest_pred_impl.h<br>
llvm/utils/unittest/googletest/include/gtest/internal/gtest-death-test-internal.h<br>
llvm/utils/unittest/googletest/include/gtest/internal/gtest-filepath.h<br>
llvm/utils/unittest/googletest/include/gtest/internal/gtest-internal.h<br>
llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util.h<br>
llvm/utils/unittest/googletest/include/gtest/internal/gtest-port-arch.h<br>
llvm/utils/unittest/googletest/include/gtest/internal/gtest-port.h<br>
llvm/utils/unittest/googletest/include/gtest/internal/gtest-string.h<br>
llvm/utils/unittest/googletest/include/gtest/internal/gtest-type-util.h<br>
llvm/utils/unittest/googletest/src/gtest-all.cc<br>
llvm/utils/unittest/googletest/src/gtest-death-test.cc<br>
llvm/utils/unittest/googletest/src/gtest-filepath.cc<br>
llvm/utils/unittest/googletest/src/gtest-internal-inl.h<br>
llvm/utils/unittest/googletest/src/gtest-port.cc<br>
llvm/utils/unittest/googletest/src/gtest-printers.cc<br>
llvm/utils/unittest/googletest/src/gtest-test-part.cc<br>
llvm/utils/unittest/googletest/src/gtest-typed-test.cc<br>
llvm/utils/unittest/googletest/src/gtest.cc<br>
<br>
Removed: <br>
llvm/utils/unittest/googlemock/include/gmock/gmock-generated-nice-strict.h<br>
llvm/utils/unittest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h<br>
llvm/utils/unittest/googletest/include/gtest/internal/gtest-linked_ptr.h<br>
llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util-generated.h<br>
llvm/utils/unittest/googletest/include/gtest/internal/gtest-tuple.h<br>
<br>
<br>
################################################################################<br>
diff --git a/clang/unittests/AST/ASTImporterGenericRedeclTest.cpp b/clang/unittests/AST/ASTImporterGenericRedeclTest.cpp<br>
index 44930b1043e4a..1206fac15d4a2 100644<br>
--- a/clang/unittests/AST/ASTImporterGenericRedeclTest.cpp<br>
+++ b/clang/unittests/AST/ASTImporterGenericRedeclTest.cpp<br>
@@ -417,231 +417,231 @@ struct RedeclChain : ASTImporterOptionSpecificTestBase {<br>
}<br>
};<br>
<br>
-#define ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(BaseTemplate, TypeParam, \<br>
+#define ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(BaseTemplate, TypeParam, \<br>
NamePrefix, TestCase) \<br>
using BaseTemplate##TypeParam = BaseTemplate<TypeParam>; \<br>
TEST_P(BaseTemplate##TypeParam, NamePrefix##TestCase) { \<br>
TypedTest_##TestCase(); \<br>
}<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
RedeclChain, Function, ,<br>
PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
RedeclChain, Class, ,<br>
PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
RedeclChain, EnumClass, ,<br>
PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
RedeclChain, Variable, ,<br>
PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
RedeclChain, FunctionTemplate, ,<br>
PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
RedeclChain, ClassTemplate, ,<br>
PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
RedeclChain, VariableTemplate, ,<br>
PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
RedeclChain, FunctionTemplateSpec, ,<br>
PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
RedeclChain, ClassTemplateSpec, ,<br>
PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, ,<br>
DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
DefinitionShouldBeImportedAsADefinition)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, ,<br>
ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
ImportPrototypeAfterImportedPrototype)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, ,<br>
ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
ImportDefinitionAfterImportedPrototype)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, ,<br>
ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
ImportPrototypeAfterImportedDefinition)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, , ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, , ImportPrototypes)<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
ImportPrototypes)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, , ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, , ImportDefinitions)<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
ImportDefinitions)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, ,<br>
ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
ImportDefinitionThenPrototype)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, ,<br>
ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
ImportPrototypeThenDefinition)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
WholeRedeclChainIsImportedAtOnce)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
WholeRedeclChainIsImportedAtOnce)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
WholeRedeclChainIsImportedAtOnce)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
WholeRedeclChainIsImportedAtOnce)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
WholeRedeclChainIsImportedAtOnce)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
ImportPrototypeThenProtoAndDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
ImportPrototypeThenProtoAndDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
ImportPrototypeThenProtoAndDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
ImportPrototypeThenProtoAndDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
ImportPrototypeThenProtoAndDefinition)<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainFunction,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainClass,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainEnumClass,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainVariable,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainFunctionTemplate,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainClassTemplate,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainVariableTemplate,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainFunctionTemplateSpec,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainClassTemplateSpec,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainFunction,<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainClass,<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainEnumClass,<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainVariable,<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainFunctionTemplate,<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainClassTemplate,<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainVariableTemplate,<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainFunctionTemplateSpec,<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainClassTemplateSpec,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
} // end namespace ast_matchers<br>
} // end namespace clang<br>
<br>
diff --git a/clang/unittests/AST/ASTImporterODRStrategiesTest.cpp b/clang/unittests/AST/ASTImporterODRStrategiesTest.cpp<br>
index 10cafe5bc6342..eabdfeb03ede2 100644<br>
--- a/clang/unittests/AST/ASTImporterODRStrategiesTest.cpp<br>
+++ b/clang/unittests/AST/ASTImporterODRStrategiesTest.cpp<br>
@@ -382,7 +382,7 @@ struct ODRViolation : ASTImporterOptionSpecificTestBase {<br>
// Define the parametrized tests.<br>
// ==============================<br>
<br>
-#define ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE( \<br>
+#define ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE( \<br>
TypeParam, ODRHandlingParam, NamePrefix, TestCase) \<br>
using TypeParam##ODRHandlingParam = \<br>
ODRViolation<TypeParam, ASTImporter::ODRHandlingType::ODRHandlingParam>; \<br>
@@ -392,167 +392,167 @@ struct ODRViolation : ASTImporterOptionSpecificTestBase {<br>
<br>
// clang-format off<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Function, Liberal, ,<br>
ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Typedef, Liberal, ,<br>
ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
TypedefAlias, Liberal, ,<br>
ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Enum, Liberal, ,<br>
ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
EnumClass, Liberal, ,<br>
ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
EnumConstant, Liberal, ,<br>
ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Class, Liberal, ,<br>
ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Variable, Liberal, ,<br>
ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Liberal, ,<br>
ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
VarTemplate, Liberal, ,<br>
ImportConflictingDefAfterDef)<br>
// Class and variable template specializations/instantiatons are always<br>
// imported conservatively, because the AST holds the specializations in a set,<br>
// and the key within the set is a hash calculated from the arguments of the<br>
// specialization.<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplateSpec, Liberal, ,<br>
DontImportConflictingDefAfterDef) // Don't import !!!<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
VarTemplateSpec, Liberal, ,<br>
DontImportConflictingDefAfterDef) // Don't import !!!<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Function, Conservative, ,<br>
DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Typedef, Conservative, ,<br>
DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
TypedefAlias, Conservative, ,<br>
DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Enum, Conservative, ,<br>
DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
EnumClass, Conservative, ,<br>
DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
EnumConstant, Conservative, ,<br>
DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Class, Conservative, ,<br>
DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Variable, Conservative, ,<br>
DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Conservative, ,<br>
DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
VarTemplate, Conservative, ,<br>
DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplateSpec, Conservative, ,<br>
DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
VarTemplateSpec, Conservative, ,<br>
DontImportConflictingDefAfterDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Function, Liberal, ,<br>
ImportConflictingProtoAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Variable, Liberal, ,<br>
ImportConflictingProtoAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Liberal, ,<br>
ImportConflictingProtoAfterProto)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Function, Conservative, ,<br>
DontImportConflictingProtoAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Variable, Conservative, ,<br>
DontImportConflictingProtoAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Conservative, ,<br>
DontImportConflictingProtoAfterProto)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Variable, Liberal, ,<br>
ImportConflictingProtoAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Liberal, ,<br>
ImportConflictingProtoAfterDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Variable, Conservative, ,<br>
DontImportConflictingProtoAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Conservative, ,<br>
DontImportConflictingProtoAfterDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Function, Liberal, ,<br>
ImportConflictingDefAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Variable, Liberal, ,<br>
ImportConflictingDefAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Liberal, ,<br>
ImportConflictingDefAfterProto)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Function, Conservative, ,<br>
DontImportConflictingDefAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
Variable, Conservative, ,<br>
DontImportConflictingDefAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Conservative, ,<br>
DontImportConflictingDefAfterProto)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Liberal, ,<br>
ImportConflictingProtoDefAfterProto)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Conservative, ,<br>
DontImportConflictingProtoDefAfterProto)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Liberal, ,<br>
ImportConflictingProtoAfterProtoDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Conservative, ,<br>
DontImportConflictingProtoAfterProtoDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Liberal, ,<br>
ImportConflictingProtoDefAfterDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Conservative, ,<br>
DontImportConflictingProtoDefAfterDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Liberal, ,<br>
ImportConflictingDefAfterProtoDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
ClassTemplate, Conservative, ,<br>
DontImportConflictingDefAfterProtoDef)<br>
<br>
@@ -565,28 +565,28 @@ ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
// has nothing to do with function template specializations. Fully specialized<br>
// function templates are imported as new nodes if their template arguments are<br>
// <br>
diff erent.<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
FunctionTemplate, Liberal, ,<br>
ImportDifferentDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
FunctionTemplateSpec, Liberal, ,<br>
ImportDifferentDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
FunctionTemplate, Conservative, ,<br>
ImportDifferentDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
FunctionTemplateSpec, Conservative, ,<br>
ImportDifferentDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
FunctionTemplate, Liberal, ,<br>
DontImportSameDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
FunctionTemplateSpec, Liberal, ,<br>
DontImportSameDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
FunctionTemplate, Conservative, ,<br>
DontImportSameDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
FunctionTemplateSpec, Conservative, ,<br>
DontImportSameDefAfterDef)<br>
<br>
@@ -596,99 +596,99 @@ ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
<br>
// FIXME: These fail on Windows.<br>
#if !defined(_WIN32)<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, FunctionConservative,<br>
- DefaultTestValuesForRunOptions, );<br>
+ DefaultTestValuesForRunOptions );<br>
#endif<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, TypedefConservative,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, TypedefAliasConservative,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, EnumConservative,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, EnumClassConservative,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, EnumConstantConservative,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, ClassConservative,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, VariableConservative,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, ClassTemplateConservative,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, FunctionTemplateConservative,<br>
- DefaultTestValuesForRunOptions, );<br>
+ DefaultTestValuesForRunOptions);<br>
// FIXME: Make VarTemplate tests work.<br>
-//INSTANTIATE_TEST_CASE_P(<br>
+//INSTANTIATE_TEST_SUITE_P(<br>
//ODRViolationTests, VarTemplateConservative,<br>
- //DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ //DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, FunctionTemplateSpecConservative,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, ClassTemplateSpecConservative,<br>
- DefaultTestValuesForRunOptions, );<br>
+ DefaultTestValuesForRunOptions);<br>
// FIXME: Make VarTemplateSpec tests work.<br>
-//INSTANTIATE_TEST_CASE_P(<br>
+//INSTANTIATE_TEST_SUITE_P(<br>
//ODRViolationTests, VarTemplateSpecConservative,<br>
- //DefaultTestValuesForRunOptions, );<br>
+ //DefaultTestValuesForRunOptions);<br>
<br>
// FIXME: These fail on Windows.<br>
#if !defined(_WIN32)<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, FunctionLiberal,<br>
- DefaultTestValuesForRunOptions, );<br>
+ DefaultTestValuesForRunOptions);<br>
#endif<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, TypedefLiberal,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, TypedefAliasLiberal,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, EnumLiberal,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, EnumClassLiberal,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, EnumConstantLiberal,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, ClassLiberal,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, VariableLiberal,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, ClassTemplateLiberal,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, FunctionTemplateLiberal,<br>
- DefaultTestValuesForRunOptions, );<br>
+ DefaultTestValuesForRunOptions);<br>
// FIXME: Make VarTemplate tests work.<br>
-// INSTANTIATE_TEST_CASE_P(<br>
+// INSTANTIATE_TEST_SUITE_P(<br>
// ODRViolationTests, VarTemplateLiberal,<br>
-// DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+// DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, ClassTemplateSpecLiberal,<br>
- DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ODRViolationTests, FunctionTemplateSpecLiberal,<br>
- DefaultTestValuesForRunOptions, );<br>
+ DefaultTestValuesForRunOptions);<br>
// FIXME: Make VarTemplateSpec tests work.<br>
-//INSTANTIATE_TEST_CASE_P(<br>
+//INSTANTIATE_TEST_SUITE_P(<br>
//ODRViolationTests, VarTemplateSpecLiberal,<br>
- //DefaultTestValuesForRunOptions, );<br>
+ //DefaultTestValuesForRunOptions );<br>
<br>
// clang-format on<br>
<br>
<br>
diff --git a/clang/unittests/AST/ASTImporterObjCTest.cpp b/clang/unittests/AST/ASTImporterObjCTest.cpp<br>
index 2d848dcf754ed..c9751fd8dda8b 100644<br>
--- a/clang/unittests/AST/ASTImporterObjCTest.cpp<br>
+++ b/clang/unittests/AST/ASTImporterObjCTest.cpp<br>
@@ -85,5 +85,5 @@ static const auto ObjCTestArrayForRunOptions =<br>
const auto ObjCTestValuesForRunOptions =<br>
::testing::ValuesIn(ObjCTestArrayForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportObjCDecl,<br>
- ObjCTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportObjCDecl,<br>
+ ObjCTestValuesForRunOptions);<br>
<br>
diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp<br>
index b0a8c829809dd..e62203f286572 100644<br>
--- a/clang/unittests/AST/ASTImporterTest.cpp<br>
+++ b/clang/unittests/AST/ASTImporterTest.cpp<br>
@@ -5568,15 +5568,15 @@ TEST_P(ASTImporterOptionSpecificTestBase,<br>
EXPECT_EQ(ImportedX->isAggregate(), FromX->isAggregate());<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, SVEBuiltins,<br>
- ::testing::Values(std::vector<std::string>{<br>
- "-target", "aarch64-linux-gnu"}), );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, SVEBuiltins,<br>
+ ::testing::Values(std::vector<std::string>{<br>
+ "-target", "aarch64-linux-gnu"}));<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, DeclContextTest,<br>
- ::testing::Values(std::vector<std::string>()), );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, DeclContextTest,<br>
+ ::testing::Values(std::vector<std::string>()));<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, CanonicalRedeclChain,<br>
- ::testing::Values(std::vector<std::string>()), );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, CanonicalRedeclChain,<br>
+ ::testing::Values(std::vector<std::string>()));<br>
<br>
TEST_P(ASTImporterOptionSpecificTestBase, LambdasAreDifferentiated) {<br>
Decl *FromTU = getTuDecl(<br>
@@ -6226,8 +6226,8 @@ TEST_P(CTAD, DeductionGuideShouldCopyALocalTypedef) {<br>
EXPECT_NE(Param->getType()->castAs<TypedefType>()->getDecl(), Typedef);<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, CTAD,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, CTAD,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
TEST_P(ASTImporterOptionSpecificTestBase, TypedefWithAttribute) {<br>
Decl *TU = getTuDecl(<br>
@@ -6323,79 +6323,79 @@ TEST_P(ASTImporterOptionSpecificTestBase, ImportEnumMemberSpecialization) {<br>
ToD->getTemplateSpecializationKind());<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ASTImporterLookupTableTest,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportPath,<br>
- ::testing::Values(std::vector<std::string>()), );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportPath,<br>
+ ::testing::Values(std::vector<std::string>()));<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportExpr,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportExpr,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFixedPointExpr,<br>
- ExtendWithOptions(DefaultTestArrayForRunOptions,<br>
- std::vector<std::string>{<br>
- "-ffixed-point"}), );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportFixedPointExpr,<br>
+ ExtendWithOptions(DefaultTestArrayForRunOptions,<br>
+ std::vector<std::string>{<br>
+ "-ffixed-point"}));<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportBlock,<br>
- ExtendWithOptions(DefaultTestArrayForRunOptions,<br>
- std::vector<std::string>{<br>
- "-fblocks"}), );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportBlock,<br>
+ ExtendWithOptions(DefaultTestArrayForRunOptions,<br>
+ std::vector<std::string>{<br>
+ "-fblocks"}));<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportType,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportType,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportDecl,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportDecl,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterOptionSpecificTestBase,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ASTImporterOptionSpecificTestBase,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ErrorHandlingTest,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ErrorHandlingTest,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedirectingImporterTest,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedirectingImporterTest,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFunctions,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportFunctions,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportAutoFunctions,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportAutoFunctions,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFunctionTemplates,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportFunctionTemplates,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFriendFunctionTemplates,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportFriendFunctionTemplates,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportClasses,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportClasses,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFriendFunctions,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportFriendFunctions,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFriendClasses,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportFriendClasses,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests,<br>
- ImportFunctionTemplateSpecializations,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests,<br>
+ ImportFunctionTemplateSpecializations,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportImplicitMethods,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportImplicitMethods,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportVariables,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportVariables,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, LLDBLookupTest,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, LLDBLookupTest,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportSourceLocations,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportSourceLocations,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportWithExternalSource,<br>
- DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportWithExternalSource,<br>
+ DefaultTestValuesForRunOptions);<br>
<br>
} // end namespace ast_matchers<br>
} // end namespace clang<br>
<br>
diff --git a/clang/unittests/AST/ASTImporterVisibilityTest.cpp b/clang/unittests/AST/ASTImporterVisibilityTest.cpp<br>
index 262402415658f..cf3e51caeac7a 100644<br>
--- a/clang/unittests/AST/ASTImporterVisibilityTest.cpp<br>
+++ b/clang/unittests/AST/ASTImporterVisibilityTest.cpp<br>
@@ -177,11 +177,11 @@ TEST_P(ImportClassTemplatesVisibilityChain, ImportChain) {<br>
}<br>
<br>
// Automatic instantiation of the value-parameterized tests.<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFunctionsVisibilityChain,<br>
- ::testing::Combine(<br>
- DefaultTestValuesForRunOptions,<br>
- ::testing::Values(ExternF, StaticF, AnonF)), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportFunctionsVisibilityChain,<br>
+ ::testing::Combine(DefaultTestValuesForRunOptions,<br>
+ ::testing::Values(ExternF, StaticF,<br>
+ AnonF)));<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ParameterizedTests, ImportVariablesVisibilityChain,<br>
::testing::Combine(<br>
DefaultTestValuesForRunOptions,<br>
@@ -192,31 +192,31 @@ INSTANTIATE_TEST_CASE_P(<br>
// initializer is a tentative definition, subsequent definitions may be<br>
// provided but they must have the same linkage. See also the test<br>
// ImportVariableChainInC which test for this special C Lang case.<br>
- ::testing::Values(ExternV, AnonV)), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ ::testing::Values(ExternV, AnonV)) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ParameterizedTests, ImportClassesVisibilityChain,<br>
::testing::Combine(<br>
DefaultTestValuesForRunOptions,<br>
- ::testing::Values(ExternC, AnonC)), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ ::testing::Values(ExternC, AnonC)) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ParameterizedTests, ImportScopedEnumsVisibilityChain,<br>
::testing::Combine(<br>
DefaultTestValuesForRunOptions,<br>
- ::testing::Values(ExternEC, AnonEC)), );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests,<br>
+ ::testing::Values(ExternEC, AnonEC)) );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests,<br>
ImportFunctionTemplatesVisibilityChain,<br>
::testing::Combine(DefaultTestValuesForRunOptions,<br>
::testing::Values(ExternFT, StaticFT,<br>
- AnonFT)), );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests,<br>
+ AnonFT)) );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests,<br>
ImportVariableTemplatesVisibilityChain,<br>
::testing::Combine(DefaultTestValuesForRunOptions,<br>
::testing::Values(ExternVT,<br>
- AnonVT)), );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportClassTemplatesVisibilityChain,<br>
+ AnonVT)) );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportClassTemplatesVisibilityChain,<br>
::testing::Combine(DefaultTestValuesForRunOptions,<br>
::testing::Values(ExternCT,<br>
- AnonCT)), );<br>
+ AnonCT)) );<br>
<br>
// First value in tuple: Compile options.<br>
// Second value in tuple: Tuple with informations for the test.<br>
@@ -398,7 +398,7 @@ TEST_P(ImportClassTemplatesVisibility, ImportAfterImport) {<br>
const bool ExpectLinkedDeclChain = true;<br>
const bool ExpectUnlinkedDeclChain = false;<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ParameterizedTests, ImportFunctionsVisibility,<br>
::testing::Combine(<br>
DefaultTestValuesForRunOptions,<br>
@@ -411,8 +411,8 @@ INSTANTIATE_TEST_CASE_P(<br>
std::make_tuple(StaticF, AnonF, ExpectUnlinkedDeclChain),<br>
std::make_tuple(AnonF, ExternF, ExpectUnlinkedDeclChain),<br>
std::make_tuple(AnonF, StaticF, ExpectUnlinkedDeclChain),<br>
- std::make_tuple(AnonF, AnonF, ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ std::make_tuple(AnonF, AnonF, ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ParameterizedTests, ImportVariablesVisibility,<br>
::testing::Combine(<br>
DefaultTestValuesForRunOptions,<br>
@@ -425,8 +425,8 @@ INSTANTIATE_TEST_CASE_P(<br>
std::make_tuple(StaticV, AnonV, ExpectUnlinkedDeclChain),<br>
std::make_tuple(AnonV, ExternV, ExpectUnlinkedDeclChain),<br>
std::make_tuple(AnonV, StaticV, ExpectUnlinkedDeclChain),<br>
- std::make_tuple(AnonV, AnonV, ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ std::make_tuple(AnonV, AnonV, ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ParameterizedTests, ImportClassesVisibility,<br>
::testing::Combine(<br>
DefaultTestValuesForRunOptions,<br>
@@ -434,8 +434,8 @@ INSTANTIATE_TEST_CASE_P(<br>
std::make_tuple(ExternC, ExternC, ExpectLinkedDeclChain),<br>
std::make_tuple(ExternC, AnonC, ExpectUnlinkedDeclChain),<br>
std::make_tuple(AnonC, ExternC, ExpectUnlinkedDeclChain),<br>
- std::make_tuple(AnonC, AnonC, ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ std::make_tuple(AnonC, AnonC, ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ParameterizedTests, ImportEnumsVisibility,<br>
::testing::Combine(<br>
DefaultTestValuesForRunOptions,<br>
@@ -443,8 +443,8 @@ INSTANTIATE_TEST_CASE_P(<br>
std::make_tuple(ExternE, ExternE, ExpectLinkedDeclChain),<br>
std::make_tuple(ExternE, AnonE, ExpectUnlinkedDeclChain),<br>
std::make_tuple(AnonE, ExternE, ExpectUnlinkedDeclChain),<br>
- std::make_tuple(AnonE, AnonE, ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ std::make_tuple(AnonE, AnonE, ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ParameterizedTests, ImportScopedEnumsVisibility,<br>
::testing::Combine(<br>
DefaultTestValuesForRunOptions,<br>
@@ -452,8 +452,8 @@ INSTANTIATE_TEST_CASE_P(<br>
std::make_tuple(ExternEC, ExternEC, ExpectLinkedDeclChain),<br>
std::make_tuple(ExternEC, AnonEC, ExpectUnlinkedDeclChain),<br>
std::make_tuple(AnonEC, ExternEC, ExpectUnlinkedDeclChain),<br>
- std::make_tuple(AnonEC, AnonEC, ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ std::make_tuple(AnonEC, AnonEC, ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ParameterizedTests, ImportTypedefNameVisibility,<br>
::testing::Combine(<br>
DefaultTestValuesForRunOptions,<br>
@@ -480,8 +480,8 @@ INSTANTIATE_TEST_CASE_P(<br>
std::make_tuple(ExternTypedef, AnonUsing, ExpectUnlinkedDeclChain),<br>
std::make_tuple(AnonTypedef, ExternUsing, ExpectUnlinkedDeclChain),<br>
std::make_tuple(AnonTypedef, AnonUsing,<br>
- ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ParameterizedTests, ImportFunctionTemplatesVisibility,<br>
::testing::Combine(<br>
DefaultTestValuesForRunOptions,<br>
@@ -494,8 +494,8 @@ INSTANTIATE_TEST_CASE_P(<br>
std::make_tuple(StaticFT, AnonFT, ExpectUnlinkedDeclChain),<br>
std::make_tuple(AnonFT, ExternFT, ExpectUnlinkedDeclChain),<br>
std::make_tuple(AnonFT, StaticFT, ExpectUnlinkedDeclChain),<br>
- std::make_tuple(AnonFT, AnonFT, ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ std::make_tuple(AnonFT, AnonFT, ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ParameterizedTests, ImportVariableTemplatesVisibility,<br>
::testing::Combine(<br>
DefaultTestValuesForRunOptions,<br>
@@ -508,14 +508,14 @@ INSTANTIATE_TEST_CASE_P(<br>
std::make_tuple(StaticVT, AnonVT, ExpectUnlinkedDeclChain),<br>
std::make_tuple(AnonVT, ExternVT, ExpectUnlinkedDeclChain),<br>
std::make_tuple(AnonVT, StaticVT, ExpectUnlinkedDeclChain),<br>
- std::make_tuple(AnonVT, AnonVT, ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+ std::make_tuple(AnonVT, AnonVT, ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ParameterizedTests, ImportClassTemplatesVisibility,<br>
::testing::Combine(<br>
DefaultTestValuesForRunOptions,<br>
::testing::Values(std::make_tuple(ExternCT, ExternCT, ExpectLinkedDeclChain),<br>
std::make_tuple(ExternCT, AnonCT, ExpectUnlinkedDeclChain),<br>
std::make_tuple(AnonCT, ExternCT, ExpectUnlinkedDeclChain),<br>
- std::make_tuple(AnonCT, AnonCT, ExpectUnlinkedDeclChain))), );<br>
+ std::make_tuple(AnonCT, AnonCT, ExpectUnlinkedDeclChain))) );<br>
} // end namespace ast_matchers<br>
} // end namespace clang<br>
<br>
diff --git a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp<br>
index 23b31509cd488..c179ce11fefb9 100644<br>
--- a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp<br>
+++ b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp<br>
@@ -2302,8 +2302,8 @@ static std::vector<TestClangConfig> allTestClangConfigs() {<br>
return all_configs;<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(ASTMatchersTests, ASTMatchersTest,<br>
- testing::ValuesIn(allTestClangConfigs()), );<br>
+INSTANTIATE_TEST_SUITE_P(ASTMatchersTests, ASTMatchersTest,<br>
+ testing::ValuesIn(allTestClangConfigs()));<br>
<br>
} // namespace ast_matchers<br>
} // namespace clang<br>
<br>
diff --git a/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp b/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp<br>
index a968d292b53f5..a4410d330d393 100644<br>
--- a/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp<br>
+++ b/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp<br>
@@ -203,9 +203,9 @@ TEST_P(AssignmentTest, AssignmentModifies) {<br>
}<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(AllAssignmentOperators, AssignmentTest,<br>
+INSTANTIATE_TEST_SUITE_P(AllAssignmentOperators, AssignmentTest,<br>
Values("=", "+=", "-=", "*=", "/=", "%=", "&=", "|=",<br>
- "^=", "<<=", ">>="), );<br>
+ "^=", "<<=", ">>=") );<br>
<br>
TEST(ExprMutationAnalyzerTest, AssignmentConditionalWithInheritance) {<br>
const auto AST = buildASTFromCode("struct Base {void nonconst(); };"<br>
@@ -230,9 +230,9 @@ TEST_P(IncDecTest, IncDecModifies) {<br>
EXPECT_THAT(mutatedBy(Results, AST.get()), ElementsAre(ModExpr));<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(AllIncDecOperators, IncDecTest,<br>
+INSTANTIATE_TEST_SUITE_P(AllIncDecOperators, IncDecTest,<br>
Values("++x", "--x", "x++", "x--", "++(x)", "--(x)",<br>
- "(x)++", "(x)--"), );<br>
+ "(x)++", "(x)--") );<br>
<br>
// Section: member functions<br>
<br>
<br>
diff --git a/clang/unittests/Rename/RenameAliasTest.cpp b/clang/unittests/Rename/RenameAliasTest.cpp<br>
index ad9ce65ac8492..50fa2c104263f 100644<br>
--- a/clang/unittests/Rename/RenameAliasTest.cpp<br>
+++ b/clang/unittests/Rename/RenameAliasTest.cpp<br>
@@ -45,7 +45,7 @@ class RenameAliasTest : public ClangRenameTest {<br>
}<br>
};<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
RenameAliasTests, RenameAliasTest,<br>
testing::ValuesIn(std::vector<Case>({<br>
// basic functions<br>
@@ -190,7 +190,7 @@ INSTANTIATE_TEST_CASE_P(<br>
"NewTPtr"},<br>
{"void f(::TPtr<int> p) {}", "void f(::NewTPtr<int> p) {}", "TPtr",<br>
"NewTPtr"},<br>
- })), );<br>
+ })));<br>
<br>
TEST_P(RenameAliasTest, RenameAlias) {<br>
auto Param = GetParam();<br>
<br>
diff --git a/clang/unittests/Rename/RenameClassTest.cpp b/clang/unittests/Rename/RenameClassTest.cpp<br>
index 1b008987a16d3..24370b5795e94 100644<br>
--- a/clang/unittests/Rename/RenameClassTest.cpp<br>
+++ b/clang/unittests/Rename/RenameClassTest.cpp<br>
@@ -45,7 +45,7 @@ class RenameClassTest : public ClangRenameTest {<br>
}<br>
};<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
RenameClassTests, RenameClassTest,<br>
testing::ValuesIn(std::vector<Case>({<br>
// basic classes<br>
@@ -189,7 +189,7 @@ INSTANTIATE_TEST_CASE_P(<br>
// friends, everyone needs friends.<br>
{"class Foo { int i; friend class a::Foo; };",<br>
"class Foo { int i; friend class b::Bar; };", "", ""},<br>
- })), );<br>
+ })) );<br>
<br>
TEST_P(RenameClassTest, RenameClasses) {<br>
auto Param = GetParam();<br>
@@ -217,7 +217,7 @@ class NamespaceDetectionTest : public ClangRenameTest {<br>
}<br>
};<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
RenameClassTest, NamespaceDetectionTest,<br>
::testing::ValuesIn(std::vector<Case>({<br>
// Test old and new namespace overlap.<br>
@@ -298,7 +298,7 @@ INSTANTIATE_TEST_CASE_P(<br>
{"namespace o1 { class Foo { int i; friend class Old; }; }",<br>
"namespace o1 { class Foo { int i; friend class New; }; }",<br>
"::o1::Old", "::o1::New"},<br>
- })), );<br>
+ })) );<br>
<br>
TEST_P(NamespaceDetectionTest, RenameClasses) {<br>
auto Param = GetParam();<br>
@@ -339,7 +339,7 @@ class TemplatedClassRenameTest : public ClangRenameTest {<br>
}<br>
};<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
RenameClassTests, TemplatedClassRenameTest,<br>
::testing::ValuesIn(std::vector<Case>({<br>
{"Old<int> gI; Old<bool> gB;", "New<int> gI; New<bool> gB;", "Old",<br>
@@ -394,7 +394,7 @@ INSTANTIATE_TEST_CASE_P(<br>
{"template <typename T> struct Moo { ns::Old<T> o_; }; Moo<int> m;",<br>
"template <typename T> struct Moo { ns::New<T> o_; }; Moo<int> m;",<br>
"ns::Old", "ns::New"},<br>
- })), );<br>
+ })) );<br>
<br>
TEST_P(TemplatedClassRenameTest, RenameTemplateClasses) {<br>
auto Param = GetParam();<br>
<br>
diff --git a/clang/unittests/Rename/RenameEnumTest.cpp b/clang/unittests/Rename/RenameEnumTest.cpp<br>
index 55dcd11ac4128..dc3440047c4a4 100644<br>
--- a/clang/unittests/Rename/RenameEnumTest.cpp<br>
+++ b/clang/unittests/Rename/RenameEnumTest.cpp<br>
@@ -26,7 +26,7 @@ class RenameEnumTest : public ClangRenameTest {<br>
}<br>
};<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
RenameEnumTests, RenameEnumTest,<br>
testing::ValuesIn(std::vector<Case>({<br>
{"void f(a::A2 arg) { a::A2 t = a::A2::Blue; }",<br>
@@ -142,7 +142,7 @@ INSTANTIATE_TEST_CASE_P(<br>
"struct Foo { template <typename T> T foo(); }; void g() { Foo f; "<br>
"f.foo<b::B2>(); }",<br>
"a::A2", "b::B2"},<br>
- })), );<br>
+ })) );<br>
<br>
TEST_P(RenameEnumTest, RenameEnums) {<br>
auto Param = GetParam();<br>
<br>
diff --git a/clang/unittests/Rename/RenameMemberTest.cpp b/clang/unittests/Rename/RenameMemberTest.cpp<br>
index c9192c638a225..c16d16aa25f04 100644<br>
--- a/clang/unittests/Rename/RenameMemberTest.cpp<br>
+++ b/clang/unittests/Rename/RenameMemberTest.cpp<br>
@@ -69,15 +69,15 @@ class RenameMemberTest : public ClangRenameTest {<br>
}<br>
};<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
DISABLED_RenameTemplatedClassStaticVariableTest, RenameMemberTest,<br>
testing::ValuesIn(std::vector<Case>({<br>
// FIXME: support renaming static variables for template classes.<br>
{"void f() { ns::TA<int>::SMoo; }",<br>
"void f() { ns::TA<int>::SMeh; }", "ns::TA::SMoo", "ns::TA::SMeh"},<br>
- })), );<br>
+ })) );<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
RenameMemberTest, RenameMemberTest,<br>
testing::ValuesIn(std::vector<Case>({<br>
// Normal methods and fields.<br>
@@ -154,7 +154,7 @@ INSTANTIATE_TEST_CASE_P(<br>
"TA::SFoo", "TB::SBar"},<br>
{"void f() { ns::TB<int>::SFoo(); }",<br>
"void f() { ns::TB<int>::SBar(); }", "ns::TA::SFoo", "ns::TB::SBar"},<br>
- })), );<br>
+ })) );<br>
<br>
TEST_P(RenameMemberTest, RenameMembers) {<br>
auto Param = GetParam();<br>
<br>
diff --git a/clang/unittests/StaticAnalyzer/RangeSetTest.cpp b/clang/unittests/StaticAnalyzer/RangeSetTest.cpp<br>
index 5be2ee3fc520b..c29a5eef00e16 100644<br>
--- a/clang/unittests/StaticAnalyzer/RangeSetTest.cpp<br>
+++ b/clang/unittests/StaticAnalyzer/RangeSetTest.cpp<br>
@@ -188,7 +188,7 @@ llvm::APSInt RangeSetTest<BaseType>::Base{sizeof(BaseType) * 8, !isSigned()};<br>
<br>
using IntTypes = ::testing::Types<int8_t, uint8_t, int16_t, uint16_t, int32_t,<br>
uint32_t, int64_t, uint64_t>;<br>
-TYPED_TEST_CASE(RangeSetTest, IntTypes);<br>
+TYPED_TEST_SUITE(RangeSetTest, IntTypes);<br>
<br>
TYPED_TEST(RangeSetTest, RangeSetNegateTest) {<br>
// Use next values of the range {MIN, A, B, MID, C, D, MAX}.<br>
<br>
diff --git a/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp b/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp<br>
index b6bcd4eb2da5d..8529d65265761 100644<br>
--- a/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp<br>
+++ b/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp<br>
@@ -88,8 +88,8 @@ class BuildSyntaxTreeTest : public SyntaxTreeTest {<br>
}<br>
};<br>
<br>
-INSTANTIATE_TEST_CASE_P(SyntaxTreeTests, BuildSyntaxTreeTest,<br>
- testing::ValuesIn(allTestClangConfigs()), );<br>
+INSTANTIATE_TEST_SUITE_P(SyntaxTreeTests, BuildSyntaxTreeTest,<br>
+ testing::ValuesIn(allTestClangConfigs()) );<br>
<br>
TEST_P(BuildSyntaxTreeTest, Simple) {<br>
EXPECT_TRUE(treeDumpEqual(<br>
<br>
diff --git a/clang/unittests/Tooling/Syntax/MutationsTest.cpp b/clang/unittests/Tooling/Syntax/MutationsTest.cpp<br>
index f63d3dffa4597..34279dc2d941b 100644<br>
--- a/clang/unittests/Tooling/Syntax/MutationsTest.cpp<br>
+++ b/clang/unittests/Tooling/Syntax/MutationsTest.cpp<br>
@@ -54,8 +54,8 @@ class MutationTest : public SyntaxTreeTest {<br>
};<br>
};<br>
<br>
-INSTANTIATE_TEST_CASE_P(SyntaxTreeTests, MutationTest,<br>
- ::testing::ValuesIn(allTestClangConfigs()), );<br>
+INSTANTIATE_TEST_SUITE_P(SyntaxTreeTests, MutationTest,<br>
+ ::testing::ValuesIn(allTestClangConfigs()) );<br>
<br>
TEST_P(MutationTest, RemoveStatement_InCompound) {<br>
CheckTransformation(RemoveStatement, "void test() { [[100+100;]] test(); }",<br>
<br>
diff --git a/clang/unittests/Tooling/Syntax/SynthesisTest.cpp b/clang/unittests/Tooling/Syntax/SynthesisTest.cpp<br>
index a815989bc93fe..0bdc7bbdeb0f9 100644<br>
--- a/clang/unittests/Tooling/Syntax/SynthesisTest.cpp<br>
+++ b/clang/unittests/Tooling/Syntax/SynthesisTest.cpp<br>
@@ -38,8 +38,8 @@ class SynthesisTest : public SyntaxTreeTest {<br>
}<br>
};<br>
<br>
-INSTANTIATE_TEST_CASE_P(SynthesisTests, SynthesisTest,<br>
- ::testing::ValuesIn(allTestClangConfigs()), );<br>
+INSTANTIATE_TEST_SUITE_P(SynthesisTests, SynthesisTest,<br>
+ ::testing::ValuesIn(allTestClangConfigs()) );<br>
<br>
TEST_P(SynthesisTest, Leaf_Punctuation) {<br>
buildTree("", GetParam());<br>
<br>
diff --git a/clang/unittests/Tooling/Syntax/TreeTest.cpp b/clang/unittests/Tooling/Syntax/TreeTest.cpp<br>
index ed839e269dde4..06da4e80156a4 100644<br>
--- a/clang/unittests/Tooling/Syntax/TreeTest.cpp<br>
+++ b/clang/unittests/Tooling/Syntax/TreeTest.cpp<br>
@@ -103,8 +103,8 @@ class TreeTest : public SyntaxTreeTest {<br>
}<br>
};<br>
<br>
-INSTANTIATE_TEST_CASE_P(TreeTests, TreeTest,<br>
- ::testing::ValuesIn(allTestClangConfigs()), );<br>
+INSTANTIATE_TEST_SUITE_P(TreeTests, TreeTest,<br>
+ ::testing::ValuesIn(allTestClangConfigs()) );<br>
<br>
TEST_P(TreeTest, FirstLeaf) {<br>
buildTree("", GetParam());<br>
@@ -222,8 +222,8 @@ class ListTest : public SyntaxTreeTest {<br>
}<br>
};<br>
<br>
-INSTANTIATE_TEST_CASE_P(TreeTests, ListTest,<br>
- ::testing::ValuesIn(allTestClangConfigs()), );<br>
+INSTANTIATE_TEST_SUITE_P(TreeTests, ListTest,<br>
+ ::testing::ValuesIn(allTestClangConfigs()) );<br>
<br>
/// "a, b, c" <=> [("a", ","), ("b", ","), ("c", null)]<br>
TEST_P(ListTest, List_Separated_WellFormed) {<br>
<br>
diff --git a/flang/unittests/RuntimeGTest/ListInputTest.cpp b/flang/unittests/RuntimeGTest/ListInputTest.cpp<br>
index 9654048f20bb8..7aa42905c4365 100644<br>
--- a/flang/unittests/RuntimeGTest/ListInputTest.cpp<br>
+++ b/flang/unittests/RuntimeGTest/ListInputTest.cpp<br>
@@ -183,9 +183,9 @@ TEST_P(SimpleListInputTest, TestListInput) {<br>
}<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(SimpleListInputTestInstantiation, SimpleListInputTest,<br>
+INSTANTIATE_TEST_SUITE_P(SimpleListInputTestInstantiation, SimpleListInputTest,<br>
testing::Values(std::make_tuple("", std::vector<int>{}),<br>
std::make_tuple("0", std::vector<int>{}),<br>
std::make_tuple("1", std::vector<int>{1}),<br>
std::make_tuple("1, 2", std::vector<int>{1, 2}),<br>
- std::make_tuple("3*2", std::vector<int>{2, 2, 2})), );<br>
+ std::make_tuple("3*2", std::vector<int>{2, 2, 2})));<br>
<br>
diff --git a/lldb/unittests/Host/SocketTest.cpp b/lldb/unittests/Host/SocketTest.cpp<br>
index 901f878d2e466..27d42f835718b 100644<br>
--- a/lldb/unittests/Host/SocketTest.cpp<br>
+++ b/lldb/unittests/Host/SocketTest.cpp<br>
@@ -228,7 +228,7 @@ TEST_P(SocketTest, DomainGetConnectURI) {<br>
}<br>
#endif<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
SocketTests, SocketTest,<br>
testing::Values(SocketTestParams{/*is_ipv6=*/false,<br>
/*localhost_ip=*/"127.0.0.1"},<br>
<br>
diff --git a/lldb/unittests/Process/Utility/LinuxProcMapsTest.cpp b/lldb/unittests/Process/Utility/LinuxProcMapsTest.cpp<br>
index 203875533d93a..66db61ff65969 100644<br>
--- a/lldb/unittests/Process/Utility/LinuxProcMapsTest.cpp<br>
+++ b/lldb/unittests/Process/Utility/LinuxProcMapsTest.cpp<br>
@@ -62,7 +62,7 @@ TEST_P(LinuxProcMapsTestFixture, ParseMapRegions) {<br>
<br>
// Note: ConstString("") != ConstString(nullptr)<br>
// When a region has no name, it will have the latter in the MemoryRegionInfo<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ProcMapTests, LinuxProcMapsTestFixture,<br>
::testing::Values(<br>
// Nothing in nothing out<br>
@@ -125,11 +125,11 @@ INSTANTIATE_TEST_CASE_P(<br>
ConstString("[vsyscall]"), MemoryRegionInfo::eDontKnow, 0,<br>
MemoryRegionInfo::eDontKnow),<br>
},<br>
- "")), );<br>
+ "")));<br>
<br>
class LinuxProcSMapsTestFixture : public LinuxProcMapsTestFixture {};<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ProcSMapTests, LinuxProcSMapsTestFixture,<br>
::testing::Values(<br>
// Nothing in nothing out<br>
@@ -253,7 +253,7 @@ INSTANTIATE_TEST_CASE_P(<br>
MemoryRegionInfo::eDontKnow, 0,<br>
MemoryRegionInfo::eDontKnow),<br>
},<br>
- "")), );<br>
+ "")));<br>
<br>
TEST_P(LinuxProcSMapsTestFixture, ParseSMapRegions) {<br>
auto params = GetParam();<br>
<br>
diff --git a/llvm/include/llvm/Testing/Support/Error.h b/llvm/include/llvm/Testing/Support/Error.h<br>
index cd5b79cd6bfb0..67e9985b80f55 100644<br>
--- a/llvm/include/llvm/Testing/Support/Error.h<br>
+++ b/llvm/include/llvm/Testing/Support/Error.h<br>
@@ -42,7 +42,7 @@ class ValueMatchesMono<br>
<br>
bool result = Matcher.MatchAndExplain(*Holder.Exp, listener);<br>
<br>
- if (result)<br>
+ if (result || !listener->IsInterested())<br>
return result;<br>
*listener << "(";<br>
Matcher.DescribeNegationTo(listener->stream());<br>
<br>
diff --git a/llvm/unittests/ADT/BitVectorTest.cpp b/llvm/unittests/ADT/BitVectorTest.cpp<br>
index 1779f2fcc9c27..858adb36f22e4 100644<br>
--- a/llvm/unittests/ADT/BitVectorTest.cpp<br>
+++ b/llvm/unittests/ADT/BitVectorTest.cpp<br>
@@ -21,7 +21,7 @@ class BitVectorTest : public ::testing::Test { };<br>
<br>
// Test both BitVector and SmallBitVector with the same suite of tests.<br>
typedef ::testing::Types<BitVector, SmallBitVector> BitVectorTestTypes;<br>
-TYPED_TEST_CASE(BitVectorTest, BitVectorTestTypes);<br>
+TYPED_TEST_SUITE(BitVectorTest, BitVectorTestTypes);<br>
<br>
TYPED_TEST(BitVectorTest, TrivialOperation) {<br>
TypeParam Vec;<br>
<br>
diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp<br>
index 9cd974f5bac31..e9fe4cb8d5cd2 100644<br>
--- a/llvm/unittests/ADT/DenseMapTest.cpp<br>
+++ b/llvm/unittests/ADT/DenseMapTest.cpp<br>
@@ -105,7 +105,7 @@ typedef ::testing::Types<DenseMap<uint32_t, uint32_t>,<br>
SmallDenseMap<CtorTester, CtorTester, 4,<br>
CtorTesterMapInfo><br>
> DenseMapTestTypes;<br>
-TYPED_TEST_CASE(DenseMapTest, DenseMapTestTypes);<br>
+TYPED_TEST_SUITE(DenseMapTest, DenseMapTestTypes);<br>
<br>
// Empty map tests<br>
TYPED_TEST(DenseMapTest, EmptyIntMapTest) {<br>
<br>
diff --git a/llvm/unittests/ADT/DenseSetTest.cpp b/llvm/unittests/ADT/DenseSetTest.cpp<br>
index ada53cac9b78d..1320e283c59aa 100644<br>
--- a/llvm/unittests/ADT/DenseSetTest.cpp<br>
+++ b/llvm/unittests/ADT/DenseSetTest.cpp<br>
@@ -68,7 +68,7 @@ typedef ::testing::Types<DenseSet<unsigned, TestDenseSetInfo>,<br>
const SmallDenseSet<unsigned, 4, TestDenseSetInfo>,<br>
SmallDenseSet<unsigned, 64, TestDenseSetInfo>><br>
DenseSetTestTypes;<br>
-TYPED_TEST_CASE(DenseSetTest, DenseSetTestTypes);<br>
+TYPED_TEST_SUITE(DenseSetTest, DenseSetTestTypes);<br>
<br>
TYPED_TEST(DenseSetTest, Constructor) {<br>
constexpr unsigned a[] = {1, 2, 4};<br>
<br>
diff --git a/llvm/unittests/ADT/IListBaseTest.cpp b/llvm/unittests/ADT/IListBaseTest.cpp<br>
index 2983618f07e4a..f4783c46f4194 100644<br>
--- a/llvm/unittests/ADT/IListBaseTest.cpp<br>
+++ b/llvm/unittests/ADT/IListBaseTest.cpp<br>
@@ -19,7 +19,7 @@ template <typename T> class IListBaseTest : public ::testing::Test {};<br>
// Test variants with the same test.<br>
typedef ::testing::Types<ilist_base<false>, ilist_base<true>><br>
IListBaseTestTypes;<br>
-TYPED_TEST_CASE(IListBaseTest, IListBaseTestTypes);<br>
+TYPED_TEST_SUITE(IListBaseTest, IListBaseTestTypes);<br>
<br>
TYPED_TEST(IListBaseTest, insertBeforeImpl) {<br>
typedef TypeParam list_base_type;<br>
<br>
diff --git a/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp b/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp<br>
index 0123709dcf2e3..e35b78484f53a 100644<br>
--- a/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp<br>
+++ b/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp<br>
@@ -28,7 +28,7 @@ template <typename T> struct IntrusiveRefCntPtrTest : testing::Test {};<br>
typedef ::testing::Types<SimpleRefCounted<RefCountedBase>,<br>
SimpleRefCounted<ThreadSafeRefCountedBase>><br>
IntrusiveRefCntTypes;<br>
-TYPED_TEST_CASE(IntrusiveRefCntPtrTest, IntrusiveRefCntTypes);<br>
+TYPED_TEST_SUITE(IntrusiveRefCntPtrTest, IntrusiveRefCntTypes);<br>
<br>
TYPED_TEST(IntrusiveRefCntPtrTest, RefCountedBaseCopyDoesNotLeak) {<br>
EXPECT_EQ(0, NumInstances);<br>
<br>
diff --git a/llvm/unittests/ADT/MapVectorTest.cpp b/llvm/unittests/ADT/MapVectorTest.cpp<br>
index 7a77df45bce8d..92583e940d9c1 100644<br>
--- a/llvm/unittests/ADT/MapVectorTest.cpp<br>
+++ b/llvm/unittests/ADT/MapVectorTest.cpp<br>
@@ -162,7 +162,7 @@ template <class IntType> struct MapVectorMappedTypeTest : ::testing::Test {<br>
<br>
using MapIntTypes = ::testing::Types<int, long, long long, unsigned,<br>
unsigned long, unsigned long long>;<br>
-TYPED_TEST_CASE(MapVectorMappedTypeTest, MapIntTypes);<br>
+TYPED_TEST_SUITE(MapVectorMappedTypeTest, MapIntTypes);<br>
<br>
TYPED_TEST(MapVectorMappedTypeTest, DifferentDenseMap) {<br>
// Test that using a map with a mapped type other than 'unsigned' compiles<br>
<br>
diff --git a/llvm/unittests/ADT/PriorityWorklistTest.cpp b/llvm/unittests/ADT/PriorityWorklistTest.cpp<br>
index 4dfdd5f9a2611..42dca48d62fc0 100644<br>
--- a/llvm/unittests/ADT/PriorityWorklistTest.cpp<br>
+++ b/llvm/unittests/ADT/PriorityWorklistTest.cpp<br>
@@ -22,7 +22,7 @@ using namespace llvm;<br>
template <typename T> class PriorityWorklistTest : public ::testing::Test {};<br>
typedef ::testing::Types<PriorityWorklist<int>, SmallPriorityWorklist<int, 2>><br>
TestTypes;<br>
-TYPED_TEST_CASE(PriorityWorklistTest, TestTypes);<br>
+TYPED_TEST_SUITE(PriorityWorklistTest, TestTypes);<br>
<br>
TYPED_TEST(PriorityWorklistTest, Basic) {<br>
TypeParam W;<br>
<br>
diff --git a/llvm/unittests/ADT/RangeAdapterTest.cpp b/llvm/unittests/ADT/RangeAdapterTest.cpp<br>
index eb1852639a3a6..ba37bcfd3d840 100644<br>
--- a/llvm/unittests/ADT/RangeAdapterTest.cpp<br>
+++ b/llvm/unittests/ADT/RangeAdapterTest.cpp<br>
@@ -129,7 +129,7 @@ template <typename T> class RangeAdapterLValueTest : public ::testing::Test {};<br>
<br>
typedef ::testing::Types<std::vector<int>, std::list<int>, int[4]><br>
RangeAdapterLValueTestTypes;<br>
-TYPED_TEST_CASE(RangeAdapterLValueTest, RangeAdapterLValueTestTypes);<br>
+TYPED_TEST_SUITE(RangeAdapterLValueTest, RangeAdapterLValueTestTypes);<br>
<br>
TYPED_TEST(RangeAdapterLValueTest, TrivialOperation) {<br>
TypeParam v = {0, 1, 2, 3};<br>
@@ -145,7 +145,7 @@ typedef ::testing::Types<std::vector<int>, std::list<int>, CustomIteratorVector,<br>
ReverseOnlyVector, BidirectionalVector,<br>
BidirectionalVectorConsts><br>
RangeAdapterRValueTestTypes;<br>
-TYPED_TEST_CASE(RangeAdapterRValueTest, RangeAdapterRValueTestTypes);<br>
+TYPED_TEST_SUITE(RangeAdapterRValueTest, RangeAdapterRValueTestTypes);<br>
<br>
TYPED_TEST(RangeAdapterRValueTest, TrivialOperation) {<br>
TestRev(reverse(TypeParam({0, 1, 2, 3})));<br>
<br>
diff --git a/llvm/unittests/ADT/STLForwardCompatTest.cpp b/llvm/unittests/ADT/STLForwardCompatTest.cpp<br>
index f85669516b79d..e8521fad26632 100644<br>
--- a/llvm/unittests/ADT/STLForwardCompatTest.cpp<br>
+++ b/llvm/unittests/ADT/STLForwardCompatTest.cpp<br>
@@ -59,7 +59,7 @@ using STLForwardCompatRemoveCVRefTestTypes = ::testing::Types<<br>
// clang-format on<br>
>;<br>
<br>
-TYPED_TEST_CASE(STLForwardCompatRemoveCVRefTest,<br>
+TYPED_TEST_SUITE(STLForwardCompatRemoveCVRefTest,<br>
STLForwardCompatRemoveCVRefTestTypes);<br>
<br>
TYPED_TEST(STLForwardCompatRemoveCVRefTest, RemoveCVRef) {<br>
<br>
diff --git a/llvm/unittests/ADT/SmallVectorTest.cpp b/llvm/unittests/ADT/SmallVectorTest.cpp<br>
index a533bb850a451..4673c659382d4 100644<br>
--- a/llvm/unittests/ADT/SmallVectorTest.cpp<br>
+++ b/llvm/unittests/ADT/SmallVectorTest.cpp<br>
@@ -208,7 +208,7 @@ typedef ::testing::Types<SmallVector<Constructable, 0>,<br>
SmallVector<Constructable, 4>,<br>
SmallVector<Constructable, 5><br>
> SmallVectorTestTypes;<br>
-TYPED_TEST_CASE(SmallVectorTest, SmallVectorTestTypes);<br>
+TYPED_TEST_SUITE(SmallVectorTest, SmallVectorTestTypes);<br>
<br>
// Constructor test.<br>
TYPED_TEST(SmallVectorTest, ConstructorNonIterTest) {<br>
@@ -811,7 +811,7 @@ typedef ::testing::Types<<br>
std::pair<SmallVector<Constructable, 2>, SmallVector<Constructable, 2>><br>
> DualSmallVectorTestTypes;<br>
<br>
-TYPED_TEST_CASE(DualSmallVectorsTest, DualSmallVectorTestTypes);<br>
+TYPED_TEST_SUITE(DualSmallVectorsTest, DualSmallVectorTestTypes);<br>
<br>
TYPED_TEST(DualSmallVectorsTest, MoveAssignment) {<br>
SCOPED_TRACE("MoveAssignTest-DualVectorTypes");<br>
@@ -1095,7 +1095,7 @@ class SmallVectorReferenceInvalidationTest : public SmallVectorTestBase {<br>
using SmallVectorReferenceInvalidationTestTypes =<br>
::testing::Types<SmallVector<int, 3>, SmallVector<Constructable, 3>>;<br>
<br>
-TYPED_TEST_CASE(SmallVectorReferenceInvalidationTest,<br>
+TYPED_TEST_SUITE(SmallVectorReferenceInvalidationTest,<br>
SmallVectorReferenceInvalidationTestTypes);<br>
<br>
TYPED_TEST(SmallVectorReferenceInvalidationTest, PushBack) {<br>
@@ -1382,7 +1382,7 @@ using SmallVectorInternalReferenceInvalidationTestTypes =<br>
::testing::Types<SmallVector<std::pair<int, int>, 3>,<br>
SmallVector<std::pair<Constructable, Constructable>, 3>>;<br>
<br>
-TYPED_TEST_CASE(SmallVectorInternalReferenceInvalidationTest,<br>
+TYPED_TEST_SUITE(SmallVectorInternalReferenceInvalidationTest,<br>
SmallVectorInternalReferenceInvalidationTestTypes);<br>
<br>
TYPED_TEST(SmallVectorInternalReferenceInvalidationTest, EmplaceBack) {<br>
<br>
diff --git a/llvm/unittests/ADT/TinyPtrVectorTest.cpp b/llvm/unittests/ADT/TinyPtrVectorTest.cpp<br>
index f88534787c9e4..d59bd7f4c5b47 100644<br>
--- a/llvm/unittests/ADT/TinyPtrVectorTest.cpp<br>
+++ b/llvm/unittests/ADT/TinyPtrVectorTest.cpp<br>
@@ -83,7 +83,7 @@ class TinyPtrVectorTest : public testing::Test {<br>
typedef ::testing::Types<TinyPtrVector<int *>, TinyPtrVector<double *>,<br>
TinyPtrVector<PointerIntPair<int *, 1>>><br>
TinyPtrVectorTestTypes;<br>
-TYPED_TEST_CASE(TinyPtrVectorTest, TinyPtrVectorTestTypes);<br>
+TYPED_TEST_SUITE(TinyPtrVectorTest, TinyPtrVectorTestTypes);<br>
<br>
TYPED_TEST(TinyPtrVectorTest, EmptyTest) {<br>
this->expectValues(this->V, this->testArray(0));<br>
<br>
diff --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp<br>
index 99a0f6daa84db..2cfbc4cc65f55 100644<br>
--- a/llvm/unittests/Analysis/ValueTrackingTest.cpp<br>
+++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp<br>
@@ -1859,8 +1859,8 @@ const std::pair<const char *, const char *> IsBytewiseValueTests[] = {<br>
},<br>
};<br>
<br>
-INSTANTIATE_TEST_CASE_P(IsBytewiseValueParamTests, IsBytewiseValueTest,<br>
- ::testing::ValuesIn(IsBytewiseValueTests),);<br>
+INSTANTIATE_TEST_SUITE_P(IsBytewiseValueParamTests, IsBytewiseValueTest,<br>
+ ::testing::ValuesIn(IsBytewiseValueTests));<br>
<br>
TEST_P(IsBytewiseValueTest, IsBytewiseValue) {<br>
auto M = parseModule(std::string("@test = global ") + GetParam().second);<br>
@@ -2182,5 +2182,5 @@ TEST_P(FindAllocaForValueTest, findAllocaForValueZeroOffset) {<br>
EXPECT_EQ(!!AI, GetParam().ZeroOffsetResult);<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(FindAllocaForValueTest, FindAllocaForValueTest,<br>
- ::testing::ValuesIn(FindAllocaForValueTests), );<br>
+INSTANTIATE_TEST_SUITE_P(FindAllocaForValueTest, FindAllocaForValueTest,<br>
+ ::testing::ValuesIn(FindAllocaForValueTests));<br>
<br>
diff --git a/llvm/unittests/CodeGen/DIETest.cpp b/llvm/unittests/CodeGen/DIETest.cpp<br>
index 44fb0c0bf6c88..2e3f7b5f76c18 100644<br>
--- a/llvm/unittests/CodeGen/DIETest.cpp<br>
+++ b/llvm/unittests/CodeGen/DIETest.cpp<br>
@@ -67,7 +67,7 @@ TEST_P(DIEExprFixture, EmitValue) {<br>
Tst.emitValue(TestPrinter->getAP(), Form);<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
DIETestParams, DIEExprFixture,<br>
testing::Values(<br>
DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data4, 4u},<br>
@@ -75,7 +75,7 @@ INSTANTIATE_TEST_CASE_P(<br>
DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_sec_offset, 4u},<br>
DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data4, 4u},<br>
DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u},<br>
- DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}), );<br>
+ DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}));<br>
<br>
struct DIELabelFixture : public DIEFixtureBase {<br>
void SetUp() override {<br>
@@ -113,7 +113,7 @@ TEST_P(DIELabelFixture, EmitValue) {<br>
EXPECT_EQ(&(ActualArg0->getSymbol()), Val);<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
DIETestParams, DIELabelFixture,<br>
testing::Values(<br>
DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data4, 4u},<br>
@@ -125,7 +125,7 @@ INSTANTIATE_TEST_CASE_P(<br>
DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u},<br>
DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u},<br>
DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_strp, 8u},<br>
- DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_addr, 8u}), );<br>
+ DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_addr, 8u}));<br>
<br>
struct DIEDeltaFixture : public DIEFixtureBase {<br>
void SetUp() override {<br>
@@ -158,7 +158,7 @@ TEST_P(DIEDeltaFixture, EmitValue) {<br>
Tst.emitValue(TestPrinter->getAP(), Form);<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
DIETestParams, DIEDeltaFixture,<br>
testing::Values(<br>
DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data4, 4u},<br>
@@ -166,7 +166,7 @@ INSTANTIATE_TEST_CASE_P(<br>
DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_sec_offset, 4u},<br>
DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data4, 4u},<br>
DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u},<br>
- DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}), );<br>
+ DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}));<br>
<br>
struct DIELocListFixture : public DIEFixtureBase {<br>
void SetUp() override { DIEFixtureBase::SetUp(); }<br>
@@ -180,7 +180,7 @@ TEST_P(DIELocListFixture, SizeOf) {<br>
EXPECT_EQ(Size, Tst.SizeOf(TestPrinter->getAP(), Form));<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
DIETestParams, DIELocListFixture,<br>
testing::Values(<br>
DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_loclistx, 2u},<br>
@@ -188,6 +188,6 @@ INSTANTIATE_TEST_CASE_P(<br>
DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_sec_offset, 4u},<br>
DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_loclistx, 2u},<br>
DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u},<br>
- DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}), );<br>
+ DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}));<br>
<br>
} // end namespace<br>
<br>
diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp<br>
index 987e0e46ed195..9de6c83f5cc66 100644<br>
--- a/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp<br>
+++ b/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp<br>
@@ -349,10 +349,10 @@ TEST_P(DebugLineUnsupportedVersionFixture, ErrorForUnsupportedVersion) {<br>
std::to_string(Version)));<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(UnsupportedVersionTestParams,<br>
- DebugLineUnsupportedVersionFixture,<br>
- Values(/*1 below min */ 1, /* 1 above max */ 6,<br>
- /* Maximum possible */ 0xffff), );<br>
+INSTANTIATE_TEST_SUITE_P(UnsupportedVersionTestParams,<br>
+ DebugLineUnsupportedVersionFixture,<br>
+ Values(/*1 below min */ 1, /* 1 above max */ 6,<br>
+ /* Maximum possible */ 0xffff));<br>
<br>
TEST_F(DebugLineBasicFixture, ErrorForInvalidV5IncludeDirTable) {<br>
if (!setupGenerator(5))<br>
@@ -477,13 +477,13 @@ TEST_P(DebugLineParameterisedFixture, ErrorForTooShortPrologueLength) {<br>
FailedWithMessageArray(testing::ElementsAreArray(Errs)));<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
LineTableTestParams, DebugLineParameterisedFixture,<br>
Values(std::make_pair(<br>
2, DWARF32), // Test lower-bound of v2-3 fields and DWARF32.<br>
std::make_pair(3, DWARF32), // Test upper-bound of v2-3 fields.<br>
std::make_pair(4, DWARF64), // Test v4 fields and DWARF64.<br>
- std::make_pair(5, DWARF32), std::make_pair(5, DWARF64)), );<br>
+ std::make_pair(5, DWARF32), std::make_pair(5, DWARF64)));<br>
<br>
TEST_F(DebugLineBasicFixture, ErrorForExtendedOpcodeLengthSmallerThanExpected) {<br>
if (!setupGenerator())<br>
@@ -950,13 +950,13 @@ TEST_P(MaxOpsPerInstFixture, MaxOpsPerInstProblemsReportedCorrectly) {<br>
", which is unsupported. Assuming a value of 1 instead");<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
MaxOpsPerInstParams, MaxOpsPerInstFixture,<br>
Values(std::make_tuple(3, 0, false), // Test for version < 4 (no error).<br>
std::make_tuple(4, 0, true), // Test zero value for V4 (error).<br>
std::make_tuple(4, 1, false), // Test good value for V4 (no error).<br>
std::make_tuple(<br>
- 4, 2, true)), ); // Test one higher than permitted V4 (error).<br>
+ 4, 2, true))); // Test one higher than permitted V4 (error).<br>
<br>
struct LineRangeFixture : TestWithParam<std::tuple<uint8_t, bool>>,<br>
AdjustAddressFixtureBase {<br>
@@ -993,10 +993,10 @@ TEST_P(LineRangeFixture, LineRangeProblemsReportedCorrectly) {<br>
"not be adjusted");<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
LineRangeParams, LineRangeFixture,<br>
- Values(std::make_tuple(0, true), // Test zero value (error).<br>
- std::make_tuple(14, false)), ); // Test non-zero value (no error).<br>
+ Values(std::make_tuple(0, true), // Test zero value (error).<br>
+ std::make_tuple(14, false))); // Test non-zero value (no error).<br>
<br>
struct BadMinInstLenFixture : TestWithParam<std::tuple<uint8_t, bool>>,<br>
AdjustAddressFixtureBase {<br>
@@ -1028,10 +1028,10 @@ TEST_P(BadMinInstLenFixture, MinInstLengthProblemsReportedCorrectly) {<br>
"prevents any address advancing");<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
BadMinInstLenParams, BadMinInstLenFixture,<br>
- Values(std::make_tuple(0, true), // Test zero value (error).<br>
- std::make_tuple(1, false)), ); // Test non-zero value (no error).<br>
+ Values(std::make_tuple(0, true), // Test zero value (error).<br>
+ std::make_tuple(1, false))); // Test non-zero value (no error).<br>
<br>
TEST_F(DebugLineBasicFixture, ParserParsesCorrectly) {<br>
if (!setupGenerator())<br>
@@ -1422,7 +1422,7 @@ TEST_P(TruncatedPrologueFixture, ErrorForTruncatedPrologue) {<br>
EXPECT_EQ(Offset, ExpectedOffset);<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
TruncatedPrologueParams, TruncatedPrologueFixture,<br>
Values(<br>
// Truncated length:<br>
@@ -1501,7 +1501,7 @@ INSTANTIATE_TEST_CASE_P(<br>
std::make_tuple(<br>
0x12, 0x12, 4, DWARF32,<br>
"parsing line table prologue at offset 0x00000001: unexpected end "<br>
- "of data at offset 0x12 while reading [0x12, 0x13)")), );<br>
+ "of data at offset 0x12 while reading [0x12, 0x13)")));<br>
<br>
using ValueAndLengths = std::vector<LineTable::ValueAndLength>;<br>
<br>
@@ -1581,7 +1581,7 @@ TEST_P(TruncatedExtendedOpcodeFixture, ErrorForTruncatedExtendedOpcode) {<br>
FailedWithMessage(ExpectedErr.str()));<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
TruncatedExtendedOpcodeParams, TruncatedExtendedOpcodeFixture,<br>
Values(<br>
// Truncated length:<br>
@@ -1648,7 +1648,7 @@ INSTANTIATE_TEST_CASE_P(<br>
ValueAndLengths{{0x12343412, LineTable::Long}},<br>
"Unrecognized extended op 0x7f length 5 (<parsing error> 12 34 34)",<br>
"unexpected end of data at offset 0x35 while reading [0x32, "<br>
- "0x36)")), );<br>
+ "0x36)")));<br>
<br>
TEST_P(TruncatedStandardOpcodeFixture, ErrorForTruncatedStandardOpcode) {<br>
if (!setupGenerator())<br>
@@ -1660,7 +1660,7 @@ TEST_P(TruncatedStandardOpcodeFixture, ErrorForTruncatedStandardOpcode) {<br>
FailedWithMessage(ExpectedErr.str()));<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
TruncatedStandardOpcodeParams, TruncatedStandardOpcodeFixture,<br>
Values(<br>
std::make_tuple(2, DW_LNS_advance_pc,<br>
@@ -1704,7 +1704,7 @@ INSTANTIATE_TEST_CASE_P(<br>
ValueAndLengths{{0x900, LineTable::ULEB}, {0xa00, LineTable::ULEB}},<br>
"Unrecognized standard opcode (operands: 0x0000000000000900)",<br>
"unable to decode LEB128 at offset 0x00000032: "<br>
- "malformed uleb128, extends past end")), );<br>
+ "malformed uleb128, extends past end")));<br>
<br>
TEST_F(DebugLineBasicFixture, PrintPathsProperly) {<br>
if (!setupGenerator(5))<br>
<br>
diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFFormValueTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFFormValueTest.cpp<br>
index 0a0b8084f65f0..954abb7691253 100644<br>
--- a/llvm/unittests/DebugInfo/DWARF/DWARFFormValueTest.cpp<br>
+++ b/llvm/unittests/DebugInfo/DWARF/DWARFFormValueTest.cpp<br>
@@ -187,7 +187,7 @@ struct FormSkipValueFixture2 : FormSkipValueFixtureBase {};<br>
TEST_P(FormSkipValueFixture1, skipValuePart1) { doSkipValueTest(); }<br>
TEST_P(FormSkipValueFixture2, skipValuePart2) { doSkipValueTest(); }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
SkipValueTestParams1, FormSkipValueFixture1,<br>
testing::Values(<br>
// Form, Version, AddrSize, DwarfFormat, InitialData, ExpectedSize,<br>
@@ -246,9 +246,9 @@ INSTANTIATE_TEST_CASE_P(<br>
ParamType(DW_FORM_strp_sup, 0, 1, DWARF32, SampleU32, 0, false),<br>
ParamType(DW_FORM_strp_sup, 1, 0, DWARF32, SampleU32, 0, false),<br>
ParamType(DW_FORM_strp_sup, 1, 1, DWARF32, SampleU32, 4, true),<br>
- ParamType(DW_FORM_strp_sup, 1, 1, DWARF64, SampleU32, 8, true)), );<br>
+ ParamType(DW_FORM_strp_sup, 1, 1, DWARF64, SampleU32, 8, true)));<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
SkipValueTestParams2, FormSkipValueFixture2,<br>
testing::Values(<br>
ParamType(DW_FORM_line_strp, 0, 1, DWARF32, SampleU32, 0, false),<br>
@@ -301,8 +301,7 @@ INSTANTIATE_TEST_CASE_P(<br>
ArrayRef<uint8_t>(IndirectIndirectEnd,<br>
sizeof(IndirectIndirectEnd)),<br>
2, false),<br>
- ParamType(/*Unknown=*/Form(0xff), 4, 4, DWARF32, SampleU32, 0,<br>
- false)), );<br>
+ ParamType(/*Unknown=*/Form(0xff), 4, 4, DWARF32, SampleU32, 0, false)));<br>
<br>
using ErrorParams = std::tuple<Form, std::vector<uint8_t>>;<br>
struct ExtractValueErrorFixture : public testing::TestWithParam<ErrorParams> {<br>
@@ -323,7 +322,7 @@ TEST_P(ExtractValueErrorFixture, Test) {<br>
EXPECT_FALSE(Form.extractValue(Data, &Offset, {0, 0, DWARF32}));<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ExtractValueErrorParams, ExtractValueErrorFixture,<br>
testing::Values(<br>
ErrorParams{DW_FORM_ref_addr, {}}, ErrorParams{DW_FORM_block, {}},<br>
@@ -336,8 +335,7 @@ INSTANTIATE_TEST_CASE_P(<br>
ErrorParams{DW_FORM_udata, {}}, ErrorParams{DW_FORM_string, {}},<br>
ErrorParams{DW_FORM_indirect, {}},<br>
ErrorParams{DW_FORM_indirect, {DW_FORM_data1}},<br>
- ErrorParams{DW_FORM_strp_sup, {}},<br>
- ErrorParams{DW_FORM_ref_sig8, {}}), );<br>
+ ErrorParams{DW_FORM_strp_sup, {}}, ErrorParams{DW_FORM_ref_sig8, {}}));<br>
<br>
using DumpValueParams =<br>
std::tuple<Form, ArrayRef<uint8_t>, DwarfFormat, StringRef>;<br>
@@ -379,7 +377,7 @@ ArrayRef<uint8_t> DumpTestSample32 = toBytes(DumpTestSample32Val);<br>
const uint64_t DumpTestSample64Val = 0x11223344556677;<br>
ArrayRef<uint8_t> DumpTestSample64 = toBytes(DumpTestSample64Val);<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
DumpValueParams, DumpValueFixture,<br>
testing::Values(DumpValueParams{DW_FORM_strp, DumpTestSample32, DWARF32,<br>
" .debug_str[0x00112233] = "},<br>
@@ -393,6 +391,6 @@ INSTANTIATE_TEST_CASE_P(<br>
DumpValueParams{DW_FORM_sec_offset, DumpTestSample32,<br>
DWARF32, "0x00112233"},<br>
DumpValueParams{DW_FORM_sec_offset, DumpTestSample64,<br>
- DWARF64, "0x0011223344556677"}), );<br>
+ DWARF64, "0x0011223344556677"}));<br>
<br>
} // end anonymous namespace<br>
<br>
diff --git a/llvm/unittests/FileCheck/FileCheckTest.cpp b/llvm/unittests/FileCheck/FileCheckTest.cpp<br>
index 60ada3836a6a1..f3b5d3d2aaab6 100644<br>
--- a/llvm/unittests/FileCheck/FileCheckTest.cpp<br>
+++ b/llvm/unittests/FileCheck/FileCheckTest.cpp<br>
@@ -330,7 +330,7 @@ TEST_P(ExpressionFormatParameterisedFixture, FormatBoolOperator) {<br>
EXPECT_TRUE(bool(Format));<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
AllowedExplicitExpressionFormat, ExpressionFormatParameterisedFixture,<br>
::testing::Values(<br>
std::make_tuple(ExpressionFormat::Kind::Unsigned, 0, false),<br>
@@ -355,7 +355,7 @@ INSTANTIATE_TEST_CASE_P(<br>
std::make_tuple(ExpressionFormat::Kind::HexUpper, 16, true),<br>
<br>
std::make_tuple(ExpressionFormat::Kind::Unsigned, 20, false),<br>
- std::make_tuple(ExpressionFormat::Kind::Signed, 20, false)), );<br>
+ std::make_tuple(ExpressionFormat::Kind::Signed, 20, false)));<br>
<br>
TEST_F(FileCheckTest, NoFormatProperties) {<br>
ExpressionFormat NoFormat(ExpressionFormat::Kind::NoFormat);<br>
<br>
diff --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp<br>
index 894311363ba10..35a52310d3767 100644<br>
--- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp<br>
+++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp<br>
@@ -1827,7 +1827,7 @@ TEST_P(OpenMPIRBuilderTestWithParams, DynamicWorkShareLoop) {<br>
EXPECT_FALSE(verifyModule(*M, &errs()));<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(OpenMPWSLoopSchedulingTypes,<br>
+INSTANTIATE_TEST_SUITE_P(OpenMPWSLoopSchedulingTypes,<br>
OpenMPIRBuilderTestWithParams,<br>
::testing::Values(omp::OMPScheduleType::DynamicChunked,<br>
omp::OMPScheduleType::GuidedChunked,<br>
<br>
diff --git a/llvm/unittests/IR/PassBuilderCallbacksTest.cpp b/llvm/unittests/IR/PassBuilderCallbacksTest.cpp<br>
index 6d0b9e8abcb6d..e0bd129bc1605 100644<br>
--- a/llvm/unittests/IR/PassBuilderCallbacksTest.cpp<br>
+++ b/llvm/unittests/IR/PassBuilderCallbacksTest.cpp<br>
@@ -27,11 +27,12 @@ using namespace llvm;<br>
namespace {<br>
using testing::AnyNumber;<br>
using testing::AtLeast;<br>
+using testing::DoAll;<br>
using testing::DoDefault;<br>
-using testing::Not;<br>
-using testing::Return;<br>
using testing::Expectation;<br>
using testing::Invoke;<br>
+using testing::Not;<br>
+using testing::Return;<br>
using testing::WithArgs;<br>
using testing::_;<br>
<br>
<br>
diff --git a/llvm/unittests/IR/PatternMatch.cpp b/llvm/unittests/IR/PatternMatch.cpp<br>
index fd4e446738b0b..31b312ba35d15 100644<br>
--- a/llvm/unittests/IR/PatternMatch.cpp<br>
+++ b/llvm/unittests/IR/PatternMatch.cpp<br>
@@ -1641,7 +1641,7 @@ template <typename T> struct MutableConstTest : PatternMatchTest { };<br>
typedef ::testing::Types<std::tuple<Value*, Instruction*>,<br>
std::tuple<const Value*, const Instruction *>><br>
MutableConstTestTypes;<br>
-TYPED_TEST_CASE(MutableConstTest, MutableConstTestTypes);<br>
+TYPED_TEST_SUITE(MutableConstTest, MutableConstTestTypes);<br>
<br>
TYPED_TEST(MutableConstTest, ICmp) {<br>
auto &IRB = PatternMatchTest::IRB;<br>
<br>
diff --git a/llvm/unittests/IR/ValueMapTest.cpp b/llvm/unittests/IR/ValueMapTest.cpp<br>
index cfb37f0b8df7f..57f2b7bea19ae 100644<br>
--- a/llvm/unittests/IR/ValueMapTest.cpp<br>
+++ b/llvm/unittests/IR/ValueMapTest.cpp<br>
@@ -35,7 +35,7 @@ class ValueMapTest : public testing::Test {<br>
// Run everything on Value*, a subtype to make sure that casting works as<br>
// expected, and a const subtype to make sure we cast const correctly.<br>
typedef ::testing::Types<Value, Instruction, const Instruction> KeyTypes;<br>
-TYPED_TEST_CASE(ValueMapTest, KeyTypes);<br>
+TYPED_TEST_SUITE(ValueMapTest, KeyTypes);<br>
<br>
TYPED_TEST(ValueMapTest, Null) {<br>
ValueMap<TypeParam*, int> VM1;<br>
<br>
diff --git a/llvm/unittests/Passes/PluginsTest.cpp b/llvm/unittests/Passes/PluginsTest.cpp<br>
index 62334c828cb4b..9fa5a0bdaf983 100644<br>
--- a/llvm/unittests/Passes/PluginsTest.cpp<br>
+++ b/llvm/unittests/Passes/PluginsTest.cpp<br>
@@ -27,8 +27,7 @@ using namespace llvm;<br>
void anchor() {}<br>
<br>
static std::string LibPath(const std::string Name = "TestPlugin") {<br>
- const std::vector<testing::internal::string> &Argvs =<br>
- testing::internal::GetArgvs();<br>
+ const auto &Argvs = testing::internal::GetArgvs();<br>
const char *Argv0 = Argvs.size() > 0 ? Argvs[0].c_str() : "PluginsTests";<br>
void *Ptr = (void *)(intptr_t)anchor;<br>
std::string Path = sys::fs::getMainExecutable(Argv0, Ptr);<br>
<br>
diff --git a/llvm/unittests/ProfileData/CoverageMappingTest.cpp b/llvm/unittests/ProfileData/CoverageMappingTest.cpp<br>
index 6434474b06850..f1d09c28f035a 100644<br>
--- a/llvm/unittests/ProfileData/CoverageMappingTest.cpp<br>
+++ b/llvm/unittests/ProfileData/CoverageMappingTest.cpp<br>
@@ -893,11 +893,12 @@ TEST_P(CoverageMappingTest, skip_duplicate_function_record) {<br>
}<br>
<br>
// FIXME: Use ::testing::Combine() when llvm updates its copy of googletest.<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedCovMapTest, CoverageMappingTest,<br>
- ::testing::Values(std::pair<bool, bool>({false, false}),<br>
- std::pair<bool, bool>({false, true}),<br>
- std::pair<bool, bool>({true, false}),<br>
- std::pair<bool, bool>({true, true})),);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
+ ParameterizedCovMapTest, CoverageMappingTest,<br>
+ ::testing::Values(std::pair<bool, bool>({false, false}),<br>
+ std::pair<bool, bool>({false, true}),<br>
+ std::pair<bool, bool>({true, false}),<br>
+ std::pair<bool, bool>({true, true})));<br>
<br>
TEST(CoverageMappingTest, filename_roundtrip) {<br>
std::vector<std::string> Paths({"dir", "a", "b", "c", "d", "e"});<br>
<br>
diff --git a/llvm/unittests/ProfileData/InstrProfTest.cpp b/llvm/unittests/ProfileData/InstrProfTest.cpp<br>
index d94906991b0c6..d7661776d75fa 100644<br>
--- a/llvm/unittests/ProfileData/InstrProfTest.cpp<br>
+++ b/llvm/unittests/ProfileData/InstrProfTest.cpp<br>
@@ -1041,8 +1041,8 @@ TEST_F(SparseInstrProfTest, preserve_no_records) {<br>
ASSERT_TRUE(I == E);<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(MaybeSparse, MaybeSparseInstrProfTest,<br>
- ::testing::Bool(),);<br>
+INSTANTIATE_TEST_SUITE_P(MaybeSparse, MaybeSparseInstrProfTest,<br>
+ ::testing::Bool());<br>
<br>
#if defined(_LP64) && defined(EXPENSIVE_CHECKS)<br>
TEST(ProfileReaderTest, ReadsLargeFiles) {<br>
<br>
diff --git a/llvm/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp b/llvm/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp<br>
index a06399a0b3133..6c9063775a59d 100644<br>
--- a/llvm/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp<br>
+++ b/llvm/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp<br>
@@ -19,8 +19,7 @@ using namespace llvm;<br>
using namespace llvm::sys;<br>
<br>
std::string LibPath(const std::string Name = "PipSqueak") {<br>
- const std::vector<testing::internal::string> &Argvs =<br>
- testing::internal::GetArgvs();<br>
+ const auto &Argvs = testing::internal::GetArgvs();<br>
const char *Argv0 =<br>
Argvs.size() > 0 ? Argvs[0].c_str() : "DynamicLibraryTests";<br>
void *Ptr = (void*)(intptr_t)TestA;<br>
<br>
diff --git a/llvm/unittests/Support/MathExtrasTest.cpp b/llvm/unittests/Support/MathExtrasTest.cpp<br>
index d899af9685e30..50dd1513e0274 100644<br>
--- a/llvm/unittests/Support/MathExtrasTest.cpp<br>
+++ b/llvm/unittests/Support/MathExtrasTest.cpp<br>
@@ -483,7 +483,7 @@ class OverflowTest : public ::testing::Test { };<br>
using OverflowTestTypes = ::testing::Types<signed char, short, int, long,<br>
long long>;<br>
<br>
-TYPED_TEST_CASE(OverflowTest, OverflowTestTypes);<br>
+TYPED_TEST_SUITE(OverflowTest, OverflowTestTypes);<br>
<br>
TYPED_TEST(OverflowTest, AddNoOverflow) {<br>
TypeParam Result;<br>
<br>
diff --git a/llvm/unittests/Support/MemoryTest.cpp b/llvm/unittests/Support/MemoryTest.cpp<br>
index 6e5f7472e4549..bcbbd285823ee 100644<br>
--- a/llvm/unittests/Support/MemoryTest.cpp<br>
+++ b/llvm/unittests/Support/MemoryTest.cpp<br>
@@ -428,8 +428,7 @@ unsigned MemoryFlags[] = {<br>
Memory::MF_READ|Memory::MF_WRITE|Memory::MF_EXEC<br>
};<br>
<br>
-INSTANTIATE_TEST_CASE_P(AllocationTests,<br>
- MappedMemoryTest,<br>
- ::testing::ValuesIn(MemoryFlags),);<br>
+INSTANTIATE_TEST_SUITE_P(AllocationTests, MappedMemoryTest,<br>
+ ::testing::ValuesIn(MemoryFlags));<br>
<br>
} // anonymous namespace<br>
<br>
diff --git a/llvm/unittests/Support/TargetParserTest.cpp b/llvm/unittests/Support/TargetParserTest.cpp<br>
index e820ff8754d22..0d4fd08b7fce1 100644<br>
--- a/llvm/unittests/Support/TargetParserTest.cpp<br>
+++ b/llvm/unittests/Support/TargetParserTest.cpp<br>
@@ -118,7 +118,7 @@ TEST_P(ARMCPUTestFixture, ARMCPUTests) {<br>
// we expect. This is because the default extensions for a CPU are the sum<br>
// of the default extensions for its architecture and for the CPU.<br>
// So if a CPU has no extra extensions, it adds AEK_NONE.<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ARMCPUTestsPart1, ARMCPUTestFixture,<br>
::testing::Values(<br>
ARMCPUTestParams("invalid", "invalid", "invalid", ARM::AEK_NONE, ""),<br>
@@ -194,11 +194,11 @@ INSTANTIATE_TEST_CASE_P(<br>
ARM::AEK_SEC | ARM::AEK_VIRT | ARM::AEK_DSP,<br>
"7-A"),<br>
ARMCPUTestParams("cortex-a8", "armv7-a", "neon",<br>
- ARM::AEK_SEC | ARM::AEK_DSP, "7-A")), );<br>
+ ARM::AEK_SEC | ARM::AEK_DSP, "7-A")));<br>
<br>
// gtest in llvm has a limit of 50 test cases when using ::Values so we split<br>
// them into 2 blocks<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
ARMCPUTestsPart2, ARMCPUTestFixture,<br>
::testing::Values(<br>
ARMCPUTestParams("cortex-a9", "armv7-a", "neon-fp16",<br>
@@ -309,10 +309,9 @@ INSTANTIATE_TEST_CASE_P(<br>
ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD,<br>
"8.2-A"),<br>
ARMCPUTestParams("cortex-a78c", "armv8.2-a", "crypto-neon-fp-armv8",<br>
- ARM::AEK_SEC | ARM::AEK_MP |<br>
- ARM::AEK_VIRT | ARM::AEK_HWDIVARM |<br>
- ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |<br>
- ARM::AEK_CRC | ARM::AEK_RAS |<br>
+ ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |<br>
+ ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |<br>
+ ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS |<br>
ARM::AEK_FP16 | ARM::AEK_DOTPROD,<br>
"8.2-A"),<br>
ARMCPUTestParams("cortex-a77", "armv8.2-a", "crypto-neon-fp-armv8",<br>
@@ -390,7 +389,7 @@ INSTANTIATE_TEST_CASE_P(<br>
ARMCPUTestParams("xscale", "xscale", "none", ARM::AEK_NONE, "xscale"),<br>
ARMCPUTestParams("swift", "armv7s", "neon-vfpv4",<br>
ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,<br>
- "7-S")), );<br>
+ "7-S")));<br>
<br>
static constexpr unsigned NumARMCPUArchs = 92;<br>
<br>
@@ -876,7 +875,7 @@ TEST_P(AArch64CPUTestFixture, testAArch64CPU) {<br>
EXPECT_EQ(params.CPUAttr, AArch64::getCPUAttr(AK));<br>
}<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
AArch64CPUTests, AArch64CPUTestFixture,<br>
::testing::Values(<br>
ARMCPUTestParams("invalid", "invalid", "invalid", AArch64::AEK_NONE,<br>
@@ -1180,7 +1179,7 @@ INSTANTIATE_TEST_CASE_P(<br>
AArch64::AEK_FP | AArch64::AEK_SIMD |<br>
AArch64::AEK_FP16 | AArch64::AEK_RAS |<br>
AArch64::AEK_LSE | AArch64::AEK_RDM,<br>
- "8.2-A")), );<br>
+ "8.2-A")));<br>
<br>
static constexpr unsigned NumAArch64CPUArchs = 48;<br>
<br>
<br>
diff --git a/llvm/unittests/XRay/FDRProducerConsumerTest.cpp b/llvm/unittests/XRay/FDRProducerConsumerTest.cpp<br>
index 6eff4dfcc505f..f96ba55476d32 100644<br>
--- a/llvm/unittests/XRay/FDRProducerConsumerTest.cpp<br>
+++ b/llvm/unittests/XRay/FDRProducerConsumerTest.cpp<br>
@@ -94,7 +94,7 @@ template <class T> class RoundTripTest : public ::testing::Test {<br>
std::unique_ptr<Record> Rec;<br>
};<br>
<br>
-TYPED_TEST_CASE_P(RoundTripTest);<br>
+TYPED_TEST_SUITE_P(RoundTripTest);<br>
<br>
template <class T> class RoundTripTestV5 : public ::testing::Test {<br>
public:<br>
@@ -117,7 +117,7 @@ template <class T> class RoundTripTestV5 : public ::testing::Test {<br>
std::unique_ptr<Record> Rec;<br>
};<br>
<br>
-TYPED_TEST_CASE_P(RoundTripTestV5);<br>
+TYPED_TEST_SUITE_P(RoundTripTestV5);<br>
<br>
// This test ensures that the writing and reading implementations are in sync --<br>
// that given write(read(write(R))) == R.<br>
@@ -160,7 +160,7 @@ TYPED_TEST_P(RoundTripTest, RoundTripsSingleValue) {<br>
EXPECT_THAT(Records[1]->getRecordType(), Eq(R->getRecordType()));<br>
}<br>
<br>
-REGISTER_TYPED_TEST_CASE_P(RoundTripTest, RoundTripsSingleValue);<br>
+REGISTER_TYPED_TEST_SUITE_P(RoundTripTest, RoundTripsSingleValue);<br>
<br>
// We duplicate the above case for the V5 version using <br>
diff erent types and<br>
// encodings.<br>
@@ -201,21 +201,21 @@ TYPED_TEST_P(RoundTripTestV5, RoundTripsSingleValue) {<br>
EXPECT_THAT(Records[1]->getRecordType(), Eq(R->getRecordType()));<br>
}<br>
<br>
-REGISTER_TYPED_TEST_CASE_P(RoundTripTestV5, RoundTripsSingleValue);<br>
+REGISTER_TYPED_TEST_SUITE_P(RoundTripTestV5, RoundTripsSingleValue);<br>
<br>
// These are the record types we support for v4 and below.<br>
using RecordTypes =<br>
::testing::Types<NewBufferRecord, NewCPUIDRecord, TSCWrapRecord,<br>
WallclockRecord, CustomEventRecord, CallArgRecord,<br>
PIDRecord, FunctionRecord>;<br>
-INSTANTIATE_TYPED_TEST_CASE_P(Records, RoundTripTest, RecordTypes);<br>
+INSTANTIATE_TYPED_TEST_SUITE_P(Records, RoundTripTest, RecordTypes);<br>
<br>
// For V5, we have two new types we're supporting.<br>
using RecordTypesV5 =<br>
::testing::Types<NewBufferRecord, NewCPUIDRecord, TSCWrapRecord,<br>
WallclockRecord, CustomEventRecordV5, TypedEventRecord,<br>
CallArgRecord, PIDRecord, FunctionRecord>;<br>
-INSTANTIATE_TYPED_TEST_CASE_P(Records, RoundTripTestV5, RecordTypesV5);<br>
+INSTANTIATE_TYPED_TEST_SUITE_P(Records, RoundTripTestV5, RecordTypesV5);<br>
<br>
} // namespace<br>
} // namespace xray<br>
<br>
diff --git a/llvm/unittests/XRay/FDRRecordPrinterTest.cpp b/llvm/unittests/XRay/FDRRecordPrinterTest.cpp<br>
index bfee1c5d388c4..a1fb8c3183dbe 100644<br>
--- a/llvm/unittests/XRay/FDRRecordPrinterTest.cpp<br>
+++ b/llvm/unittests/XRay/FDRRecordPrinterTest.cpp<br>
@@ -107,7 +107,7 @@ template <class T> class PrinterTest : public ::testing::Test {<br>
PrinterTest() : Data(), OS(Data), P(OS), R(Helper<T>::construct()) {}<br>
};<br>
<br>
-TYPED_TEST_CASE_P(PrinterTest);<br>
+TYPED_TEST_SUITE_P(PrinterTest);<br>
<br>
TYPED_TEST_P(PrinterTest, PrintsRecord) {<br>
ASSERT_NE(nullptr, this->R);<br>
@@ -116,13 +116,13 @@ TYPED_TEST_P(PrinterTest, PrintsRecord) {<br>
EXPECT_THAT(this->Data, Eq(Helper<TypeParam>::expected()));<br>
}<br>
<br>
-REGISTER_TYPED_TEST_CASE_P(PrinterTest, PrintsRecord);<br>
+REGISTER_TYPED_TEST_SUITE_P(PrinterTest, PrintsRecord);<br>
using FDRRecordTypes =<br>
::testing::Types<BufferExtents, NewBufferRecord, EndBufferRecord,<br>
NewCPUIDRecord, TSCWrapRecord, WallclockRecord,<br>
CustomEventRecord, CallArgRecord, BufferExtents,<br>
PIDRecord>;<br>
-INSTANTIATE_TYPED_TEST_CASE_P(Records, PrinterTest, FDRRecordTypes);<br>
+INSTANTIATE_TYPED_TEST_SUITE_P(Records, PrinterTest, FDRRecordTypes);<br>
<br>
TEST(FDRRecordPrinterTest, WriteFunctionRecordEnter) {<br>
std::string Data;<br>
<br>
diff --git a/llvm/unittests/XRay/GraphTest.cpp b/llvm/unittests/XRay/GraphTest.cpp<br>
index 52580b3068266..f9453f57ebf02 100644<br>
--- a/llvm/unittests/XRay/GraphTest.cpp<br>
+++ b/llvm/unittests/XRay/GraphTest.cpp<br>
@@ -59,7 +59,7 @@ typedef ::testing::Types<GraphT, const GraphT> GraphTestTypes;<br>
using VVT = typename GraphT::VertexValueType;<br>
using EVT = typename GraphT::EdgeValueType;<br>
<br>
-TYPED_TEST_CASE(GraphTest, GraphTestTypes);<br>
+TYPED_TEST_SUITE(GraphTest, GraphTestTypes);<br>
<br>
template <typename T> void graphVertexTester(T &G) {<br>
std::set<unsigned> V({1u, 2u, 3u, 4u, 5u, 6u});<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-actions.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-actions.h<br>
index 5a00f3ba9f461..8cfc292e9b7c8 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-actions.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-actions.h<br>
@@ -44,15 +44,19 @@<br>
#endif<br>
<br>
#include <algorithm><br>
+#include <functional><br>
+#include <memory><br>
#include <string><br>
+#include <type_traits><br>
+#include <utility><br>
<br>
#include "gmock/internal/gmock-internal-utils.h"<br>
#include "gmock/internal/gmock-port.h"<br>
<br>
-#if GTEST_LANG_CXX11 // Defined by gtest-port.h via gmock-port.h.<br>
-#include <functional><br>
-#include <type_traits><br>
-#endif // GTEST_LANG_CXX11<br>
+#ifdef _MSC_VER<br>
+# pragma warning(push)<br>
+# pragma warning(disable:4100)<br>
+#endif<br>
<br>
namespace testing {<br>
<br>
@@ -67,9 +71,6 @@ namespace testing {<br>
<br>
namespace internal {<br>
<br>
-template <typename F1, typename F2><br>
-class ActionAdaptor;<br>
-<br>
// BuiltInDefaultValueGetter<T, true>::Get() returns a<br>
// default-constructed T value. BuiltInDefaultValueGetter<T,<br>
// false>::Get() crashes with an error.<br>
@@ -100,8 +101,8 @@ struct BuiltInDefaultValueGetter<T, false> {<br>
template <typename T><br>
class BuiltInDefaultValue {<br>
public:<br>
-#if GTEST_LANG_CXX11<br>
- // This function returns true iff type T has a built-in default value.<br>
+ // This function returns true if and only if type T has a built-in default<br>
+ // value.<br>
static bool Exists() {<br>
return ::std::is_default_constructible<T>::value;<br>
}<br>
@@ -110,18 +111,6 @@ class BuiltInDefaultValue {<br>
return BuiltInDefaultValueGetter<<br>
T, ::std::is_default_constructible<T>::value>::Get();<br>
}<br>
-<br>
-#else // GTEST_LANG_CXX11<br>
- // This function returns true iff type T has a built-in default value.<br>
- static bool Exists() {<br>
- return false;<br>
- }<br>
-<br>
- static T Get() {<br>
- return BuiltInDefaultValueGetter<T, false>::Get();<br>
- }<br>
-<br>
-#endif // GTEST_LANG_CXX11<br>
};<br>
<br>
// This partial specialization says that we use the same built-in<br>
@@ -139,7 +128,7 @@ template <typename T><br>
class BuiltInDefaultValue<T*> {<br>
public:<br>
static bool Exists() { return true; }<br>
- static T* Get() { return NULL; }<br>
+ static T* Get() { return nullptr; }<br>
};<br>
<br>
// The following specializations define the default values for<br>
@@ -153,9 +142,6 @@ class BuiltInDefaultValue<T*> {<br>
}<br>
<br>
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(void, ); // NOLINT<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::string, "");<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::std::string, "");<br>
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(bool, false);<br>
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned char, '\0');<br>
@@ -222,11 +208,11 @@ class DefaultValue {<br>
// Unsets the default value for type T.<br>
static void Clear() {<br>
delete producer_;<br>
- producer_ = NULL;<br>
+ producer_ = nullptr;<br>
}<br>
<br>
- // Returns true iff the user has set the default value for type T.<br>
- static bool IsSet() { return producer_ != NULL; }<br>
+ // Returns true if and only if the user has set the default value for type T.<br>
+ static bool IsSet() { return producer_ != nullptr; }<br>
<br>
// Returns true if T has a default return value set by the user or there<br>
// exists a built-in default value.<br>
@@ -238,8 +224,8 @@ class DefaultValue {<br>
// otherwise returns the built-in default value. Requires that Exists()<br>
// is true, which ensures that the return value is well-defined.<br>
static T Get() {<br>
- return producer_ == NULL ?<br>
- internal::BuiltInDefaultValue<T>::Get() : producer_->Produce();<br>
+ return producer_ == nullptr ? internal::BuiltInDefaultValue<T>::Get()<br>
+ : producer_->Produce();<br>
}<br>
<br>
private:<br>
@@ -252,7 +238,7 @@ class DefaultValue {<br>
class FixedValueProducer : public ValueProducer {<br>
public:<br>
explicit FixedValueProducer(T value) : value_(value) {}<br>
- virtual T Produce() { return value_; }<br>
+ T Produce() override { return value_; }<br>
<br>
private:<br>
const T value_;<br>
@@ -263,7 +249,7 @@ class DefaultValue {<br>
public:<br>
explicit FactoryValueProducer(FactoryFunction factory)<br>
: factory_(factory) {}<br>
- virtual T Produce() { return factory_(); }<br>
+ T Produce() override { return factory_(); }<br>
<br>
private:<br>
const FactoryFunction factory_;<br>
@@ -284,12 +270,10 @@ class DefaultValue<T&> {<br>
}<br>
<br>
// Unsets the default value for type T&.<br>
- static void Clear() {<br>
- address_ = NULL;<br>
- }<br>
+ static void Clear() { address_ = nullptr; }<br>
<br>
- // Returns true iff the user has set the default value for type T&.<br>
- static bool IsSet() { return address_ != NULL; }<br>
+ // Returns true if and only if the user has set the default value for type T&.<br>
+ static bool IsSet() { return address_ != nullptr; }<br>
<br>
// Returns true if T has a default return value set by the user or there<br>
// exists a built-in default value.<br>
@@ -301,8 +285,8 @@ class DefaultValue<T&> {<br>
// otherwise returns the built-in default value if there is one;<br>
// otherwise aborts the process.<br>
static T& Get() {<br>
- return address_ == NULL ?<br>
- internal::BuiltInDefaultValue<T&>::Get() : *address_;<br>
+ return address_ == nullptr ? internal::BuiltInDefaultValue<T&>::Get()<br>
+ : *address_;<br>
}<br>
<br>
private:<br>
@@ -320,11 +304,11 @@ class DefaultValue<void> {<br>
<br>
// Points to the user-set default value for type T.<br>
template <typename T><br>
-typename DefaultValue<T>::ValueProducer* DefaultValue<T>::producer_ = NULL;<br>
+typename DefaultValue<T>::ValueProducer* DefaultValue<T>::producer_ = nullptr;<br>
<br>
// Points to the user-set default value for type T&.<br>
template <typename T><br>
-T* DefaultValue<T&>::address_ = NULL;<br>
+T* DefaultValue<T&>::address_ = nullptr;<br>
<br>
// Implement this interface to define an action for function type F.<br>
template <typename F><br>
@@ -349,14 +333,25 @@ class ActionInterface {<br>
// An Action<F> is a copyable and IMMUTABLE (except by assignment)<br>
// object that represents an action to be taken when a mock function<br>
// of type F is called. The implementation of Action<T> is just a<br>
-// linked_ptr to const ActionInterface<T>, so copying is fairly cheap.<br>
-// Don't inherit from Action!<br>
-//<br>
+// std::shared_ptr to const ActionInterface<T>. Don't inherit from Action!<br>
// You can view an object implementing ActionInterface<F> as a<br>
// concrete action (including its current state), and an Action<F><br>
// object as a handle to it.<br>
template <typename F><br>
class Action {<br>
+ // Adapter class to allow constructing Action from a legacy ActionInterface.<br>
+ // New code should create Actions from functors instead.<br>
+ struct ActionAdapter {<br>
+ // Adapter must be copyable to satisfy std::function requirements.<br>
+ ::std::shared_ptr<ActionInterface<F>> impl_;<br>
+<br>
+ template <typename... Args><br>
+ typename internal::Function<F>::Result operator()(Args&&... args) {<br>
+ return impl_->Perform(<br>
+ ::std::forward_as_tuple(::std::forward<Args>(args)...));<br>
+ }<br>
+ };<br>
+<br>
public:<br>
typedef typename internal::Function<F>::Result Result;<br>
typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
@@ -365,7 +360,6 @@ class Action {<br>
// STL containers.<br>
Action() {}<br>
<br>
-#if GTEST_LANG_CXX11<br>
// Construct an Action from a specified callable.<br>
// This cannot take std::function directly, because then Action would not be<br>
// directly constructible from lambda (it would require two conversions).<br>
@@ -373,26 +367,19 @@ class Action {<br>
typename = typename ::std::enable_if<<br>
::std::is_constructible<::std::function<F>, G>::value>::type><br>
Action(G&& fun) : fun_(::std::forward<G>(fun)) {} // NOLINT<br>
-#endif<br>
<br>
// Constructs an Action from its implementation.<br>
- explicit Action(ActionInterface<F>* impl) : impl_(impl) {}<br>
+ explicit Action(ActionInterface<F>* impl)<br>
+ : fun_(ActionAdapter{::std::shared_ptr<ActionInterface<F>>(impl)}) {}<br>
<br>
// This constructor allows us to turn an Action<Func> object into an<br>
// Action<F>, as long as F's arguments can be implicitly converted<br>
- // to Func's and Func's return type can be implicitly converted to<br>
- // F's.<br>
+ // to Func's and Func's return type can be implicitly converted to F's.<br>
template <typename Func><br>
- explicit Action(const Action<Func>& action);<br>
-<br>
- // Returns true iff this is the DoDefault() action.<br>
- bool IsDoDefault() const {<br>
-#if GTEST_LANG_CXX11<br>
- return impl_ == nullptr && fun_ == nullptr;<br>
-#else<br>
- return impl_ == NULL;<br>
-#endif<br>
- }<br>
+ explicit Action(const Action<Func>& action) : fun_(action.fun_) {}<br>
+<br>
+ // Returns true if and only if this is the DoDefault() action.<br>
+ bool IsDoDefault() const { return fun_ == nullptr; }<br>
<br>
// Performs the action. Note that this method is const even though<br>
// the corresponding method in ActionInterface is not. The reason<br>
@@ -404,31 +391,15 @@ class Action {<br>
if (IsDoDefault()) {<br>
internal::IllegalDoDefault(__FILE__, __LINE__);<br>
}<br>
-#if GTEST_LANG_CXX11<br>
- if (fun_ != nullptr) {<br>
- return internal::Apply(fun_, ::std::move(args));<br>
- }<br>
-#endif<br>
- return impl_->Perform(args);<br>
+ return internal::Apply(fun_, ::std::move(args));<br>
}<br>
<br>
private:<br>
- template <typename F1, typename F2><br>
- friend class internal::ActionAdaptor;<br>
-<br>
template <typename G><br>
friend class Action;<br>
<br>
- // In C++11, Action can be implemented either as a generic functor (through<br>
- // std::function), or legacy ActionInterface. In C++98, only ActionInterface<br>
- // is available. The invariants are as follows:<br>
- // * in C++98, impl_ is null iff this is the default action<br>
- // * in C++11, at most one of fun_ & impl_ may be nonnull; both are null iff<br>
- // this is the default action<br>
-#if GTEST_LANG_CXX11<br>
+ // fun_ is an empty function if and only if this is the DoDefault() action.<br>
::std::function<F> fun_;<br>
-#endif<br>
- internal::linked_ptr<ActionInterface<F> > impl_;<br>
};<br>
<br>
// The PolymorphicAction class template makes it easy to implement a<br>
@@ -443,7 +414,7 @@ class Action {<br>
// template <typename Result, typename ArgumentTuple><br>
// Result Perform(const ArgumentTuple& args) const {<br>
// // Processes the arguments and returns a result, using<br>
-// // tr1::get<N>(args) to get the N-th (0-based) argument in the tuple.<br>
+// // std::get<N>(args) to get the N-th (0-based) argument in the tuple.<br>
// }<br>
// ...<br>
// };<br>
@@ -471,7 +442,7 @@ class PolymorphicAction {<br>
<br>
explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}<br>
<br>
- virtual Result Perform(const ArgumentTuple& args) {<br>
+ Result Perform(const ArgumentTuple& args) override {<br>
return impl_.template Perform<Result>(args);<br>
}<br>
<br>
@@ -507,31 +478,11 @@ inline PolymorphicAction<Impl> MakePolymorphicAction(const Impl& impl) {<br>
<br>
namespace internal {<br>
<br>
-// Allows an Action<F2> object to pose as an Action<F1>, as long as F2<br>
-// and F1 are compatible.<br>
-template <typename F1, typename F2><br>
-class ActionAdaptor : public ActionInterface<F1> {<br>
- public:<br>
- typedef typename internal::Function<F1>::Result Result;<br>
- typedef typename internal::Function<F1>::ArgumentTuple ArgumentTuple;<br>
-<br>
- explicit ActionAdaptor(const Action<F2>& from) : impl_(from.impl_) {}<br>
-<br>
- virtual Result Perform(const ArgumentTuple& args) {<br>
- return impl_->Perform(args);<br>
- }<br>
-<br>
- private:<br>
- const internal::linked_ptr<ActionInterface<F2> > impl_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(ActionAdaptor);<br>
-};<br>
-<br>
// Helper struct to specialize ReturnAction to execute a move instead of a copy<br>
// on return. Useful for move-only types, but could be used on any type.<br>
template <typename T><br>
struct ByMoveWrapper {<br>
- explicit ByMoveWrapper(T value) : payload(internal::move(value)) {}<br>
+ explicit ByMoveWrapper(T value) : payload(std::move(value)) {}<br>
T payload;<br>
};<br>
<br>
@@ -568,12 +519,12 @@ class ReturnAction {<br>
// Constructs a ReturnAction object from the value to be returned.<br>
// 'value' is passed by value instead of by const reference in order<br>
// to allow Return("string literal") to compile.<br>
- explicit ReturnAction(R value) : value_(new R(internal::move(value))) {}<br>
+ explicit ReturnAction(R value) : value_(new R(std::move(value))) {}<br>
<br>
// This template type conversion operator allows Return(x) to be<br>
// used in ANY function that returns x's type.<br>
template <typename F><br>
- operator Action<F>() const {<br>
+ operator Action<F>() const { // NOLINT<br>
// Assert statement belongs here because this is the best place to verify<br>
// conditions on F. It produces the clearest error messages<br>
// in most compilers.<br>
@@ -584,8 +535,10 @@ class ReturnAction {<br>
// in the Impl class. But both definitions must be the same.<br>
typedef typename Function<F>::Result Result;<br>
GTEST_COMPILE_ASSERT_(<br>
- !is_reference<Result>::value,<br>
+ !std::is_reference<Result>::value,<br>
use_ReturnRef_instead_of_Return_to_return_a_reference);<br>
+ static_assert(!std::is_void<Result>::value,<br>
+ "Can't use Return() on an action expected to return `void`.");<br>
return Action<F>(new Impl<R, F>(value_));<br>
}<br>
<br>
@@ -604,14 +557,14 @@ class ReturnAction {<br>
// Result to call. ImplicitCast_ forces the compiler to convert R to<br>
// Result without considering explicit constructors, thus resolving the<br>
// ambiguity. value_ is then initialized using its copy constructor.<br>
- explicit Impl(const linked_ptr<R>& value)<br>
+ explicit Impl(const std::shared_ptr<R>& value)<br>
: value_before_cast_(*value),<br>
value_(ImplicitCast_<Result>(value_before_cast_)) {}<br>
<br>
- virtual Result Perform(const ArgumentTuple&) { return value_; }<br>
+ Result Perform(const ArgumentTuple&) override { return value_; }<br>
<br>
private:<br>
- GTEST_COMPILE_ASSERT_(!is_reference<Result>::value,<br>
+ GTEST_COMPILE_ASSERT_(!std::is_reference<Result>::value,<br>
Result_cannot_be_a_reference_type);<br>
// We save the value before casting just in case it is being cast to a<br>
// wrapper type.<br>
@@ -629,24 +582,24 @@ class ReturnAction {<br>
typedef typename Function<F>::Result Result;<br>
typedef typename Function<F>::ArgumentTuple ArgumentTuple;<br>
<br>
- explicit Impl(const linked_ptr<R>& wrapper)<br>
+ explicit Impl(const std::shared_ptr<R>& wrapper)<br>
: performed_(false), wrapper_(wrapper) {}<br>
<br>
- virtual Result Perform(const ArgumentTuple&) {<br>
+ Result Perform(const ArgumentTuple&) override {<br>
GTEST_CHECK_(!performed_)<br>
<< "A ByMove() action should only be performed once.";<br>
performed_ = true;<br>
- return internal::move(wrapper_->payload);<br>
+ return std::move(wrapper_->payload);<br>
}<br>
<br>
private:<br>
bool performed_;<br>
- const linked_ptr<R> wrapper_;<br>
+ const std::shared_ptr<R> wrapper_;<br>
<br>
GTEST_DISALLOW_ASSIGN_(Impl);<br>
};<br>
<br>
- const linked_ptr<R> value_;<br>
+ const std::shared_ptr<R> value_;<br>
<br>
GTEST_DISALLOW_ASSIGN_(ReturnAction);<br>
};<br>
@@ -659,13 +612,7 @@ class ReturnNullAction {<br>
// pointer type on compile time.<br>
template <typename Result, typename ArgumentTuple><br>
static Result Perform(const ArgumentTuple&) {<br>
-#if GTEST_LANG_CXX11<br>
return nullptr;<br>
-#else<br>
- GTEST_COMPILE_ASSERT_(internal::is_pointer<Result>::value,<br>
- ReturnNull_can_be_used_to_return_a_pointer_only);<br>
- return NULL;<br>
-#endif // GTEST_LANG_CXX11<br>
}<br>
};<br>
<br>
@@ -675,7 +622,7 @@ class ReturnVoidAction {<br>
// Allows Return() to be used in any void-returning function.<br>
template <typename Result, typename ArgumentTuple><br>
static void Perform(const ArgumentTuple&) {<br>
- CompileAssertTypesEqual<void, Result>();<br>
+ static_assert(std::is_void<Result>::value, "Result should be void.");<br>
}<br>
};<br>
<br>
@@ -696,7 +643,7 @@ class ReturnRefAction {<br>
// Asserts that the function return type is a reference. This<br>
// catches the user error of using ReturnRef(x) when Return(x)<br>
// should be used, and generates some helpful error message.<br>
- GTEST_COMPILE_ASSERT_(internal::is_reference<Result>::value,<br>
+ GTEST_COMPILE_ASSERT_(std::is_reference<Result>::value,<br>
use_Return_instead_of_ReturnRef_to_return_a_value);<br>
return Action<F>(new Impl<F>(ref_));<br>
}<br>
@@ -711,9 +658,7 @@ class ReturnRefAction {<br>
<br>
explicit Impl(T& ref) : ref_(ref) {} // NOLINT<br>
<br>
- virtual Result Perform(const ArgumentTuple&) {<br>
- return ref_;<br>
- }<br>
+ Result Perform(const ArgumentTuple&) override { return ref_; }<br>
<br>
private:<br>
T& ref_;<br>
@@ -745,7 +690,7 @@ class ReturnRefOfCopyAction {<br>
// catches the user error of using ReturnRefOfCopy(x) when Return(x)<br>
// should be used, and generates some helpful error message.<br>
GTEST_COMPILE_ASSERT_(<br>
- internal::is_reference<Result>::value,<br>
+ std::is_reference<Result>::value,<br>
use_Return_instead_of_ReturnRefOfCopy_to_return_a_value);<br>
return Action<F>(new Impl<F>(value_));<br>
}<br>
@@ -760,9 +705,7 @@ class ReturnRefOfCopyAction {<br>
<br>
explicit Impl(const T& value) : value_(value) {} // NOLINT<br>
<br>
- virtual Result Perform(const ArgumentTuple&) {<br>
- return value_;<br>
- }<br>
+ Result Perform(const ArgumentTuple&) override { return value_; }<br>
<br>
private:<br>
T value_;<br>
@@ -829,114 +772,58 @@ class SetErrnoAndReturnAction {<br>
#endif // !GTEST_OS_WINDOWS_MOBILE<br>
<br>
// Implements the SetArgumentPointee<N>(x) action for any function<br>
-// whose N-th argument (0-based) is a pointer to x's type. The<br>
-// template parameter kIsProto is true iff type A is ProtocolMessage,<br>
-// proto2::Message, or a sub-class of those.<br>
-template <size_t N, typename A, bool kIsProto><br>
-class SetArgumentPointeeAction {<br>
- public:<br>
- // Constructs an action that sets the variable pointed to by the<br>
- // N-th function argument to 'value'.<br>
- explicit SetArgumentPointeeAction(const A& value) : value_(value) {}<br>
-<br>
- template <typename Result, typename ArgumentTuple><br>
- void Perform(const ArgumentTuple& args) const {<br>
- CompileAssertTypesEqual<void, Result>();<br>
- *::testing::get<N>(args) = value_;<br>
+// whose N-th argument (0-based) is a pointer to x's type.<br>
+template <size_t N, typename A, typename = void><br>
+struct SetArgumentPointeeAction {<br>
+ A value;<br>
+<br>
+ template <typename... Args><br>
+ void operator()(const Args&... args) const {<br>
+ *::std::get<N>(std::tie(args...)) = value;<br>
}<br>
-<br>
- private:<br>
- const A value_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction);<br>
};<br>
<br>
-template <size_t N, typename Proto><br>
-class SetArgumentPointeeAction<N, Proto, true> {<br>
- public:<br>
- // Constructs an action that sets the variable pointed to by the<br>
- // N-th function argument to 'proto'. Both ProtocolMessage and<br>
- // proto2::Message have the CopyFrom() method, so the same<br>
- // implementation works for both.<br>
- explicit SetArgumentPointeeAction(const Proto& proto) : proto_(new Proto) {<br>
- proto_->CopyFrom(proto);<br>
- }<br>
-<br>
- template <typename Result, typename ArgumentTuple><br>
- void Perform(const ArgumentTuple& args) const {<br>
- CompileAssertTypesEqual<void, Result>();<br>
- ::testing::get<N>(args)->CopyFrom(*proto_);<br>
+// Implements the Invoke(object_ptr, &Class::Method) action.<br>
+template <class Class, typename MethodPtr><br>
+struct InvokeMethodAction {<br>
+ Class* const obj_ptr;<br>
+ const MethodPtr method_ptr;<br>
+<br>
+ template <typename... Args><br>
+ auto operator()(Args&&... args) const<br>
+ -> decltype((obj_ptr->*method_ptr)(std::forward<Args>(args)...)) {<br>
+ return (obj_ptr->*method_ptr)(std::forward<Args>(args)...);<br>
}<br>
-<br>
- private:<br>
- const internal::linked_ptr<Proto> proto_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction);<br>
};<br>
<br>
// Implements the InvokeWithoutArgs(f) action. The template argument<br>
// FunctionImpl is the implementation type of f, which can be either a<br>
// function pointer or a functor. InvokeWithoutArgs(f) can be used as an<br>
-// Action<F> as long as f's type is compatible with F (i.e. f can be<br>
-// assigned to a tr1::function<F>).<br>
+// Action<F> as long as f's type is compatible with F.<br>
template <typename FunctionImpl><br>
-class InvokeWithoutArgsAction {<br>
- public:<br>
- // The c'tor makes a copy of function_impl (either a function<br>
- // pointer or a functor).<br>
- explicit InvokeWithoutArgsAction(FunctionImpl function_impl)<br>
- : function_impl_(function_impl) {}<br>
+struct InvokeWithoutArgsAction {<br>
+ FunctionImpl function_impl;<br>
<br>
// Allows InvokeWithoutArgs(f) to be used as any action whose type is<br>
// compatible with f.<br>
- template <typename Result, typename ArgumentTuple><br>
- Result Perform(const ArgumentTuple&) { return function_impl_(); }<br>
-<br>
- private:<br>
- FunctionImpl function_impl_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(InvokeWithoutArgsAction);<br>
+ template <typename... Args><br>
+ auto operator()(const Args&...) -> decltype(function_impl()) {<br>
+ return function_impl();<br>
+ }<br>
};<br>
<br>
// Implements the InvokeWithoutArgs(object_ptr, &Class::Method) action.<br>
template <class Class, typename MethodPtr><br>
-class InvokeMethodWithoutArgsAction {<br>
- public:<br>
- InvokeMethodWithoutArgsAction(Class* obj_ptr, MethodPtr method_ptr)<br>
- : obj_ptr_(obj_ptr), method_ptr_(method_ptr) {}<br>
-<br>
- template <typename Result, typename ArgumentTuple><br>
- Result Perform(const ArgumentTuple&) const {<br>
- return (obj_ptr_->*method_ptr_)();<br>
- }<br>
+struct InvokeMethodWithoutArgsAction {<br>
+ Class* const obj_ptr;<br>
+ const MethodPtr method_ptr;<br>
<br>
- private:<br>
- Class* const obj_ptr_;<br>
- const MethodPtr method_ptr_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(InvokeMethodWithoutArgsAction);<br>
-};<br>
+ using ReturnType = typename std::result_of<MethodPtr(Class*)>::type;<br>
<br>
-// Implements the InvokeWithoutArgs(callback) action.<br>
-template <typename CallbackType><br>
-class InvokeCallbackWithoutArgsAction {<br>
- public:<br>
- // The c'tor takes ownership of the callback.<br>
- explicit InvokeCallbackWithoutArgsAction(CallbackType* callback)<br>
- : callback_(callback) {<br>
- callback->CheckIsRepeatable(); // Makes sure the callback is permanent.<br>
+ template <typename... Args><br>
+ ReturnType operator()(const Args&...) const {<br>
+ return (obj_ptr->*method_ptr)();<br>
}<br>
-<br>
- // This type conversion operator template allows Invoke(callback) to<br>
- // be used wherever the callback's return type can be implicitly<br>
- // converted to that of the mock function.<br>
- template <typename Result, typename ArgumentTuple><br>
- Result Perform(const ArgumentTuple&) const { return callback_->Run(); }<br>
-<br>
- private:<br>
- const internal::linked_ptr<CallbackType> callback_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(InvokeCallbackWithoutArgsAction);<br>
};<br>
<br>
// Implements the IgnoreResult(action) action.<br>
@@ -958,7 +845,7 @@ class IgnoreResultAction {<br>
typedef typename internal::Function<F>::Result Result;<br>
<br>
// Asserts at compile time that F returns void.<br>
- CompileAssertTypesEqual<void, Result>();<br>
+ static_assert(std::is_void<Result>::value, "Result type should be void.");<br>
<br>
return Action<F>(new Impl<F>(action_));<br>
}<br>
@@ -972,7 +859,7 @@ class IgnoreResultAction {<br>
<br>
explicit Impl(const A& action) : action_(action) {}<br>
<br>
- virtual void Perform(const ArgumentTuple& args) {<br>
+ void Perform(const ArgumentTuple& args) override {<br>
// Performs the action and ignores its result.<br>
action_.Perform(args);<br>
}<br>
@@ -993,76 +880,51 @@ class IgnoreResultAction {<br>
GTEST_DISALLOW_ASSIGN_(IgnoreResultAction);<br>
};<br>
<br>
-// A ReferenceWrapper<T> object represents a reference to type T,<br>
-// which can be either const or not. It can be explicitly converted<br>
-// from, and implicitly converted to, a T&. Unlike a reference,<br>
-// ReferenceWrapper<T> can be copied and can survive template type<br>
-// inference. This is used to support by-reference arguments in the<br>
-// InvokeArgument<N>(...) action. The idea was from "reference<br>
-// wrappers" in tr1, which we don't have in our source tree yet.<br>
-template <typename T><br>
-class ReferenceWrapper {<br>
- public:<br>
- // Constructs a ReferenceWrapper<T> object from a T&.<br>
- explicit ReferenceWrapper(T& l_value) : pointer_(&l_value) {} // NOLINT<br>
-<br>
- // Allows a ReferenceWrapper<T> object to be implicitly converted to<br>
- // a T&.<br>
- operator T&() const { return *pointer_; }<br>
- private:<br>
- T* pointer_;<br>
+template <typename InnerAction, size_t... I><br>
+struct WithArgsAction {<br>
+ InnerAction action;<br>
+<br>
+ // The inner action could be anything convertible to Action<X>.<br>
+ // We use the conversion operator to detect the signature of the inner Action.<br>
+ template <typename R, typename... Args><br>
+ operator Action<R(Args...)>() const { // NOLINT<br>
+ Action<R(typename std::tuple_element<I, std::tuple<Args...>>::type...)><br>
+ converted(action);<br>
+<br>
+ return [converted](Args... args) -> R {<br>
+ return converted.Perform(std::forward_as_tuple(<br>
+ std::get<I>(std::forward_as_tuple(std::forward<Args>(args)...))...));<br>
+ };<br>
+ }<br>
};<br>
<br>
-// Allows the expression ByRef(x) to be printed as a reference to x.<br>
-template <typename T><br>
-void PrintTo(const ReferenceWrapper<T>& ref, ::std::ostream* os) {<br>
- T& value = ref;<br>
- UniversalPrinter<T&>::Print(value, os);<br>
-}<br>
+template <typename... Actions><br>
+struct DoAllAction {<br>
+ private:<br>
+ template <typename... Args, size_t... I><br>
+ std::vector<Action<void(Args...)>> Convert(IndexSequence<I...>) const {<br>
+ return {std::get<I>(actions)...};<br>
+ }<br>
<br>
-// Does two actions sequentially. Used for implementing the DoAll(a1,<br>
-// a2, ...) action.<br>
-template <typename Action1, typename Action2><br>
-class DoBothAction {<br>
public:<br>
- DoBothAction(Action1 action1, Action2 action2)<br>
- : action1_(action1), action2_(action2) {}<br>
-<br>
- // This template type conversion operator allows DoAll(a1, ..., a_n)<br>
- // to be used in ANY function of compatible type.<br>
- template <typename F><br>
- operator Action<F>() const {<br>
- return Action<F>(new Impl<F>(action1_, action2_));<br>
+ std::tuple<Actions...> actions;<br>
+<br>
+ template <typename R, typename... Args><br>
+ operator Action<R(Args...)>() const { // NOLINT<br>
+ struct Op {<br>
+ std::vector<Action<void(Args...)>> converted;<br>
+ Action<R(Args...)> last;<br>
+ R operator()(Args... args) const {<br>
+ auto tuple_args = std::forward_as_tuple(std::forward<Args>(args)...);<br>
+ for (auto& a : converted) {<br>
+ a.Perform(tuple_args);<br>
+ }<br>
+ return last.Perform(tuple_args);<br>
+ }<br>
+ };<br>
+ return Op{Convert<Args...>(MakeIndexSequence<sizeof...(Actions) - 1>()),<br>
+ std::get<sizeof...(Actions) - 1>(actions)};<br>
}<br>
-<br>
- private:<br>
- // Implements the DoAll(...) action for a particular function type F.<br>
- template <typename F><br>
- class Impl : public ActionInterface<F> {<br>
- public:<br>
- typedef typename Function<F>::Result Result;<br>
- typedef typename Function<F>::ArgumentTuple ArgumentTuple;<br>
- typedef typename Function<F>::MakeResultVoid VoidResult;<br>
-<br>
- Impl(const Action<VoidResult>& action1, const Action<F>& action2)<br>
- : action1_(action1), action2_(action2) {}<br>
-<br>
- virtual Result Perform(const ArgumentTuple& args) {<br>
- action1_.Perform(args);<br>
- return action2_.Perform(args);<br>
- }<br>
-<br>
- private:<br>
- const Action<VoidResult> action1_;<br>
- const Action<F> action2_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(Impl);<br>
- };<br>
-<br>
- Action1 action1_;<br>
- Action2 action2_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(DoBothAction);<br>
};<br>
<br>
} // namespace internal<br>
@@ -1099,19 +961,43 @@ class DoBothAction {<br>
// EXPECT_CALL(mock, Bar(5, _, _)).WillOnce(Invoke(DistanceToOrigin));<br>
typedef internal::IgnoredValue Unused;<br>
<br>
-// This constructor allows us to turn an Action<From> object into an<br>
-// Action<To>, as long as To's arguments can be implicitly converted<br>
-// to From's and From's return type cann be implicitly converted to<br>
-// To's.<br>
-template <typename To><br>
-template <typename From><br>
-Action<To>::Action(const Action<From>& from)<br>
- :<br>
-#if GTEST_LANG_CXX11<br>
- fun_(from.fun_),<br>
-#endif<br>
- impl_(from.impl_ == NULL ? NULL<br>
- : new internal::ActionAdaptor<To, From>(from)) {<br>
+// Creates an action that does actions a1, a2, ..., sequentially in<br>
+// each invocation.<br>
+template <typename... Action><br>
+internal::DoAllAction<typename std::decay<Action>::type...> DoAll(<br>
+ Action&&... action) {<br>
+ return {std::forward_as_tuple(std::forward<Action>(action)...)};<br>
+}<br>
+<br>
+// WithArg<k>(an_action) creates an action that passes the k-th<br>
+// (0-based) argument of the mock function to an_action and performs<br>
+// it. It adapts an action accepting one argument to one that accepts<br>
+// multiple arguments. For convenience, we also provide<br>
+// WithArgs<k>(an_action) (defined below) as a synonym.<br>
+template <size_t k, typename InnerAction><br>
+internal::WithArgsAction<typename std::decay<InnerAction>::type, k><br>
+WithArg(InnerAction&& action) {<br>
+ return {std::forward<InnerAction>(action)};<br>
+}<br>
+<br>
+// WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes<br>
+// the selected arguments of the mock function to an_action and<br>
+// performs it. It serves as an adaptor between actions with<br>
+// <br>
diff erent argument lists.<br>
+template <size_t k, size_t... ks, typename InnerAction><br>
+internal::WithArgsAction<typename std::decay<InnerAction>::type, k, ks...><br>
+WithArgs(InnerAction&& action) {<br>
+ return {std::forward<InnerAction>(action)};<br>
+}<br>
+<br>
+// WithoutArgs(inner_action) can be used in a mock function with a<br>
+// non-empty argument list to perform inner_action, which takes no<br>
+// argument. In other words, it adapts an action accepting no<br>
+// argument to one that accepts (and ignores) arguments.<br>
+template <typename InnerAction><br>
+internal::WithArgsAction<typename std::decay<InnerAction>::type><br>
+WithoutArgs(InnerAction&& action) {<br>
+ return {std::forward<InnerAction>(action)};<br>
}<br>
<br>
// Creates an action that returns 'value'. 'value' is passed by value<br>
@@ -1119,7 +1005,7 @@ Action<To>::Action(const Action<From>& from)<br>
// will trigger a compiler error about using array as initializer.<br>
template <typename R><br>
internal::ReturnAction<R> Return(R value) {<br>
- return internal::ReturnAction<R>(internal::move(value));<br>
+ return internal::ReturnAction<R>(std::move(value));<br>
}<br>
<br>
// Creates an action that returns NULL.<br>
@@ -1152,7 +1038,7 @@ inline internal::ReturnRefOfCopyAction<R> ReturnRefOfCopy(const R& x) {<br>
// invariant.<br>
template <typename R><br>
internal::ByMoveWrapper<R> ByMove(R x) {<br>
- return internal::ByMoveWrapper<R>(internal::move(x));<br>
+ return internal::ByMoveWrapper<R>(std::move(x));<br>
}<br>
<br>
// Creates an action that does the default action for the give mock function.<br>
@@ -1163,43 +1049,14 @@ inline internal::DoDefaultAction DoDefault() {<br>
// Creates an action that sets the variable pointed by the N-th<br>
// (0-based) function argument to 'value'.<br>
template <size_t N, typename T><br>
-PolymorphicAction<<br>
- internal::SetArgumentPointeeAction<<br>
- N, T, internal::IsAProtocolMessage<T>::value> ><br>
-SetArgPointee(const T& x) {<br>
- return MakePolymorphicAction(internal::SetArgumentPointeeAction<<br>
- N, T, internal::IsAProtocolMessage<T>::value>(x));<br>
-}<br>
-<br>
-#if !((GTEST_GCC_VER_ && GTEST_GCC_VER_ < 40000) || GTEST_OS_SYMBIAN)<br>
-// This overload allows SetArgPointee() to accept a string literal.<br>
-// GCC prior to the version 4.0 and Symbian C++ compiler cannot distinguish<br>
-// this overload from the templated version and emit a compile error.<br>
-template <size_t N><br>
-PolymorphicAction<<br>
- internal::SetArgumentPointeeAction<N, const char*, false> ><br>
-SetArgPointee(const char* p) {<br>
- return MakePolymorphicAction(internal::SetArgumentPointeeAction<<br>
- N, const char*, false>(p));<br>
+internal::SetArgumentPointeeAction<N, T> SetArgPointee(T x) {<br>
+ return {std::move(x)};<br>
}<br>
<br>
-template <size_t N><br>
-PolymorphicAction<<br>
- internal::SetArgumentPointeeAction<N, const wchar_t*, false> ><br>
-SetArgPointee(const wchar_t* p) {<br>
- return MakePolymorphicAction(internal::SetArgumentPointeeAction<<br>
- N, const wchar_t*, false>(p));<br>
-}<br>
-#endif<br>
-<br>
// The following version is DEPRECATED.<br>
template <size_t N, typename T><br>
-PolymorphicAction<<br>
- internal::SetArgumentPointeeAction<<br>
- N, T, internal::IsAProtocolMessage<T>::value> ><br>
-SetArgumentPointee(const T& x) {<br>
- return MakePolymorphicAction(internal::SetArgumentPointeeAction<<br>
- N, T, internal::IsAProtocolMessage<T>::value>(x));<br>
+internal::SetArgumentPointeeAction<N, T> SetArgumentPointee(T x) {<br>
+ return {std::move(x)};<br>
}<br>
<br>
// Creates an action that sets a pointer referent to a given value.<br>
@@ -1220,24 +1077,38 @@ SetErrnoAndReturn(int errval, T result) {<br>
<br>
#endif // !GTEST_OS_WINDOWS_MOBILE<br>
<br>
-// Various overloads for InvokeWithoutArgs().<br>
+// Various overloads for Invoke().<br>
+<br>
+// Legacy function.<br>
+// Actions can now be implicitly constructed from callables. No need to create<br>
+// wrapper objects.<br>
+// This function exists for backwards compatibility.<br>
+template <typename FunctionImpl><br>
+typename std::decay<FunctionImpl>::type Invoke(FunctionImpl&& function_impl) {<br>
+ return std::forward<FunctionImpl>(function_impl);<br>
+}<br>
+<br>
+// Creates an action that invokes the given method on the given object<br>
+// with the mock function's arguments.<br>
+template <class Class, typename MethodPtr><br>
+internal::InvokeMethodAction<Class, MethodPtr> Invoke(Class* obj_ptr,<br>
+ MethodPtr method_ptr) {<br>
+ return {obj_ptr, method_ptr};<br>
+}<br>
<br>
// Creates an action that invokes 'function_impl' with no argument.<br>
template <typename FunctionImpl><br>
-PolymorphicAction<internal::InvokeWithoutArgsAction<FunctionImpl> ><br>
+internal::InvokeWithoutArgsAction<typename std::decay<FunctionImpl>::type><br>
InvokeWithoutArgs(FunctionImpl function_impl) {<br>
- return MakePolymorphicAction(<br>
- internal::InvokeWithoutArgsAction<FunctionImpl>(function_impl));<br>
+ return {std::move(function_impl)};<br>
}<br>
<br>
// Creates an action that invokes the given method on the given object<br>
// with no argument.<br>
template <class Class, typename MethodPtr><br>
-PolymorphicAction<internal::InvokeMethodWithoutArgsAction<Class, MethodPtr> ><br>
-InvokeWithoutArgs(Class* obj_ptr, MethodPtr method_ptr) {<br>
- return MakePolymorphicAction(<br>
- internal::InvokeMethodWithoutArgsAction<Class, MethodPtr>(<br>
- obj_ptr, method_ptr));<br>
+internal::InvokeMethodWithoutArgsAction<Class, MethodPtr> InvokeWithoutArgs(<br>
+ Class* obj_ptr, MethodPtr method_ptr) {<br>
+ return {obj_ptr, method_ptr};<br>
}<br>
<br>
// Creates an action that performs an_action and throws away its<br>
@@ -1255,11 +1126,19 @@ inline internal::IgnoreResultAction<A> IgnoreResult(const A& an_action) {<br>
// where Base is a base class of Derived, just write:<br>
//<br>
// ByRef<const Base>(derived)<br>
+//<br>
+// N.B. ByRef is redundant with std::ref, std::cref and std::reference_wrapper.<br>
+// However, it may still be used for consistency with ByMove().<br>
template <typename T><br>
-inline internal::ReferenceWrapper<T> ByRef(T& l_value) { // NOLINT<br>
- return internal::ReferenceWrapper<T>(l_value);<br>
+inline ::std::reference_wrapper<T> ByRef(T& l_value) { // NOLINT<br>
+ return ::std::reference_wrapper<T>(l_value);<br>
}<br>
<br>
} // namespace testing<br>
<br>
+#ifdef _MSC_VER<br>
+# pragma warning(pop)<br>
+#endif<br>
+<br>
+<br>
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-cardinalities.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-cardinalities.h<br>
index dafbcbce669d5..05b66d4fffdc8 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-cardinalities.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-cardinalities.h<br>
@@ -42,6 +42,7 @@<br>
#define GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_<br>
<br>
#include <limits.h><br>
+#include <memory><br>
#include <ostream> // NOLINT<br>
#include "gmock/internal/gmock-port.h"<br>
#include "gtest/gtest.h"<br>
@@ -71,10 +72,12 @@ class CardinalityInterface {<br>
virtual int ConservativeLowerBound() const { return 0; }<br>
virtual int ConservativeUpperBound() const { return INT_MAX; }<br>
<br>
- // Returns true iff call_count calls will satisfy this cardinality.<br>
+ // Returns true if and only if call_count calls will satisfy this<br>
+ // cardinality.<br>
virtual bool IsSatisfiedByCallCount(int call_count) const = 0;<br>
<br>
- // Returns true iff call_count calls will saturate this cardinality.<br>
+ // Returns true if and only if call_count calls will saturate this<br>
+ // cardinality.<br>
virtual bool IsSaturatedByCallCount(int call_count) const = 0;<br>
<br>
// Describes self to an ostream.<br>
@@ -83,9 +86,8 @@ class CardinalityInterface {<br>
<br>
// A Cardinality is a copyable and IMMUTABLE (except by assignment)<br>
// object that specifies how many times a mock function is expected to<br>
-// be called. The implementation of Cardinality is just a linked_ptr<br>
-// to const CardinalityInterface, so copying is fairly cheap.<br>
-// Don't inherit from Cardinality!<br>
+// be called. The implementation of Cardinality is just a std::shared_ptr<br>
+// to const CardinalityInterface. Don't inherit from Cardinality!<br>
class GTEST_API_ Cardinality {<br>
public:<br>
// Constructs a null cardinality. Needed for storing Cardinality<br>
@@ -100,17 +102,19 @@ class GTEST_API_ Cardinality {<br>
int ConservativeLowerBound() const { return impl_->ConservativeLowerBound(); }<br>
int ConservativeUpperBound() const { return impl_->ConservativeUpperBound(); }<br>
<br>
- // Returns true iff call_count calls will satisfy this cardinality.<br>
+ // Returns true if and only if call_count calls will satisfy this<br>
+ // cardinality.<br>
bool IsSatisfiedByCallCount(int call_count) const {<br>
return impl_->IsSatisfiedByCallCount(call_count);<br>
}<br>
<br>
- // Returns true iff call_count calls will saturate this cardinality.<br>
+ // Returns true if and only if call_count calls will saturate this<br>
+ // cardinality.<br>
bool IsSaturatedByCallCount(int call_count) const {<br>
return impl_->IsSaturatedByCallCount(call_count);<br>
}<br>
<br>
- // Returns true iff call_count calls will over-saturate this<br>
+ // Returns true if and only if call_count calls will over-saturate this<br>
// cardinality, i.e. exceed the maximum number of allowed calls.<br>
bool IsOverSaturatedByCallCount(int call_count) const {<br>
return impl_->IsSaturatedByCallCount(call_count) &&<br>
@@ -125,7 +129,7 @@ class GTEST_API_ Cardinality {<br>
::std::ostream* os);<br>
<br>
private:<br>
- internal::linked_ptr<const CardinalityInterface> impl_;<br>
+ std::shared_ptr<const CardinalityInterface> impl_;<br>
};<br>
<br>
// Creates a cardinality that allows at least n calls.<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-function-mocker.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-function-mocker.h<br>
new file mode 100644<br>
index 0000000000000..cc1535c806bf4<br>
--- /dev/null<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-function-mocker.h<br>
@@ -0,0 +1,253 @@<br>
+// Copyright 2007, Google Inc.<br>
+// All rights reserved.<br>
+//<br>
+// Redistribution and use in source and binary forms, with or without<br>
+// modification, are permitted provided that the following conditions are<br>
+// met:<br>
+//<br>
+// * Redistributions of source code must retain the above copyright<br>
+// notice, this list of conditions and the following disclaimer.<br>
+// * Redistributions in binary form must reproduce the above<br>
+// copyright notice, this list of conditions and the following disclaimer<br>
+// in the documentation and/or other materials provided with the<br>
+// distribution.<br>
+// * Neither the name of Google Inc. nor the names of its<br>
+// contributors may be used to endorse or promote products derived from<br>
+// this software without specific prior written permission.<br>
+//<br>
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
+<br>
+// Google Mock - a framework for writing C++ mock classes.<br>
+//<br>
+// This file implements MOCK_METHOD.<br>
+<br>
+// GOOGLETEST_CM0002 DO NOT DELETE<br>
+<br>
+#ifndef THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_ // NOLINT<br>
+#define THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_ // NOLINT<br>
+<br>
+#include "gmock/gmock-generated-function-mockers.h" // NOLINT<br>
+#include "gmock/internal/gmock-pp.h"<br>
+<br>
+#define MOCK_METHOD(...) \<br>
+ GMOCK_PP_VARIADIC_CALL(GMOCK_INTERNAL_MOCK_METHOD_ARG_, __VA_ARGS__)<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_ARG_1(...) \<br>
+ GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_ARG_2(...) \<br>
+ GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_ARG_3(_Ret, _MethodName, _Args) \<br>
+ GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, ())<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, _Spec) \<br>
+ GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Args); \<br>
+ GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Spec); \<br>
+ GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \<br>
+ GMOCK_PP_NARG0 _Args, GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)); \<br>
+ GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \<br>
+ GMOCK_INTERNAL_MOCK_METHOD_IMPL( \<br>
+ GMOCK_PP_NARG0 _Args, _MethodName, GMOCK_INTERNAL_HAS_CONST(_Spec), \<br>
+ GMOCK_INTERNAL_HAS_OVERRIDE(_Spec), GMOCK_INTERNAL_HAS_FINAL(_Spec), \<br>
+ GMOCK_INTERNAL_HAS_NOEXCEPT(_Spec), GMOCK_INTERNAL_GET_CALLTYPE(_Spec), \<br>
+ (GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)))<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_ARG_5(...) \<br>
+ GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_ARG_6(...) \<br>
+ GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_ARG_7(...) \<br>
+ GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)<br>
+<br>
+#define GMOCK_INTERNAL_WRONG_ARITY(...) \<br>
+ static_assert( \<br>
+ false, \<br>
+ "MOCK_METHOD must be called with 3 or 4 arguments. _Ret, " \<br>
+ "_MethodName, _Args and optionally _Spec. _Args and _Spec must be " \<br>
+ "enclosed in parentheses. If _Ret is a type with unprotected commas, " \<br>
+ "it must also be enclosed in parentheses.")<br>
+<br>
+#define GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Tuple) \<br>
+ static_assert( \<br>
+ GMOCK_PP_IS_ENCLOSED_PARENS(_Tuple), \<br>
+ GMOCK_PP_STRINGIZE(_Tuple) " should be enclosed in parentheses.")<br>
+<br>
+#define GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE(_N, ...) \<br>
+ static_assert( \<br>
+ std::is_function<__VA_ARGS__>::value, \<br>
+ "Signature must be a function type, maybe return type contains " \<br>
+ "unprotected comma."); \<br>
+ static_assert( \<br>
+ ::testing::tuple_size<typename ::testing::internal::Function< \<br>
+ __VA_ARGS__>::ArgumentTuple>::value == _N, \<br>
+ "This method does not take " GMOCK_PP_STRINGIZE( \<br>
+ _N) " arguments. Parenthesize all types with unproctected commas.")<br>
+<br>
+#define GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \<br>
+ GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT, ~, _Spec)<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_IMPL(_N, _MethodName, _Constness, \<br>
+ _Override, _Final, _Noexcept, \<br>
+ _CallType, _Signature) \<br>
+ typename ::testing::internal::Function<GMOCK_PP_REMOVE_PARENS( \<br>
+ _Signature)>::Result \<br>
+ GMOCK_INTERNAL_EXPAND(_CallType) \<br>
+ _MethodName(GMOCK_PP_REPEAT(GMOCK_INTERNAL_PARAMETER, _Signature, _N)) \<br>
+ GMOCK_PP_IF(_Constness, const, ) GMOCK_PP_IF(_Noexcept, noexcept, ) \<br>
+ GMOCK_PP_IF(_Override, override, ) \<br>
+ GMOCK_PP_IF(_Final, final, ) { \<br>
+ GMOCK_MOCKER_(_N, _Constness, _MethodName) \<br>
+ .SetOwnerAndName(this, #_MethodName); \<br>
+ return GMOCK_MOCKER_(_N, _Constness, _MethodName) \<br>
+ .Invoke(GMOCK_PP_REPEAT(GMOCK_INTERNAL_FORWARD_ARG, _Signature, _N)); \<br>
+ } \<br>
+ ::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> gmock_##_MethodName( \<br>
+ GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_PARAMETER, _Signature, _N)) \<br>
+ GMOCK_PP_IF(_Constness, const, ) { \<br>
+ GMOCK_MOCKER_(_N, _Constness, _MethodName).RegisterOwner(this); \<br>
+ return GMOCK_MOCKER_(_N, _Constness, _MethodName) \<br>
+ .With(GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_ARGUMENT, , _N)); \<br>
+ } \<br>
+ ::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> gmock_##_MethodName( \<br>
+ const ::testing::internal::WithoutMatchers&, \<br>
+ GMOCK_PP_IF(_Constness, const, )::testing::internal::Function< \<br>
+ GMOCK_PP_REMOVE_PARENS(_Signature)>*) \<br>
+ const GMOCK_PP_IF(_Noexcept, noexcept, ) { \<br>
+ return GMOCK_PP_CAT(::testing::internal::AdjustConstness_, \<br>
+ GMOCK_PP_IF(_Constness, const, ))(this) \<br>
+ ->gmock_##_MethodName(GMOCK_PP_REPEAT( \<br>
+ GMOCK_INTERNAL_A_MATCHER_ARGUMENT, _Signature, _N)); \<br>
+ } \<br>
+ mutable ::testing::FunctionMocker<GMOCK_PP_REMOVE_PARENS(_Signature)> \<br>
+ GMOCK_MOCKER_(_N, _Constness, _MethodName)<br>
+<br>
+#define GMOCK_INTERNAL_EXPAND(...) __VA_ARGS__<br>
+<br>
+// Five Valid modifiers.<br>
+#define GMOCK_INTERNAL_HAS_CONST(_Tuple) \<br>
+ GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_CONST, ~, _Tuple))<br>
+<br>
+#define GMOCK_INTERNAL_HAS_OVERRIDE(_Tuple) \<br>
+ GMOCK_PP_HAS_COMMA( \<br>
+ GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_OVERRIDE, ~, _Tuple))<br>
+<br>
+#define GMOCK_INTERNAL_HAS_FINAL(_Tuple) \<br>
+ GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_FINAL, ~, _Tuple))<br>
+<br>
+#define GMOCK_INTERNAL_HAS_NOEXCEPT(_Tuple) \<br>
+ GMOCK_PP_HAS_COMMA( \<br>
+ GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_NOEXCEPT, ~, _Tuple))<br>
+<br>
+#define GMOCK_INTERNAL_GET_CALLTYPE(_Tuple) \<br>
+ GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GET_CALLTYPE_IMPL, ~, _Tuple)<br>
+<br>
+#define GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT(_i, _, _elem) \<br>
+ static_assert( \<br>
+ (GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem)) + \<br>
+ GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem)) + \<br>
+ GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem)) + \<br>
+ GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem)) + \<br>
+ GMOCK_INTERNAL_IS_CALLTYPE(_elem)) == 1, \<br>
+ GMOCK_PP_STRINGIZE( \<br>
+ _elem) " cannot be recognized as a valid specification modifier.");<br>
+<br>
+// Modifiers implementation.<br>
+#define GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem) \<br>
+ GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_CONST_I_, _elem)<br>
+<br>
+#define GMOCK_INTERNAL_DETECT_CONST_I_const ,<br>
+<br>
+#define GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem) \<br>
+ GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_OVERRIDE_I_, _elem)<br>
+<br>
+#define GMOCK_INTERNAL_DETECT_OVERRIDE_I_override ,<br>
+<br>
+#define GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem) \<br>
+ GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_FINAL_I_, _elem)<br>
+<br>
+#define GMOCK_INTERNAL_DETECT_FINAL_I_final ,<br>
+<br>
+// TODO(iserna): Maybe noexcept should accept an argument here as well.<br>
+#define GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem) \<br>
+ GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_NOEXCEPT_I_, _elem)<br>
+<br>
+#define GMOCK_INTERNAL_DETECT_NOEXCEPT_I_noexcept ,<br>
+<br>
+#define GMOCK_INTERNAL_GET_CALLTYPE_IMPL(_i, _, _elem) \<br>
+ GMOCK_PP_IF(GMOCK_INTERNAL_IS_CALLTYPE(_elem), \<br>
+ GMOCK_INTERNAL_GET_VALUE_CALLTYPE, GMOCK_PP_EMPTY) \<br>
+ (_elem)<br>
+<br>
+// TODO(iserna): GMOCK_INTERNAL_IS_CALLTYPE and<br>
+// GMOCK_INTERNAL_GET_VALUE_CALLTYPE needed more expansions to work on windows<br>
+// maybe they can be simplified somehow.<br>
+#define GMOCK_INTERNAL_IS_CALLTYPE(_arg) \<br>
+ GMOCK_INTERNAL_IS_CALLTYPE_I( \<br>
+ GMOCK_PP_CAT(GMOCK_INTERNAL_IS_CALLTYPE_HELPER_, _arg))<br>
+#define GMOCK_INTERNAL_IS_CALLTYPE_I(_arg) GMOCK_PP_IS_ENCLOSED_PARENS(_arg)<br>
+<br>
+#define GMOCK_INTERNAL_GET_VALUE_CALLTYPE(_arg) \<br>
+ GMOCK_INTERNAL_GET_VALUE_CALLTYPE_I( \<br>
+ GMOCK_PP_CAT(GMOCK_INTERNAL_IS_CALLTYPE_HELPER_, _arg))<br>
+#define GMOCK_INTERNAL_GET_VALUE_CALLTYPE_I(_arg) \<br>
+ GMOCK_PP_CAT(GMOCK_PP_IDENTITY, _arg)<br>
+<br>
+#define GMOCK_INTERNAL_IS_CALLTYPE_HELPER_Calltype<br>
+<br>
+#define GMOCK_INTERNAL_SIGNATURE(_Ret, _Args) \<br>
+ GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(_Ret), GMOCK_PP_REMOVE_PARENS, \<br>
+ GMOCK_PP_IDENTITY) \<br>
+ (_Ret)(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GET_TYPE, _, _Args))<br>
+<br>
+#define GMOCK_INTERNAL_GET_TYPE(_i, _, _elem) \<br>
+ GMOCK_PP_COMMA_IF(_i) \<br>
+ GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(_elem), GMOCK_PP_REMOVE_PARENS, \<br>
+ GMOCK_PP_IDENTITY) \<br>
+ (_elem)<br>
+<br>
+#define GMOCK_INTERNAL_PARAMETER(_i, _Signature, _) \<br>
+ GMOCK_PP_COMMA_IF(_i) \<br>
+ GMOCK_INTERNAL_ARG_O(typename, GMOCK_PP_INC(_i), \<br>
+ GMOCK_PP_REMOVE_PARENS(_Signature)) \<br>
+ gmock_a##_i<br>
+<br>
+#define GMOCK_INTERNAL_FORWARD_ARG(_i, _Signature, _) \<br>
+ GMOCK_PP_COMMA_IF(_i) \<br>
+ ::std::forward<GMOCK_INTERNAL_ARG_O(typename, GMOCK_PP_INC(_i), \<br>
+ GMOCK_PP_REMOVE_PARENS(_Signature))>( \<br>
+ gmock_a##_i)<br>
+<br>
+#define GMOCK_INTERNAL_MATCHER_PARAMETER(_i, _Signature, _) \<br>
+ GMOCK_PP_COMMA_IF(_i) \<br>
+ GMOCK_INTERNAL_MATCHER_O(typename, GMOCK_PP_INC(_i), \<br>
+ GMOCK_PP_REMOVE_PARENS(_Signature)) \<br>
+ gmock_a##_i<br>
+<br>
+#define GMOCK_INTERNAL_MATCHER_ARGUMENT(_i, _1, _2) \<br>
+ GMOCK_PP_COMMA_IF(_i) \<br>
+ gmock_a##_i<br>
+<br>
+#define GMOCK_INTERNAL_A_MATCHER_ARGUMENT(_i, _Signature, _) \<br>
+ GMOCK_PP_COMMA_IF(_i) \<br>
+ ::testing::A<GMOCK_INTERNAL_ARG_O(typename, GMOCK_PP_INC(_i), \<br>
+ GMOCK_PP_REMOVE_PARENS(_Signature))>()<br>
+<br>
+#define GMOCK_INTERNAL_ARG_O(_tn, _i, ...) GMOCK_ARG_(_tn, _i, __VA_ARGS__)<br>
+<br>
+#define GMOCK_INTERNAL_MATCHER_O(_tn, _i, ...) \<br>
+ GMOCK_MATCHER_(_tn, _i, __VA_ARGS__)<br>
+<br>
+#endif // THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-actions.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-actions.h<br>
index 8b47568b24529..9b5b78b165b61 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-actions.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-actions.h<br>
@@ -38,537 +38,20 @@<br>
<br>
// GOOGLETEST_CM0002 DO NOT DELETE<br>
<br>
-// IWYU pragma: private, include "gmock/gmock.h<br>
+// IWYU pragma: private, include "gmock/gmock.h"<br>
<br>
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_<br>
#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_<br>
<br>
+#include <memory><br>
+#include <utility><br>
+<br>
#include "gmock/gmock-actions.h"<br>
#include "gmock/internal/gmock-port.h"<br>
<br>
namespace testing {<br>
namespace internal {<br>
<br>
-// InvokeHelper<F> knows how to unpack an N-tuple and invoke an N-ary<br>
-// function, method, or callback with the unpacked values, where F is<br>
-// a function type that takes N arguments.<br>
-template <typename Result, typename ArgumentTuple><br>
-class InvokeHelper;<br>
-<br>
-template <typename R><br>
-class InvokeHelper<R, ::testing::tuple<> > {<br>
- public:<br>
- template <typename Function><br>
- static R Invoke(Function function, const ::testing::tuple<>&) {<br>
- return function();<br>
- }<br>
-<br>
- template <class Class, typename MethodPtr><br>
- static R InvokeMethod(Class* obj_ptr,<br>
- MethodPtr method_ptr,<br>
- const ::testing::tuple<>&) {<br>
- return (obj_ptr->*method_ptr)();<br>
- }<br>
-<br>
- template <typename CallbackType><br>
- static R InvokeCallback(CallbackType* callback,<br>
- const ::testing::tuple<>&) {<br>
- return callback->Run();<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1><br>
-class InvokeHelper<R, ::testing::tuple<A1> > {<br>
- public:<br>
- template <typename Function><br>
- static R Invoke(Function function, const ::testing::tuple<A1>& args) {<br>
- return function(get<0>(args));<br>
- }<br>
-<br>
- template <class Class, typename MethodPtr><br>
- static R InvokeMethod(Class* obj_ptr,<br>
- MethodPtr method_ptr,<br>
- const ::testing::tuple<A1>& args) {<br>
- return (obj_ptr->*method_ptr)(get<0>(args));<br>
- }<br>
-<br>
- template <typename CallbackType><br>
- static R InvokeCallback(CallbackType* callback,<br>
- const ::testing::tuple<A1>& args) {<br>
- return callback->Run(get<0>(args));<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2> > {<br>
- public:<br>
- template <typename Function><br>
- static R Invoke(Function function, const ::testing::tuple<A1, A2>& args) {<br>
- return function(get<0>(args), get<1>(args));<br>
- }<br>
-<br>
- template <class Class, typename MethodPtr><br>
- static R InvokeMethod(Class* obj_ptr,<br>
- MethodPtr method_ptr,<br>
- const ::testing::tuple<A1, A2>& args) {<br>
- return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args));<br>
- }<br>
-<br>
- template <typename CallbackType><br>
- static R InvokeCallback(CallbackType* callback,<br>
- const ::testing::tuple<A1, A2>& args) {<br>
- return callback->Run(get<0>(args), get<1>(args));<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3> > {<br>
- public:<br>
- template <typename Function><br>
- static R Invoke(Function function, const ::testing::tuple<A1, A2, A3>& args) {<br>
- return function(get<0>(args), get<1>(args), get<2>(args));<br>
- }<br>
-<br>
- template <class Class, typename MethodPtr><br>
- static R InvokeMethod(Class* obj_ptr,<br>
- MethodPtr method_ptr,<br>
- const ::testing::tuple<A1, A2, A3>& args) {<br>
- return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
- get<2>(args));<br>
- }<br>
-<br>
- template <typename CallbackType><br>
- static R InvokeCallback(CallbackType* callback,<br>
- const ::testing::tuple<A1, A2, A3>& args) {<br>
- return callback->Run(get<0>(args), get<1>(args), get<2>(args));<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4> > {<br>
- public:<br>
- template <typename Function><br>
- static R Invoke(Function function, const ::testing::tuple<A1, A2, A3,<br>
- A4>& args) {<br>
- return function(get<0>(args), get<1>(args), get<2>(args),<br>
- get<3>(args));<br>
- }<br>
-<br>
- template <class Class, typename MethodPtr><br>
- static R InvokeMethod(Class* obj_ptr,<br>
- MethodPtr method_ptr,<br>
- const ::testing::tuple<A1, A2, A3, A4>& args) {<br>
- return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
- get<2>(args), get<3>(args));<br>
- }<br>
-<br>
- template <typename CallbackType><br>
- static R InvokeCallback(CallbackType* callback,<br>
- const ::testing::tuple<A1, A2, A3, A4>& args) {<br>
- return callback->Run(get<0>(args), get<1>(args), get<2>(args),<br>
- get<3>(args));<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5> > {<br>
- public:<br>
- template <typename Function><br>
- static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4,<br>
- A5>& args) {<br>
- return function(get<0>(args), get<1>(args), get<2>(args),<br>
- get<3>(args), get<4>(args));<br>
- }<br>
-<br>
- template <class Class, typename MethodPtr><br>
- static R InvokeMethod(Class* obj_ptr,<br>
- MethodPtr method_ptr,<br>
- const ::testing::tuple<A1, A2, A3, A4, A5>& args) {<br>
- return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
- get<2>(args), get<3>(args), get<4>(args));<br>
- }<br>
-<br>
- template <typename CallbackType><br>
- static R InvokeCallback(CallbackType* callback,<br>
- const ::testing::tuple<A1, A2, A3, A4, A5>& args) {<br>
- return callback->Run(get<0>(args), get<1>(args), get<2>(args),<br>
- get<3>(args), get<4>(args));<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5, typename A6><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6> > {<br>
- public:<br>
- template <typename Function><br>
- static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,<br>
- A6>& args) {<br>
- return function(get<0>(args), get<1>(args), get<2>(args),<br>
- get<3>(args), get<4>(args), get<5>(args));<br>
- }<br>
-<br>
- template <class Class, typename MethodPtr><br>
- static R InvokeMethod(Class* obj_ptr,<br>
- MethodPtr method_ptr,<br>
- const ::testing::tuple<A1, A2, A3, A4, A5, A6>& args) {<br>
- return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
- get<2>(args), get<3>(args), get<4>(args), get<5>(args));<br>
- }<br>
-<br>
- // There is no InvokeCallback() for 6-tuples<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5, typename A6, typename A7><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> > {<br>
- public:<br>
- template <typename Function><br>
- static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,<br>
- A6, A7>& args) {<br>
- return function(get<0>(args), get<1>(args), get<2>(args),<br>
- get<3>(args), get<4>(args), get<5>(args), get<6>(args));<br>
- }<br>
-<br>
- template <class Class, typename MethodPtr><br>
- static R InvokeMethod(Class* obj_ptr,<br>
- MethodPtr method_ptr,<br>
- const ::testing::tuple<A1, A2, A3, A4, A5, A6,<br>
- A7>& args) {<br>
- return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
- get<2>(args), get<3>(args), get<4>(args), get<5>(args),<br>
- get<6>(args));<br>
- }<br>
-<br>
- // There is no InvokeCallback() for 7-tuples<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5, typename A6, typename A7, typename A8><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > {<br>
- public:<br>
- template <typename Function><br>
- static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,<br>
- A6, A7, A8>& args) {<br>
- return function(get<0>(args), get<1>(args), get<2>(args),<br>
- get<3>(args), get<4>(args), get<5>(args), get<6>(args),<br>
- get<7>(args));<br>
- }<br>
-<br>
- template <class Class, typename MethodPtr><br>
- static R InvokeMethod(Class* obj_ptr,<br>
- MethodPtr method_ptr,<br>
- const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7,<br>
- A8>& args) {<br>
- return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
- get<2>(args), get<3>(args), get<4>(args), get<5>(args),<br>
- get<6>(args), get<7>(args));<br>
- }<br>
-<br>
- // There is no InvokeCallback() for 8-tuples<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5, typename A6, typename A7, typename A8, typename A9><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > {<br>
- public:<br>
- template <typename Function><br>
- static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,<br>
- A6, A7, A8, A9>& args) {<br>
- return function(get<0>(args), get<1>(args), get<2>(args),<br>
- get<3>(args), get<4>(args), get<5>(args), get<6>(args),<br>
- get<7>(args), get<8>(args));<br>
- }<br>
-<br>
- template <class Class, typename MethodPtr><br>
- static R InvokeMethod(Class* obj_ptr,<br>
- MethodPtr method_ptr,<br>
- const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8,<br>
- A9>& args) {<br>
- return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
- get<2>(args), get<3>(args), get<4>(args), get<5>(args),<br>
- get<6>(args), get<7>(args), get<8>(args));<br>
- }<br>
-<br>
- // There is no InvokeCallback() for 9-tuples<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5, typename A6, typename A7, typename A8, typename A9,<br>
- typename A10><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,<br>
- A10> > {<br>
- public:<br>
- template <typename Function><br>
- static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,<br>
- A6, A7, A8, A9, A10>& args) {<br>
- return function(get<0>(args), get<1>(args), get<2>(args),<br>
- get<3>(args), get<4>(args), get<5>(args), get<6>(args),<br>
- get<7>(args), get<8>(args), get<9>(args));<br>
- }<br>
-<br>
- template <class Class, typename MethodPtr><br>
- static R InvokeMethod(Class* obj_ptr,<br>
- MethodPtr method_ptr,<br>
- const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8,<br>
- A9, A10>& args) {<br>
- return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
- get<2>(args), get<3>(args), get<4>(args), get<5>(args),<br>
- get<6>(args), get<7>(args), get<8>(args), get<9>(args));<br>
- }<br>
-<br>
- // There is no InvokeCallback() for 10-tuples<br>
-};<br>
-<br>
-// Implements the Invoke(callback) action.<br>
-template <typename CallbackType><br>
-class InvokeCallbackAction {<br>
- public:<br>
- // The c'tor takes ownership of the callback.<br>
- explicit InvokeCallbackAction(CallbackType* callback)<br>
- : callback_(callback) {<br>
- callback->CheckIsRepeatable(); // Makes sure the callback is permanent.<br>
- }<br>
-<br>
- // This type conversion operator template allows Invoke(callback) to<br>
- // be used wherever the callback's type is compatible with that of<br>
- // the mock function, i.e. if the mock function's arguments can be<br>
- // implicitly converted to the callback's arguments and the<br>
- // callback's result can be implicitly converted to the mock<br>
- // function's result.<br>
- template <typename Result, typename ArgumentTuple><br>
- Result Perform(const ArgumentTuple& args) const {<br>
- return InvokeHelper<Result, ArgumentTuple>::InvokeCallback(<br>
- callback_.get(), args);<br>
- }<br>
- private:<br>
- const linked_ptr<CallbackType> callback_;<br>
-};<br>
-<br>
-// An INTERNAL macro for extracting the type of a tuple field. It's<br>
-// subject to change without notice - DO NOT USE IN USER CODE!<br>
-#define GMOCK_FIELD_(Tuple, N) \<br>
- typename ::testing::tuple_element<N, Tuple>::type<br>
-<br>
-// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::type is the<br>
-// type of an n-ary function whose i-th (1-based) argument type is the<br>
-// k{i}-th (0-based) field of ArgumentTuple, which must be a tuple<br>
-// type, and whose return type is Result. For example,<br>
-// SelectArgs<int, ::testing::tuple<bool, char, double, long>, 0, 3>::type<br>
-// is int(bool, long).<br>
-//<br>
-// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::Select(args)<br>
-// returns the selected fields (k1, k2, ..., k_n) of args as a tuple.<br>
-// For example,<br>
-// SelectArgs<int, tuple<bool, char, double>, 2, 0>::Select(<br>
-// ::testing::make_tuple(true, 'a', 2.5))<br>
-// returns tuple (2.5, true).<br>
-//<br>
-// The numbers in list k1, k2, ..., k_n must be >= 0, where n can be<br>
-// in the range [0, 10]. Duplicates are allowed and they don't have<br>
-// to be in an ascending or descending order.<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,<br>
- int k4, int k5, int k6, int k7, int k8, int k9, int k10><br>
-class SelectArgs {<br>
- public:<br>
- typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
- GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),<br>
- GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),<br>
- GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),<br>
- GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9),<br>
- GMOCK_FIELD_(ArgumentTuple, k10));<br>
- typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
- static SelectedArgs Select(const ArgumentTuple& args) {<br>
- return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),<br>
- get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),<br>
- get<k8>(args), get<k9>(args), get<k10>(args));<br>
- }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple><br>
-class SelectArgs<Result, ArgumentTuple,<br>
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
- typedef Result type();<br>
- typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
- static SelectedArgs Select(const ArgumentTuple& /* args */) {<br>
- return SelectedArgs();<br>
- }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1><br>
-class SelectArgs<Result, ArgumentTuple,<br>
- k1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
- typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1));<br>
- typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
- static SelectedArgs Select(const ArgumentTuple& args) {<br>
- return SelectedArgs(get<k1>(args));<br>
- }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2><br>
-class SelectArgs<Result, ArgumentTuple,<br>
- k1, k2, -1, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
- typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
- GMOCK_FIELD_(ArgumentTuple, k2));<br>
- typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
- static SelectedArgs Select(const ArgumentTuple& args) {<br>
- return SelectedArgs(get<k1>(args), get<k2>(args));<br>
- }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3><br>
-class SelectArgs<Result, ArgumentTuple,<br>
- k1, k2, k3, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
- typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
- GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3));<br>
- typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
- static SelectedArgs Select(const ArgumentTuple& args) {<br>
- return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args));<br>
- }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,<br>
- int k4><br>
-class SelectArgs<Result, ArgumentTuple,<br>
- k1, k2, k3, k4, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
- typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
- GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),<br>
- GMOCK_FIELD_(ArgumentTuple, k4));<br>
- typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
- static SelectedArgs Select(const ArgumentTuple& args) {<br>
- return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),<br>
- get<k4>(args));<br>
- }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,<br>
- int k4, int k5><br>
-class SelectArgs<Result, ArgumentTuple,<br>
- k1, k2, k3, k4, k5, -1, -1, -1, -1, -1> {<br>
- public:<br>
- typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
- GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),<br>
- GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5));<br>
- typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
- static SelectedArgs Select(const ArgumentTuple& args) {<br>
- return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),<br>
- get<k4>(args), get<k5>(args));<br>
- }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,<br>
- int k4, int k5, int k6><br>
-class SelectArgs<Result, ArgumentTuple,<br>
- k1, k2, k3, k4, k5, k6, -1, -1, -1, -1> {<br>
- public:<br>
- typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
- GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),<br>
- GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),<br>
- GMOCK_FIELD_(ArgumentTuple, k6));<br>
- typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
- static SelectedArgs Select(const ArgumentTuple& args) {<br>
- return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),<br>
- get<k4>(args), get<k5>(args), get<k6>(args));<br>
- }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,<br>
- int k4, int k5, int k6, int k7><br>
-class SelectArgs<Result, ArgumentTuple,<br>
- k1, k2, k3, k4, k5, k6, k7, -1, -1, -1> {<br>
- public:<br>
- typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
- GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),<br>
- GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),<br>
- GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7));<br>
- typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
- static SelectedArgs Select(const ArgumentTuple& args) {<br>
- return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),<br>
- get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args));<br>
- }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,<br>
- int k4, int k5, int k6, int k7, int k8><br>
-class SelectArgs<Result, ArgumentTuple,<br>
- k1, k2, k3, k4, k5, k6, k7, k8, -1, -1> {<br>
- public:<br>
- typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
- GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),<br>
- GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),<br>
- GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),<br>
- GMOCK_FIELD_(ArgumentTuple, k8));<br>
- typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
- static SelectedArgs Select(const ArgumentTuple& args) {<br>
- return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),<br>
- get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),<br>
- get<k8>(args));<br>
- }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,<br>
- int k4, int k5, int k6, int k7, int k8, int k9><br>
-class SelectArgs<Result, ArgumentTuple,<br>
- k1, k2, k3, k4, k5, k6, k7, k8, k9, -1> {<br>
- public:<br>
- typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
- GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),<br>
- GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),<br>
- GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),<br>
- GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9));<br>
- typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
- static SelectedArgs Select(const ArgumentTuple& args) {<br>
- return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),<br>
- get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),<br>
- get<k8>(args), get<k9>(args));<br>
- }<br>
-};<br>
-<br>
-#undef GMOCK_FIELD_<br>
-<br>
-// Implements the WithArgs action.<br>
-template <typename InnerAction, int k1 = -1, int k2 = -1, int k3 = -1,<br>
- int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,<br>
- int k9 = -1, int k10 = -1><br>
-class WithArgsAction {<br>
- public:<br>
- explicit WithArgsAction(const InnerAction& action) : action_(action) {}<br>
-<br>
- template <typename F><br>
- operator Action<F>() const { return MakeAction(new Impl<F>(action_)); }<br>
-<br>
- private:<br>
- template <typename F><br>
- class Impl : public ActionInterface<F> {<br>
- public:<br>
- typedef typename Function<F>::Result Result;<br>
- typedef typename Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
- explicit Impl(const InnerAction& action) : action_(action) {}<br>
-<br>
- virtual Result Perform(const ArgumentTuple& args) {<br>
- return action_.Perform(SelectArgs<Result, ArgumentTuple, k1, k2, k3, k4,<br>
- k5, k6, k7, k8, k9, k10>::Select(args));<br>
- }<br>
-<br>
- private:<br>
- typedef typename SelectArgs<Result, ArgumentTuple,<br>
- k1, k2, k3, k4, k5, k6, k7, k8, k9, k10>::type InnerFunctionType;<br>
-<br>
- Action<InnerFunctionType> action_;<br>
- };<br>
-<br>
- const InnerAction action_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(WithArgsAction);<br>
-};<br>
-<br>
// A macro from the ACTION* family (defined later in this file)<br>
// defines an action that can be used in a mock function. Typically,<br>
// these actions only care about a subset of the arguments of the mock<br>
@@ -589,7 +72,7 @@ struct ExcessiveArg {};<br>
template <typename Result, class Impl><br>
class ActionHelper {<br>
public:<br>
- static Result Perform(Impl* impl, const ::testing::tuple<>& args) {<br>
+ static Result Perform(Impl* impl, const ::std::tuple<>& args) {<br>
return impl->template gmock_PerformImpl<>(args, ExcessiveArg(),<br>
ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
@@ -597,266 +80,100 @@ class ActionHelper {<br>
}<br>
<br>
template <typename A0><br>
- static Result Perform(Impl* impl, const ::testing::tuple<A0>& args) {<br>
- return impl->template gmock_PerformImpl<A0>(args, get<0>(args),<br>
+ static Result Perform(Impl* impl, const ::std::tuple<A0>& args) {<br>
+ return impl->template gmock_PerformImpl<A0>(args, std::get<0>(args),<br>
ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
ExcessiveArg());<br>
}<br>
<br>
template <typename A0, typename A1><br>
- static Result Perform(Impl* impl, const ::testing::tuple<A0, A1>& args) {<br>
- return impl->template gmock_PerformImpl<A0, A1>(args, get<0>(args),<br>
- get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
+ static Result Perform(Impl* impl, const ::std::tuple<A0, A1>& args) {<br>
+ return impl->template gmock_PerformImpl<A0, A1>(args, std::get<0>(args),<br>
+ std::get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
ExcessiveArg());<br>
}<br>
<br>
template <typename A0, typename A1, typename A2><br>
- static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2>& args) {<br>
- return impl->template gmock_PerformImpl<A0, A1, A2>(args, get<0>(args),<br>
- get<1>(args), get<2>(args), ExcessiveArg(), ExcessiveArg(),<br>
+ static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2>& args) {<br>
+ return impl->template gmock_PerformImpl<A0, A1, A2>(args,<br>
+ std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
- ExcessiveArg());<br>
+ ExcessiveArg(), ExcessiveArg(), ExcessiveArg());<br>
}<br>
<br>
template <typename A0, typename A1, typename A2, typename A3><br>
- static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2,<br>
- A3>& args) {<br>
- return impl->template gmock_PerformImpl<A0, A1, A2, A3>(args, get<0>(args),<br>
- get<1>(args), get<2>(args), get<3>(args), ExcessiveArg(),<br>
- ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
- ExcessiveArg());<br>
+ static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3>& args) {<br>
+ return impl->template gmock_PerformImpl<A0, A1, A2, A3>(args,<br>
+ std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
+ std::get<3>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
+ ExcessiveArg(), ExcessiveArg(), ExcessiveArg());<br>
}<br>
<br>
template <typename A0, typename A1, typename A2, typename A3, typename A4><br>
- static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3,<br>
+ static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3,<br>
A4>& args) {<br>
return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4>(args,<br>
- get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),<br>
- ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
- ExcessiveArg());<br>
+ std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
+ std::get<3>(args), std::get<4>(args), ExcessiveArg(), ExcessiveArg(),<br>
+ ExcessiveArg(), ExcessiveArg(), ExcessiveArg());<br>
}<br>
<br>
template <typename A0, typename A1, typename A2, typename A3, typename A4,<br>
typename A5><br>
- static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,<br>
+ static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4,<br>
A5>& args) {<br>
return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5>(args,<br>
- get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),<br>
- get<5>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
- ExcessiveArg());<br>
+ std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
+ std::get<3>(args), std::get<4>(args), std::get<5>(args),<br>
+ ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg());<br>
}<br>
<br>
template <typename A0, typename A1, typename A2, typename A3, typename A4,<br>
typename A5, typename A6><br>
- static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,<br>
- A5, A6>& args) {<br>
+ static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5,<br>
+ A6>& args) {<br>
return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6>(args,<br>
- get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),<br>
- get<5>(args), get<6>(args), ExcessiveArg(), ExcessiveArg(),<br>
- ExcessiveArg());<br>
+ std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
+ std::get<3>(args), std::get<4>(args), std::get<5>(args),<br>
+ std::get<6>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg());<br>
}<br>
<br>
template <typename A0, typename A1, typename A2, typename A3, typename A4,<br>
typename A5, typename A6, typename A7><br>
- static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,<br>
- A5, A6, A7>& args) {<br>
+ static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5,<br>
+ A6, A7>& args) {<br>
return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6,<br>
- A7>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),<br>
- get<4>(args), get<5>(args), get<6>(args), get<7>(args), ExcessiveArg(),<br>
- ExcessiveArg());<br>
+ A7>(args, std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
+ std::get<3>(args), std::get<4>(args), std::get<5>(args),<br>
+ std::get<6>(args), std::get<7>(args), ExcessiveArg(), ExcessiveArg());<br>
}<br>
<br>
template <typename A0, typename A1, typename A2, typename A3, typename A4,<br>
typename A5, typename A6, typename A7, typename A8><br>
- static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,<br>
- A5, A6, A7, A8>& args) {<br>
+ static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5,<br>
+ A6, A7, A8>& args) {<br>
return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7,<br>
- A8>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),<br>
- get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),<br>
+ A8>(args, std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
+ std::get<3>(args), std::get<4>(args), std::get<5>(args),<br>
+ std::get<6>(args), std::get<7>(args), std::get<8>(args),<br>
ExcessiveArg());<br>
}<br>
<br>
template <typename A0, typename A1, typename A2, typename A3, typename A4,<br>
typename A5, typename A6, typename A7, typename A8, typename A9><br>
- static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,<br>
- A5, A6, A7, A8, A9>& args) {<br>
+ static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5,<br>
+ A6, A7, A8, A9>& args) {<br>
return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, A8,<br>
- A9>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),<br>
- get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),<br>
- get<9>(args));<br>
+ A9>(args, std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
+ std::get<3>(args), std::get<4>(args), std::get<5>(args),<br>
+ std::get<6>(args), std::get<7>(args), std::get<8>(args),<br>
+ std::get<9>(args));<br>
}<br>
};<br>
<br>
} // namespace internal<br>
-<br>
-// Various overloads for Invoke().<br>
-<br>
-// WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes<br>
-// the selected arguments of the mock function to an_action and<br>
-// performs it. It serves as an adaptor between actions with<br>
-// <br>
diff erent argument lists. C++ doesn't support default arguments for<br>
-// function templates, so we have to overload it.<br>
-template <int k1, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1><br>
-WithArgs(const InnerAction& action) {<br>
- return internal::WithArgsAction<InnerAction, k1>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2><br>
-WithArgs(const InnerAction& action) {<br>
- return internal::WithArgsAction<InnerAction, k1, k2>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3><br>
-WithArgs(const InnerAction& action) {<br>
- return internal::WithArgsAction<InnerAction, k1, k2, k3>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4><br>
-WithArgs(const InnerAction& action) {<br>
- return internal::WithArgsAction<InnerAction, k1, k2, k3, k4>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5><br>
-WithArgs(const InnerAction& action) {<br>
- return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6><br>
-WithArgs(const InnerAction& action) {<br>
- return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7,<br>
- typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7><br>
-WithArgs(const InnerAction& action) {<br>
- return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6,<br>
- k7>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,<br>
- typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8><br>
-WithArgs(const InnerAction& action) {<br>
- return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7,<br>
- k8>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,<br>
- int k9, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, k9><br>
-WithArgs(const InnerAction& action) {<br>
- return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,<br>
- k9>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,<br>
- int k9, int k10, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,<br>
- k9, k10><br>
-WithArgs(const InnerAction& action) {<br>
- return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,<br>
- k9, k10>(action);<br>
-}<br>
-<br>
-// Creates an action that does actions a1, a2, ..., sequentially in<br>
-// each invocation.<br>
-template <typename Action1, typename Action2><br>
-inline internal::DoBothAction<Action1, Action2><br>
-DoAll(Action1 a1, Action2 a2) {<br>
- return internal::DoBothAction<Action1, Action2>(a1, a2);<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
- Action3> ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3) {<br>
- return DoAll(a1, DoAll(a2, a3));<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3,<br>
- typename Action4><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
- internal::DoBothAction<Action3, Action4> > ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4) {<br>
- return DoAll(a1, DoAll(a2, a3, a4));<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3,<br>
- typename Action4, typename Action5><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
- internal::DoBothAction<Action3, internal::DoBothAction<Action4,<br>
- Action5> > > ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5) {<br>
- return DoAll(a1, DoAll(a2, a3, a4, a5));<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3,<br>
- typename Action4, typename Action5, typename Action6><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
- internal::DoBothAction<Action3, internal::DoBothAction<Action4,<br>
- internal::DoBothAction<Action5, Action6> > > > ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6) {<br>
- return DoAll(a1, DoAll(a2, a3, a4, a5, a6));<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3,<br>
- typename Action4, typename Action5, typename Action6, typename Action7><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
- internal::DoBothAction<Action3, internal::DoBothAction<Action4,<br>
- internal::DoBothAction<Action5, internal::DoBothAction<Action6,<br>
- Action7> > > > > ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
- Action7 a7) {<br>
- return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7));<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3,<br>
- typename Action4, typename Action5, typename Action6, typename Action7,<br>
- typename Action8><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
- internal::DoBothAction<Action3, internal::DoBothAction<Action4,<br>
- internal::DoBothAction<Action5, internal::DoBothAction<Action6,<br>
- internal::DoBothAction<Action7, Action8> > > > > > ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
- Action7 a7, Action8 a8) {<br>
- return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8));<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3,<br>
- typename Action4, typename Action5, typename Action6, typename Action7,<br>
- typename Action8, typename Action9><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
- internal::DoBothAction<Action3, internal::DoBothAction<Action4,<br>
- internal::DoBothAction<Action5, internal::DoBothAction<Action6,<br>
- internal::DoBothAction<Action7, internal::DoBothAction<Action8,<br>
- Action9> > > > > > > ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
- Action7 a7, Action8 a8, Action9 a9) {<br>
- return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9));<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3,<br>
- typename Action4, typename Action5, typename Action6, typename Action7,<br>
- typename Action8, typename Action9, typename Action10><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
- internal::DoBothAction<Action3, internal::DoBothAction<Action4,<br>
- internal::DoBothAction<Action5, internal::DoBothAction<Action6,<br>
- internal::DoBothAction<Action7, internal::DoBothAction<Action8,<br>
- internal::DoBothAction<Action9, Action10> > > > > > > > ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
- Action7 a7, Action8 a8, Action9 a9, Action10 a10) {<br>
- return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9, a10));<br>
-}<br>
-<br>
} // namespace testing<br>
<br>
// The ACTION* family of macros can be used in a namespace scope to<br>
@@ -944,30 +261,29 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
//<br>
// CAVEAT:<br>
//<br>
-// ACTION*() can only be used in a namespace scope. The reason is<br>
-// that C++ doesn't yet allow function-local types to be used to<br>
-// instantiate templates. The up-coming C++0x standard will fix this.<br>
-// Once that's done, we'll consider supporting using ACTION*() inside<br>
-// a function.<br>
+// ACTION*() can only be used in a namespace scope as templates cannot be<br>
+// declared inside of a local class.<br>
+// Users can, however, define any local functors (e.g. a lambda) that<br>
+// can be used as actions.<br>
//<br>
// MORE INFORMATION:<br>
//<br>
-// To learn more about using these macros, please search for 'ACTION'<br>
-// on <a href="https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md" rel="noreferrer" target="_blank">https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md</a><br>
+// To learn more about using these macros, please search for 'ACTION' on<br>
+// <a href="https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md" rel="noreferrer" target="_blank">https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md</a><br>
<br>
// An internal macro needed for implementing ACTION*().<br>
#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\<br>
const args_type& args GTEST_ATTRIBUTE_UNUSED_, \<br>
- arg0_type arg0 GTEST_ATTRIBUTE_UNUSED_, \<br>
- arg1_type arg1 GTEST_ATTRIBUTE_UNUSED_, \<br>
- arg2_type arg2 GTEST_ATTRIBUTE_UNUSED_, \<br>
- arg3_type arg3 GTEST_ATTRIBUTE_UNUSED_, \<br>
- arg4_type arg4 GTEST_ATTRIBUTE_UNUSED_, \<br>
- arg5_type arg5 GTEST_ATTRIBUTE_UNUSED_, \<br>
- arg6_type arg6 GTEST_ATTRIBUTE_UNUSED_, \<br>
- arg7_type arg7 GTEST_ATTRIBUTE_UNUSED_, \<br>
- arg8_type arg8 GTEST_ATTRIBUTE_UNUSED_, \<br>
- arg9_type arg9 GTEST_ATTRIBUTE_UNUSED_<br>
+ const arg0_type& arg0 GTEST_ATTRIBUTE_UNUSED_, \<br>
+ const arg1_type& arg1 GTEST_ATTRIBUTE_UNUSED_, \<br>
+ const arg2_type& arg2 GTEST_ATTRIBUTE_UNUSED_, \<br>
+ const arg3_type& arg3 GTEST_ATTRIBUTE_UNUSED_, \<br>
+ const arg4_type& arg4 GTEST_ATTRIBUTE_UNUSED_, \<br>
+ const arg5_type& arg5 GTEST_ATTRIBUTE_UNUSED_, \<br>
+ const arg6_type& arg6 GTEST_ATTRIBUTE_UNUSED_, \<br>
+ const arg7_type& arg7 GTEST_ATTRIBUTE_UNUSED_, \<br>
+ const arg8_type& arg8 GTEST_ATTRIBUTE_UNUSED_, \<br>
+ const arg9_type& arg9 GTEST_ATTRIBUTE_UNUSED_<br>
<br>
// Sometimes you want to give an action explicit template parameters<br>
// that cannot be inferred from its value parameters. ACTION() and<br>
@@ -993,7 +309,7 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
// ACTION_TEMPLATE(DuplicateArg,<br>
// HAS_2_TEMPLATE_PARAMS(int, k, typename, T),<br>
// AND_1_VALUE_PARAMS(output)) {<br>
-// *output = T(::testing::get<k>(args));<br>
+// *output = T(::std::get<k>(args));<br>
// }<br>
// ...<br>
// int n;<br>
@@ -1151,90 +467,67 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
#define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\<br>
()<br>
#define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\<br>
- (p0##_type gmock_p0) : p0(::testing::internal::move(gmock_p0))<br>
+ (p0##_type gmock_p0) : p0(::std::move(gmock_p0))<br>
#define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\<br>
- (p0##_type gmock_p0, \<br>
- p1##_type gmock_p1) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1))<br>
+ (p0##_type gmock_p0, p1##_type gmock_p1) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1))<br>
#define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\<br>
(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
- p2##_type gmock_p2) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2))<br>
+ p2##_type gmock_p2) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2))<br>
#define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\<br>
(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
- p3##_type gmock_p3) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3))<br>
+ p3##_type gmock_p3) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+ p3(::std::move(gmock_p3))<br>
#define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\<br>
(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
- p3##_type gmock_p3, \<br>
- p4##_type gmock_p4) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4))<br>
+ p3##_type gmock_p3, p4##_type gmock_p4) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+ p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4))<br>
#define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\<br>
(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, p4##_type gmock_p4, \<br>
- p5##_type gmock_p5) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)), \<br>
- p5(::testing::internal::move(gmock_p5))<br>
+ p5##_type gmock_p5) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+ p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+ p5(::std::move(gmock_p5))<br>
#define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\<br>
(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
- p6##_type gmock_p6) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)), \<br>
- p5(::testing::internal::move(gmock_p5)), \<br>
- p6(::testing::internal::move(gmock_p6))<br>
+ p6##_type gmock_p6) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+ p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+ p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6))<br>
#define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\<br>
(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
- p6##_type gmock_p6, \<br>
- p7##_type gmock_p7) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)), \<br>
- p5(::testing::internal::move(gmock_p5)), \<br>
- p6(::testing::internal::move(gmock_p6)), \<br>
- p7(::testing::internal::move(gmock_p7))<br>
+ p6##_type gmock_p6, p7##_type gmock_p7) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+ p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+ p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \<br>
+ p7(::std::move(gmock_p7))<br>
#define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \<br>
p7, p8)\<br>
(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
p6##_type gmock_p6, p7##_type gmock_p7, \<br>
- p8##_type gmock_p8) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)), \<br>
- p5(::testing::internal::move(gmock_p5)), \<br>
- p6(::testing::internal::move(gmock_p6)), \<br>
- p7(::testing::internal::move(gmock_p7)), \<br>
- p8(::testing::internal::move(gmock_p8))<br>
+ p8##_type gmock_p8) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+ p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+ p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \<br>
+ p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8))<br>
#define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \<br>
p7, p8, p9)\<br>
(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \<br>
- p9##_type gmock_p9) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)), \<br>
- p5(::testing::internal::move(gmock_p5)), \<br>
- p6(::testing::internal::move(gmock_p6)), \<br>
- p7(::testing::internal::move(gmock_p7)), \<br>
- p8(::testing::internal::move(gmock_p8)), \<br>
- p9(::testing::internal::move(gmock_p9))<br>
+ p9##_type gmock_p9) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+ p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+ p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \<br>
+ p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)), \<br>
+ p9(::std::move(gmock_p9))<br>
<br>
// Declares the fields for storing the value parameters.<br>
#define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS()<br>
@@ -1380,10 +673,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typename arg3_type, typename arg4_type, typename arg5_type, \<br>
typename arg6_type, typename arg7_type, typename arg8_type, \<br>
typename arg9_type>\<br>
- return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
- arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
- arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
- arg9_type arg9) const;\<br>
+ return_type gmock_PerformImpl(const args_type& args, \<br>
+ const arg0_type& arg0, const arg1_type& arg1, \<br>
+ const arg2_type& arg2, const arg3_type& arg3, \<br>
+ const arg4_type& arg4, const arg5_type& arg5, \<br>
+ const arg6_type& arg6, const arg7_type& arg7, \<br>
+ const arg8_type& arg8, const arg9_type& arg9) const;\<br>
GMOCK_INTERNAL_DEFN_##value_params\<br>
private:\<br>
GTEST_DISALLOW_ASSIGN_(gmock_Impl);\<br>
@@ -1441,10 +736,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typename arg3_type, typename arg4_type, typename arg5_type, \<br>
typename arg6_type, typename arg7_type, typename arg8_type, \<br>
typename arg9_type>\<br>
- return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
- arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
- arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
- arg9_type arg9) const;\<br>
+ return_type gmock_PerformImpl(const args_type& args, \<br>
+ const arg0_type& arg0, const arg1_type& arg1, \<br>
+ const arg2_type& arg2, const arg3_type& arg3, \<br>
+ const arg4_type& arg4, const arg5_type& arg5, \<br>
+ const arg6_type& arg6, const arg7_type& arg7, \<br>
+ const arg8_type& arg8, const arg9_type& arg9) const;\<br>
private:\<br>
GTEST_DISALLOW_ASSIGN_(gmock_Impl);\<br>
};\<br>
@@ -1471,7 +768,7 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
class name##ActionP {\<br>
public:\<br>
explicit name##ActionP(p0##_type gmock_p0) : \<br>
- p0(::testing::internal::forward<p0##_type>(gmock_p0)) {}\<br>
+ p0(::std::forward<p0##_type>(gmock_p0)) {}\<br>
template <typename F>\<br>
class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
public:\<br>
@@ -1480,7 +777,7 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typedef typename ::testing::internal::Function<F>::ArgumentTuple\<br>
args_type;\<br>
explicit gmock_Impl(p0##_type gmock_p0) : \<br>
- p0(::testing::internal::forward<p0##_type>(gmock_p0)) {}\<br>
+ p0(::std::forward<p0##_type>(gmock_p0)) {}\<br>
virtual return_type Perform(const args_type& args) {\<br>
return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
Perform(this, args);\<br>
@@ -1489,10 +786,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typename arg3_type, typename arg4_type, typename arg5_type, \<br>
typename arg6_type, typename arg7_type, typename arg8_type, \<br>
typename arg9_type>\<br>
- return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
- arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
- arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
- arg9_type arg9) const;\<br>
+ return_type gmock_PerformImpl(const args_type& args, \<br>
+ const arg0_type& arg0, const arg1_type& arg1, \<br>
+ const arg2_type& arg2, const arg3_type& arg3, \<br>
+ const arg4_type& arg4, const arg5_type& arg5, \<br>
+ const arg6_type& arg6, const arg7_type& arg7, \<br>
+ const arg8_type& arg8, const arg9_type& arg9) const;\<br>
p0##_type p0;\<br>
private:\<br>
GTEST_DISALLOW_ASSIGN_(gmock_Impl);\<br>
@@ -1523,8 +822,8 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
class name##ActionP2 {\<br>
public:\<br>
name##ActionP2(p0##_type gmock_p0, \<br>
- p1##_type gmock_p1) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)) {}\<br>
+ p1##_type gmock_p1) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)) {}\<br>
template <typename F>\<br>
class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
public:\<br>
@@ -1533,8 +832,8 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typedef typename ::testing::internal::Function<F>::ArgumentTuple\<br>
args_type;\<br>
gmock_Impl(p0##_type gmock_p0, \<br>
- p1##_type gmock_p1) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)) {}\<br>
+ p1##_type gmock_p1) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)) {}\<br>
virtual return_type Perform(const args_type& args) {\<br>
return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
Perform(this, args);\<br>
@@ -1543,10 +842,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typename arg3_type, typename arg4_type, typename arg5_type, \<br>
typename arg6_type, typename arg7_type, typename arg8_type, \<br>
typename arg9_type>\<br>
- return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
- arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
- arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
- arg9_type arg9) const;\<br>
+ return_type gmock_PerformImpl(const args_type& args, \<br>
+ const arg0_type& arg0, const arg1_type& arg1, \<br>
+ const arg2_type& arg2, const arg3_type& arg3, \<br>
+ const arg4_type& arg4, const arg5_type& arg5, \<br>
+ const arg6_type& arg6, const arg7_type& arg7, \<br>
+ const arg8_type& arg8, const arg9_type& arg9) const;\<br>
p0##_type p0;\<br>
p1##_type p1;\<br>
private:\<br>
@@ -1580,9 +881,9 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
class name##ActionP3 {\<br>
public:\<br>
name##ActionP3(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
- p2##_type gmock_p2) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)) {}\<br>
+ p2##_type gmock_p2) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)) {}\<br>
template <typename F>\<br>
class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
public:\<br>
@@ -1591,9 +892,9 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typedef typename ::testing::internal::Function<F>::ArgumentTuple\<br>
args_type;\<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
- p2##_type gmock_p2) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)) {}\<br>
+ p2##_type gmock_p2) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)) {}\<br>
virtual return_type Perform(const args_type& args) {\<br>
return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
Perform(this, args);\<br>
@@ -1602,10 +903,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typename arg3_type, typename arg4_type, typename arg5_type, \<br>
typename arg6_type, typename arg7_type, typename arg8_type, \<br>
typename arg9_type>\<br>
- return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
- arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
- arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
- arg9_type arg9) const;\<br>
+ return_type gmock_PerformImpl(const args_type& args, \<br>
+ const arg0_type& arg0, const arg1_type& arg1, \<br>
+ const arg2_type& arg2, const arg3_type& arg3, \<br>
+ const arg4_type& arg4, const arg5_type& arg5, \<br>
+ const arg6_type& arg6, const arg7_type& arg7, \<br>
+ const arg8_type& arg8, const arg9_type& arg9) const;\<br>
p0##_type p0;\<br>
p1##_type p1;\<br>
p2##_type p2;\<br>
@@ -1644,10 +947,10 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
public:\<br>
name##ActionP4(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
p2##_type gmock_p2, \<br>
- p3##_type gmock_p3) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
- p3(::testing::internal::forward<p3##_type>(gmock_p3)) {}\<br>
+ p3##_type gmock_p3) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+ p3(::std::forward<p3##_type>(gmock_p3)) {}\<br>
template <typename F>\<br>
class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
public:\<br>
@@ -1656,10 +959,10 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typedef typename ::testing::internal::Function<F>::ArgumentTuple\<br>
args_type;\<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
- p3##_type gmock_p3) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
- p3(::testing::internal::forward<p3##_type>(gmock_p3)) {}\<br>
+ p3##_type gmock_p3) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+ p3(::std::forward<p3##_type>(gmock_p3)) {}\<br>
virtual return_type Perform(const args_type& args) {\<br>
return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
Perform(this, args);\<br>
@@ -1668,10 +971,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typename arg3_type, typename arg4_type, typename arg5_type, \<br>
typename arg6_type, typename arg7_type, typename arg8_type, \<br>
typename arg9_type>\<br>
- return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
- arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
- arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
- arg9_type arg9) const;\<br>
+ return_type gmock_PerformImpl(const args_type& args, \<br>
+ const arg0_type& arg0, const arg1_type& arg1, \<br>
+ const arg2_type& arg2, const arg3_type& arg3, \<br>
+ const arg4_type& arg4, const arg5_type& arg5, \<br>
+ const arg6_type& arg6, const arg7_type& arg7, \<br>
+ const arg8_type& arg8, const arg9_type& arg9) const;\<br>
p0##_type p0;\<br>
p1##_type p1;\<br>
p2##_type p2;\<br>
@@ -1716,11 +1021,11 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
public:\<br>
name##ActionP5(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
p2##_type gmock_p2, p3##_type gmock_p3, \<br>
- p4##_type gmock_p4) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
- p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
- p4(::testing::internal::forward<p4##_type>(gmock_p4)) {}\<br>
+ p4##_type gmock_p4) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+ p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+ p4(::std::forward<p4##_type>(gmock_p4)) {}\<br>
template <typename F>\<br>
class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
public:\<br>
@@ -1730,11 +1035,11 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
args_type;\<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, \<br>
- p4##_type gmock_p4) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
- p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
- p4(::testing::internal::forward<p4##_type>(gmock_p4)) {}\<br>
+ p4##_type gmock_p4) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+ p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+ p4(::std::forward<p4##_type>(gmock_p4)) {}\<br>
virtual return_type Perform(const args_type& args) {\<br>
return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
Perform(this, args);\<br>
@@ -1743,10 +1048,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typename arg3_type, typename arg4_type, typename arg5_type, \<br>
typename arg6_type, typename arg7_type, typename arg8_type, \<br>
typename arg9_type>\<br>
- return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
- arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
- arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
- arg9_type arg9) const;\<br>
+ return_type gmock_PerformImpl(const args_type& args, \<br>
+ const arg0_type& arg0, const arg1_type& arg1, \<br>
+ const arg2_type& arg2, const arg3_type& arg3, \<br>
+ const arg4_type& arg4, const arg5_type& arg5, \<br>
+ const arg6_type& arg6, const arg7_type& arg7, \<br>
+ const arg8_type& arg8, const arg9_type& arg9) const;\<br>
p0##_type p0;\<br>
p1##_type p1;\<br>
p2##_type p2;\<br>
@@ -1793,12 +1100,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
public:\<br>
name##ActionP6(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
- p5##_type gmock_p5) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
- p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
- p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
- p5(::testing::internal::forward<p5##_type>(gmock_p5)) {}\<br>
+ p5##_type gmock_p5) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+ p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+ p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+ p5(::std::forward<p5##_type>(gmock_p5)) {}\<br>
template <typename F>\<br>
class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
public:\<br>
@@ -1808,12 +1115,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
args_type;\<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, p4##_type gmock_p4, \<br>
- p5##_type gmock_p5) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
- p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
- p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
- p5(::testing::internal::forward<p5##_type>(gmock_p5)) {}\<br>
+ p5##_type gmock_p5) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+ p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+ p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+ p5(::std::forward<p5##_type>(gmock_p5)) {}\<br>
virtual return_type Perform(const args_type& args) {\<br>
return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
Perform(this, args);\<br>
@@ -1822,10 +1129,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typename arg3_type, typename arg4_type, typename arg5_type, \<br>
typename arg6_type, typename arg7_type, typename arg8_type, \<br>
typename arg9_type>\<br>
- return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
- arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
- arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
- arg9_type arg9) const;\<br>
+ return_type gmock_PerformImpl(const args_type& args, \<br>
+ const arg0_type& arg0, const arg1_type& arg1, \<br>
+ const arg2_type& arg2, const arg3_type& arg3, \<br>
+ const arg4_type& arg4, const arg5_type& arg5, \<br>
+ const arg6_type& arg6, const arg7_type& arg7, \<br>
+ const arg8_type& arg8, const arg9_type& arg9) const;\<br>
p0##_type p0;\<br>
p1##_type p1;\<br>
p2##_type p2;\<br>
@@ -1876,13 +1185,13 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
name##ActionP7(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
p5##_type gmock_p5, \<br>
- p6##_type gmock_p6) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
- p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
- p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
- p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
- p6(::testing::internal::forward<p6##_type>(gmock_p6)) {}\<br>
+ p6##_type gmock_p6) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+ p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+ p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+ p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+ p6(::std::forward<p6##_type>(gmock_p6)) {}\<br>
template <typename F>\<br>
class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
public:\<br>
@@ -1892,13 +1201,13 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
args_type;\<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
- p6##_type gmock_p6) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
- p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
- p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
- p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
- p6(::testing::internal::forward<p6##_type>(gmock_p6)) {}\<br>
+ p6##_type gmock_p6) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+ p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+ p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+ p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+ p6(::std::forward<p6##_type>(gmock_p6)) {}\<br>
virtual return_type Perform(const args_type& args) {\<br>
return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
Perform(this, args);\<br>
@@ -1907,10 +1216,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typename arg3_type, typename arg4_type, typename arg5_type, \<br>
typename arg6_type, typename arg7_type, typename arg8_type, \<br>
typename arg9_type>\<br>
- return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
- arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
- arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
- arg9_type arg9) const;\<br>
+ return_type gmock_PerformImpl(const args_type& args, \<br>
+ const arg0_type& arg0, const arg1_type& arg1, \<br>
+ const arg2_type& arg2, const arg3_type& arg3, \<br>
+ const arg4_type& arg4, const arg5_type& arg5, \<br>
+ const arg6_type& arg6, const arg7_type& arg7, \<br>
+ const arg8_type& arg8, const arg9_type& arg9) const;\<br>
p0##_type p0;\<br>
p1##_type p1;\<br>
p2##_type p2;\<br>
@@ -1967,14 +1278,14 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
name##ActionP8(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
p5##_type gmock_p5, p6##_type gmock_p6, \<br>
- p7##_type gmock_p7) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
- p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
- p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
- p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
- p6(::testing::internal::forward<p6##_type>(gmock_p6)), \<br>
- p7(::testing::internal::forward<p7##_type>(gmock_p7)) {}\<br>
+ p7##_type gmock_p7) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+ p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+ p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+ p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+ p6(::std::forward<p6##_type>(gmock_p6)), \<br>
+ p7(::std::forward<p7##_type>(gmock_p7)) {}\<br>
template <typename F>\<br>
class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
public:\<br>
@@ -1985,14 +1296,14 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
p6##_type gmock_p6, \<br>
- p7##_type gmock_p7) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
- p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
- p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
- p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
- p6(::testing::internal::forward<p6##_type>(gmock_p6)), \<br>
- p7(::testing::internal::forward<p7##_type>(gmock_p7)) {}\<br>
+ p7##_type gmock_p7) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+ p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+ p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+ p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+ p6(::std::forward<p6##_type>(gmock_p6)), \<br>
+ p7(::std::forward<p7##_type>(gmock_p7)) {}\<br>
virtual return_type Perform(const args_type& args) {\<br>
return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
Perform(this, args);\<br>
@@ -2001,10 +1312,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typename arg3_type, typename arg4_type, typename arg5_type, \<br>
typename arg6_type, typename arg7_type, typename arg8_type, \<br>
typename arg9_type>\<br>
- return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
- arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
- arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
- arg9_type arg9) const;\<br>
+ return_type gmock_PerformImpl(const args_type& args, \<br>
+ const arg0_type& arg0, const arg1_type& arg1, \<br>
+ const arg2_type& arg2, const arg3_type& arg3, \<br>
+ const arg4_type& arg4, const arg5_type& arg5, \<br>
+ const arg6_type& arg6, const arg7_type& arg7, \<br>
+ const arg8_type& arg8, const arg9_type& arg9) const;\<br>
p0##_type p0;\<br>
p1##_type p1;\<br>
p2##_type p2;\<br>
@@ -2065,15 +1378,15 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
name##ActionP9(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \<br>
- p8##_type gmock_p8) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
- p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
- p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
- p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
- p6(::testing::internal::forward<p6##_type>(gmock_p6)), \<br>
- p7(::testing::internal::forward<p7##_type>(gmock_p7)), \<br>
- p8(::testing::internal::forward<p8##_type>(gmock_p8)) {}\<br>
+ p8##_type gmock_p8) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+ p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+ p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+ p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+ p6(::std::forward<p6##_type>(gmock_p6)), \<br>
+ p7(::std::forward<p7##_type>(gmock_p7)), \<br>
+ p8(::std::forward<p8##_type>(gmock_p8)) {}\<br>
template <typename F>\<br>
class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
public:\<br>
@@ -2084,15 +1397,15 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
p6##_type gmock_p6, p7##_type gmock_p7, \<br>
- p8##_type gmock_p8) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
- p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
- p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
- p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
- p6(::testing::internal::forward<p6##_type>(gmock_p6)), \<br>
- p7(::testing::internal::forward<p7##_type>(gmock_p7)), \<br>
- p8(::testing::internal::forward<p8##_type>(gmock_p8)) {}\<br>
+ p8##_type gmock_p8) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+ p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+ p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+ p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+ p6(::std::forward<p6##_type>(gmock_p6)), \<br>
+ p7(::std::forward<p7##_type>(gmock_p7)), \<br>
+ p8(::std::forward<p8##_type>(gmock_p8)) {}\<br>
virtual return_type Perform(const args_type& args) {\<br>
return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
Perform(this, args);\<br>
@@ -2101,10 +1414,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typename arg3_type, typename arg4_type, typename arg5_type, \<br>
typename arg6_type, typename arg7_type, typename arg8_type, \<br>
typename arg9_type>\<br>
- return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
- arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
- arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
- arg9_type arg9) const;\<br>
+ return_type gmock_PerformImpl(const args_type& args, \<br>
+ const arg0_type& arg0, const arg1_type& arg1, \<br>
+ const arg2_type& arg2, const arg3_type& arg3, \<br>
+ const arg4_type& arg4, const arg5_type& arg5, \<br>
+ const arg6_type& arg6, const arg7_type& arg7, \<br>
+ const arg8_type& arg8, const arg9_type& arg9) const;\<br>
p0##_type p0;\<br>
p1##_type p1;\<br>
p2##_type p2;\<br>
@@ -2170,16 +1485,16 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \<br>
p8##_type gmock_p8, \<br>
- p9##_type gmock_p9) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
- p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
- p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
- p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
- p6(::testing::internal::forward<p6##_type>(gmock_p6)), \<br>
- p7(::testing::internal::forward<p7##_type>(gmock_p7)), \<br>
- p8(::testing::internal::forward<p8##_type>(gmock_p8)), \<br>
- p9(::testing::internal::forward<p9##_type>(gmock_p9)) {}\<br>
+ p9##_type gmock_p9) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+ p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+ p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+ p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+ p6(::std::forward<p6##_type>(gmock_p6)), \<br>
+ p7(::std::forward<p7##_type>(gmock_p7)), \<br>
+ p8(::std::forward<p8##_type>(gmock_p8)), \<br>
+ p9(::std::forward<p9##_type>(gmock_p9)) {}\<br>
template <typename F>\<br>
class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
public:\<br>
@@ -2190,16 +1505,16 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \<br>
- p9##_type gmock_p9) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
- p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
- p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
- p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
- p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
- p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
- p6(::testing::internal::forward<p6##_type>(gmock_p6)), \<br>
- p7(::testing::internal::forward<p7##_type>(gmock_p7)), \<br>
- p8(::testing::internal::forward<p8##_type>(gmock_p8)), \<br>
- p9(::testing::internal::forward<p9##_type>(gmock_p9)) {}\<br>
+ p9##_type gmock_p9) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+ p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+ p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+ p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+ p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+ p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+ p6(::std::forward<p6##_type>(gmock_p6)), \<br>
+ p7(::std::forward<p7##_type>(gmock_p7)), \<br>
+ p8(::std::forward<p8##_type>(gmock_p8)), \<br>
+ p9(::std::forward<p9##_type>(gmock_p9)) {}\<br>
virtual return_type Perform(const args_type& args) {\<br>
return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
Perform(this, args);\<br>
@@ -2208,10 +1523,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
typename arg3_type, typename arg4_type, typename arg5_type, \<br>
typename arg6_type, typename arg7_type, typename arg8_type, \<br>
typename arg9_type>\<br>
- return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
- arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
- arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
- arg9_type arg9) const;\<br>
+ return_type gmock_PerformImpl(const args_type& args, \<br>
+ const arg0_type& arg0, const arg1_type& arg1, \<br>
+ const arg2_type& arg2, const arg3_type& arg3, \<br>
+ const arg4_type& arg4, const arg5_type& arg5, \<br>
+ const arg6_type& arg6, const arg7_type& arg7, \<br>
+ const arg8_type& arg8, const arg9_type& arg9) const;\<br>
p0##_type p0;\<br>
p1##_type p1;\<br>
p2##_type p2;\<br>
@@ -2391,7 +1708,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
using internal::invoke_argument::InvokeArgumentAdl;<br>
return InvokeArgumentAdl<return_type>(<br>
internal::invoke_argument::AdlTag(),<br>
- ::testing::get<k>(args));<br>
+ ::std::get<k>(args));<br>
}<br>
<br>
ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2400,7 +1717,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
using internal::invoke_argument::InvokeArgumentAdl;<br>
return InvokeArgumentAdl<return_type>(<br>
internal::invoke_argument::AdlTag(),<br>
- ::testing::get<k>(args), p0);<br>
+ ::std::get<k>(args), p0);<br>
}<br>
<br>
ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2409,7 +1726,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
using internal::invoke_argument::InvokeArgumentAdl;<br>
return InvokeArgumentAdl<return_type>(<br>
internal::invoke_argument::AdlTag(),<br>
- ::testing::get<k>(args), p0, p1);<br>
+ ::std::get<k>(args), p0, p1);<br>
}<br>
<br>
ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2418,7 +1735,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
using internal::invoke_argument::InvokeArgumentAdl;<br>
return InvokeArgumentAdl<return_type>(<br>
internal::invoke_argument::AdlTag(),<br>
- ::testing::get<k>(args), p0, p1, p2);<br>
+ ::std::get<k>(args), p0, p1, p2);<br>
}<br>
<br>
ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2427,7 +1744,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
using internal::invoke_argument::InvokeArgumentAdl;<br>
return InvokeArgumentAdl<return_type>(<br>
internal::invoke_argument::AdlTag(),<br>
- ::testing::get<k>(args), p0, p1, p2, p3);<br>
+ ::std::get<k>(args), p0, p1, p2, p3);<br>
}<br>
<br>
ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2436,7 +1753,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
using internal::invoke_argument::InvokeArgumentAdl;<br>
return InvokeArgumentAdl<return_type>(<br>
internal::invoke_argument::AdlTag(),<br>
- ::testing::get<k>(args), p0, p1, p2, p3, p4);<br>
+ ::std::get<k>(args), p0, p1, p2, p3, p4);<br>
}<br>
<br>
ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2445,7 +1762,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
using internal::invoke_argument::InvokeArgumentAdl;<br>
return InvokeArgumentAdl<return_type>(<br>
internal::invoke_argument::AdlTag(),<br>
- ::testing::get<k>(args), p0, p1, p2, p3, p4, p5);<br>
+ ::std::get<k>(args), p0, p1, p2, p3, p4, p5);<br>
}<br>
<br>
ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2454,7 +1771,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
using internal::invoke_argument::InvokeArgumentAdl;<br>
return InvokeArgumentAdl<return_type>(<br>
internal::invoke_argument::AdlTag(),<br>
- ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6);<br>
+ ::std::get<k>(args), p0, p1, p2, p3, p4, p5, p6);<br>
}<br>
<br>
ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2463,7 +1780,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
using internal::invoke_argument::InvokeArgumentAdl;<br>
return InvokeArgumentAdl<return_type>(<br>
internal::invoke_argument::AdlTag(),<br>
- ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7);<br>
+ ::std::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7);<br>
}<br>
<br>
ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2472,7 +1789,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
using internal::invoke_argument::InvokeArgumentAdl;<br>
return InvokeArgumentAdl<return_type>(<br>
internal::invoke_argument::AdlTag(),<br>
- ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8);<br>
+ ::std::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8);<br>
}<br>
<br>
ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2481,7 +1798,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
using internal::invoke_argument::InvokeArgumentAdl;<br>
return InvokeArgumentAdl<return_type>(<br>
internal::invoke_argument::AdlTag(),<br>
- ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);<br>
+ ::std::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);<br>
}<br>
<br>
// Various overloads for ReturnNew<T>().<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-function-mockers.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-function-mockers.h<br>
index 53a71611f9261..d131bea8158b6 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-function-mockers.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-function-mockers.h<br>
@@ -43,298 +43,14 @@<br>
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_<br>
#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_<br>
<br>
+#include <functional><br>
+#include <utility><br>
+<br>
#include "gmock/gmock-spec-builders.h"<br>
#include "gmock/internal/gmock-internal-utils.h"<br>
<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
-# include <functional><br>
-#endif<br>
-<br>
namespace testing {<br>
namespace internal {<br>
-<br>
-template <typename F><br>
-class FunctionMockerBase;<br>
-<br>
-// Note: class FunctionMocker really belongs to the ::testing<br>
-// namespace. However if we define it in ::testing, MSVC will<br>
-// complain when classes in ::testing::internal declare it as a<br>
-// friend class template. To workaround this compiler bug, we define<br>
-// FunctionMocker in ::testing::internal and import it into ::testing.<br>
-template <typename F><br>
-class FunctionMocker;<br>
-<br>
-template <typename R><br>
-class FunctionMocker<R()> : public<br>
- internal::FunctionMockerBase<R()> {<br>
- public:<br>
- typedef R F();<br>
- typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
- MockSpec<F> With() {<br>
- return MockSpec<F>(this, ::testing::make_tuple());<br>
- }<br>
-<br>
- R Invoke() {<br>
- // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
- // by the C++ standard [14.6.4] here, as the base class type is<br>
- // dependent on the template argument (and thus shouldn't be<br>
- // looked into when resolving InvokeWith).<br>
- return this->InvokeWith(ArgumentTuple());<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1><br>
-class FunctionMocker<R(A1)> : public<br>
- internal::FunctionMockerBase<R(A1)> {<br>
- public:<br>
- typedef R F(A1);<br>
- typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
- MockSpec<F> With(const Matcher<A1>& m1) {<br>
- return MockSpec<F>(this, ::testing::make_tuple(m1));<br>
- }<br>
-<br>
- R Invoke(A1 a1) {<br>
- // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
- // by the C++ standard [14.6.4] here, as the base class type is<br>
- // dependent on the template argument (and thus shouldn't be<br>
- // looked into when resolving InvokeWith).<br>
- return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1)));<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2><br>
-class FunctionMocker<R(A1, A2)> : public<br>
- internal::FunctionMockerBase<R(A1, A2)> {<br>
- public:<br>
- typedef R F(A1, A2);<br>
- typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
- MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2) {<br>
- return MockSpec<F>(this, ::testing::make_tuple(m1, m2));<br>
- }<br>
-<br>
- R Invoke(A1 a1, A2 a2) {<br>
- // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
- // by the C++ standard [14.6.4] here, as the base class type is<br>
- // dependent on the template argument (and thus shouldn't be<br>
- // looked into when resolving InvokeWith).<br>
- return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
- internal::forward<A2>(a2)));<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3><br>
-class FunctionMocker<R(A1, A2, A3)> : public<br>
- internal::FunctionMockerBase<R(A1, A2, A3)> {<br>
- public:<br>
- typedef R F(A1, A2, A3);<br>
- typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
- MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
- const Matcher<A3>& m3) {<br>
- return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3));<br>
- }<br>
-<br>
- R Invoke(A1 a1, A2 a2, A3 a3) {<br>
- // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
- // by the C++ standard [14.6.4] here, as the base class type is<br>
- // dependent on the template argument (and thus shouldn't be<br>
- // looked into when resolving InvokeWith).<br>
- return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
- internal::forward<A2>(a2), internal::forward<A3>(a3)));<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4><br>
-class FunctionMocker<R(A1, A2, A3, A4)> : public<br>
- internal::FunctionMockerBase<R(A1, A2, A3, A4)> {<br>
- public:<br>
- typedef R F(A1, A2, A3, A4);<br>
- typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
- MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
- const Matcher<A3>& m3, const Matcher<A4>& m4) {<br>
- return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4));<br>
- }<br>
-<br>
- R Invoke(A1 a1, A2 a2, A3 a3, A4 a4) {<br>
- // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
- // by the C++ standard [14.6.4] here, as the base class type is<br>
- // dependent on the template argument (and thus shouldn't be<br>
- // looked into when resolving InvokeWith).<br>
- return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
- internal::forward<A2>(a2), internal::forward<A3>(a3),<br>
- internal::forward<A4>(a4)));<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5><br>
-class FunctionMocker<R(A1, A2, A3, A4, A5)> : public<br>
- internal::FunctionMockerBase<R(A1, A2, A3, A4, A5)> {<br>
- public:<br>
- typedef R F(A1, A2, A3, A4, A5);<br>
- typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
- MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
- const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5) {<br>
- return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5));<br>
- }<br>
-<br>
- R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {<br>
- // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
- // by the C++ standard [14.6.4] here, as the base class type is<br>
- // dependent on the template argument (and thus shouldn't be<br>
- // looked into when resolving InvokeWith).<br>
- return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
- internal::forward<A2>(a2), internal::forward<A3>(a3),<br>
- internal::forward<A4>(a4), internal::forward<A5>(a5)));<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5, typename A6><br>
-class FunctionMocker<R(A1, A2, A3, A4, A5, A6)> : public<br>
- internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6)> {<br>
- public:<br>
- typedef R F(A1, A2, A3, A4, A5, A6);<br>
- typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
- MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
- const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,<br>
- const Matcher<A6>& m6) {<br>
- return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6));<br>
- }<br>
-<br>
- R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {<br>
- // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
- // by the C++ standard [14.6.4] here, as the base class type is<br>
- // dependent on the template argument (and thus shouldn't be<br>
- // looked into when resolving InvokeWith).<br>
- return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
- internal::forward<A2>(a2), internal::forward<A3>(a3),<br>
- internal::forward<A4>(a4), internal::forward<A5>(a5),<br>
- internal::forward<A6>(a6)));<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5, typename A6, typename A7><br>
-class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7)> : public<br>
- internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7)> {<br>
- public:<br>
- typedef R F(A1, A2, A3, A4, A5, A6, A7);<br>
- typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
- MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
- const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,<br>
- const Matcher<A6>& m6, const Matcher<A7>& m7) {<br>
- return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7));<br>
- }<br>
-<br>
- R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {<br>
- // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
- // by the C++ standard [14.6.4] here, as the base class type is<br>
- // dependent on the template argument (and thus shouldn't be<br>
- // looked into when resolving InvokeWith).<br>
- return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
- internal::forward<A2>(a2), internal::forward<A3>(a3),<br>
- internal::forward<A4>(a4), internal::forward<A5>(a5),<br>
- internal::forward<A6>(a6), internal::forward<A7>(a7)));<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5, typename A6, typename A7, typename A8><br>
-class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8)> : public<br>
- internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8)> {<br>
- public:<br>
- typedef R F(A1, A2, A3, A4, A5, A6, A7, A8);<br>
- typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
- MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
- const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,<br>
- const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8) {<br>
- return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7,<br>
- m8));<br>
- }<br>
-<br>
- R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) {<br>
- // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
- // by the C++ standard [14.6.4] here, as the base class type is<br>
- // dependent on the template argument (and thus shouldn't be<br>
- // looked into when resolving InvokeWith).<br>
- return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
- internal::forward<A2>(a2), internal::forward<A3>(a3),<br>
- internal::forward<A4>(a4), internal::forward<A5>(a5),<br>
- internal::forward<A6>(a6), internal::forward<A7>(a7),<br>
- internal::forward<A8>(a8)));<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5, typename A6, typename A7, typename A8, typename A9><br>
-class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> : public<br>
- internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> {<br>
- public:<br>
- typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9);<br>
- typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
- MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
- const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,<br>
- const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8,<br>
- const Matcher<A9>& m9) {<br>
- return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7,<br>
- m8, m9));<br>
- }<br>
-<br>
- R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) {<br>
- // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
- // by the C++ standard [14.6.4] here, as the base class type is<br>
- // dependent on the template argument (and thus shouldn't be<br>
- // looked into when resolving InvokeWith).<br>
- return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
- internal::forward<A2>(a2), internal::forward<A3>(a3),<br>
- internal::forward<A4>(a4), internal::forward<A5>(a5),<br>
- internal::forward<A6>(a6), internal::forward<A7>(a7),<br>
- internal::forward<A8>(a8), internal::forward<A9>(a9)));<br>
- }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5, typename A6, typename A7, typename A8, typename A9,<br>
- typename A10><br>
-class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> : public<br>
- internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> {<br>
- public:<br>
- typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);<br>
- typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
- MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
- const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,<br>
- const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8,<br>
- const Matcher<A9>& m9, const Matcher<A10>& m10) {<br>
- return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7,<br>
- m8, m9, m10));<br>
- }<br>
-<br>
- R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9,<br>
- A10 a10) {<br>
- // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
- // by the C++ standard [14.6.4] here, as the base class type is<br>
- // dependent on the template argument (and thus shouldn't be<br>
- // looked into when resolving InvokeWith).<br>
- return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
- internal::forward<A2>(a2), internal::forward<A3>(a3),<br>
- internal::forward<A4>(a4), internal::forward<A5>(a5),<br>
- internal::forward<A6>(a6), internal::forward<A7>(a7),<br>
- internal::forward<A8>(a8), internal::forward<A9>(a9),<br>
- internal::forward<A10>(a10)));<br>
- }<br>
-};<br>
-<br>
// Removes the given pointer; this is a helper for the expectation setter method<br>
// for parameterless matchers.<br>
//<br>
@@ -407,7 +123,7 @@ using internal::FunctionMocker;<br>
// The type of argument N of the given function type.<br>
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
#define GMOCK_ARG_(tn, N, ...) \<br>
- tn ::testing::internal::Function<__VA_ARGS__>::Argument##N<br>
+ tn ::testing::internal::Function<__VA_ARGS__>::template Arg<N-1>::type<br>
<br>
// The matcher type for argument N of the given function type.<br>
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
@@ -420,534 +136,467 @@ using internal::FunctionMocker;<br>
GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)<br>
<br>
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD0_(tn, constness, ct, Method, ...) \<br>
- GMOCK_RESULT_(tn, __VA_ARGS__) ct Method() constness { \<br>
- GTEST_COMPILE_ASSERT_( \<br>
- (::testing::tuple_size<tn ::testing::internal::Function< \<br>
- __VA_ARGS__>::ArgumentTuple>::value == 0), \<br>
- this_method_does_not_take_0_arguments); \<br>
- GMOCK_MOCKER_(0, constness, Method).SetOwnerAndName(this, #Method); \<br>
- return GMOCK_MOCKER_(0, constness, Method).Invoke(); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method() constness { \<br>
- GMOCK_MOCKER_(0, constness, Method).RegisterOwner(this); \<br>
- return GMOCK_MOCKER_(0, constness, Method).With(); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- const ::testing::internal::WithoutMatchers&, \<br>
- constness ::testing::internal::Function<__VA_ARGS__>*) const { \<br>
- return ::testing::internal::AdjustConstness_##constness(this) \<br>
- ->gmock_##Method(); \<br>
- } \<br>
+#define GMOCK_METHOD0_(tn, constness, ct, Method, ...) \<br>
+ static_assert(0 == \<br>
+ ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+ "MOCK_METHOD<N> must match argument count.");\<br>
+ GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+ ) constness { \<br>
+ GMOCK_MOCKER_(0, constness, Method).SetOwnerAndName(this, #Method); \<br>
+ return GMOCK_MOCKER_(0, constness, Method).Invoke(); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> \<br>
+ gmock_##Method() constness { \<br>
+ GMOCK_MOCKER_(0, constness, Method).RegisterOwner(this); \<br>
+ return GMOCK_MOCKER_(0, constness, Method).With(); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+ const ::testing::internal::WithoutMatchers&, \<br>
+ constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+ return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+ gmock_##Method(); \<br>
+ } \<br>
mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(0, constness, \<br>
- Method)<br>
+ Method)<br>
<br>
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD1_(tn, constness, ct, Method, ...) \<br>
- GMOCK_RESULT_(tn, __VA_ARGS__) \<br>
- ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1) constness { \<br>
- GTEST_COMPILE_ASSERT_( \<br>
- (::testing::tuple_size<tn ::testing::internal::Function< \<br>
- __VA_ARGS__>::ArgumentTuple>::value == 1), \<br>
- this_method_does_not_take_1_argument); \<br>
- GMOCK_MOCKER_(1, constness, Method).SetOwnerAndName(this, #Method); \<br>
- return GMOCK_MOCKER_(1, constness, Method) \<br>
- .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
- gmock_a1)); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1) constness { \<br>
- GMOCK_MOCKER_(1, constness, Method).RegisterOwner(this); \<br>
- return GMOCK_MOCKER_(1, constness, Method).With(gmock_a1); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- const ::testing::internal::WithoutMatchers&, \<br>
- constness ::testing::internal::Function<__VA_ARGS__>*) const { \<br>
- return ::testing::internal::AdjustConstness_##constness(this) \<br>
- ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>()); \<br>
- } \<br>
- mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(1, constness, \<br>
- Method)<br>
+#define GMOCK_METHOD1_(tn, constness, ct, Method, ...) \<br>
+ static_assert(1 == \<br>
+ ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+ "MOCK_METHOD<N> must match argument count.");\<br>
+ GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+ GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1) constness { \<br>
+ GMOCK_MOCKER_(1, constness, Method).SetOwnerAndName(this, #Method); \<br>
+ return GMOCK_MOCKER_(1, constness, \<br>
+ Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+ __VA_ARGS__)>(gmock_a1)); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> \<br>
+ gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1) constness { \<br>
+ GMOCK_MOCKER_(1, constness, Method).RegisterOwner(this); \<br>
+ return GMOCK_MOCKER_(1, constness, Method).With(gmock_a1); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+ const ::testing::internal::WithoutMatchers&, \<br>
+ constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+ return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+ gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>()); \<br>
+ } \<br>
+ mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(1, constness, \<br>
+ Method)<br>
<br>
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD2_(tn, constness, ct, Method, ...) \<br>
- GMOCK_RESULT_(tn, __VA_ARGS__) \<br>
- ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2) constness { \<br>
- GTEST_COMPILE_ASSERT_( \<br>
- (::testing::tuple_size<tn ::testing::internal::Function< \<br>
- __VA_ARGS__>::ArgumentTuple>::value == 2), \<br>
- this_method_does_not_take_2_arguments); \<br>
- GMOCK_MOCKER_(2, constness, Method).SetOwnerAndName(this, #Method); \<br>
- return GMOCK_MOCKER_(2, constness, Method) \<br>
- .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
- gmock_a1), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
- gmock_a2)); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2) constness { \<br>
- GMOCK_MOCKER_(2, constness, Method).RegisterOwner(this); \<br>
- return GMOCK_MOCKER_(2, constness, Method).With(gmock_a1, gmock_a2); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- const ::testing::internal::WithoutMatchers&, \<br>
- constness ::testing::internal::Function<__VA_ARGS__>*) const { \<br>
- return ::testing::internal::AdjustConstness_##constness(this) \<br>
- ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>()); \<br>
- } \<br>
- mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(2, constness, \<br>
- Method)<br>
+#define GMOCK_METHOD2_(tn, constness, ct, Method, ...) \<br>
+ static_assert(2 == \<br>
+ ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+ "MOCK_METHOD<N> must match argument count.");\<br>
+ GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+ GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+ __VA_ARGS__) gmock_a2) constness { \<br>
+ GMOCK_MOCKER_(2, constness, Method).SetOwnerAndName(this, #Method); \<br>
+ return GMOCK_MOCKER_(2, constness, \<br>
+ Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+ __VA_ARGS__)>(gmock_a1), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2)); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> \<br>
+ gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+ GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2) constness { \<br>
+ GMOCK_MOCKER_(2, constness, Method).RegisterOwner(this); \<br>
+ return GMOCK_MOCKER_(2, constness, Method).With(gmock_a1, gmock_a2); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+ const ::testing::internal::WithoutMatchers&, \<br>
+ constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+ return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+ gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>()); \<br>
+ } \<br>
+ mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(2, constness, \<br>
+ Method)<br>
<br>
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD3_(tn, constness, ct, Method, ...) \<br>
- GMOCK_RESULT_(tn, __VA_ARGS__) \<br>
- ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3) constness { \<br>
- GTEST_COMPILE_ASSERT_( \<br>
- (::testing::tuple_size<tn ::testing::internal::Function< \<br>
- __VA_ARGS__>::ArgumentTuple>::value == 3), \<br>
- this_method_does_not_take_3_arguments); \<br>
- GMOCK_MOCKER_(3, constness, Method).SetOwnerAndName(this, #Method); \<br>
- return GMOCK_MOCKER_(3, constness, Method) \<br>
- .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
- gmock_a1), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
- gmock_a2), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \<br>
- gmock_a3)); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3) constness { \<br>
- GMOCK_MOCKER_(3, constness, Method).RegisterOwner(this); \<br>
- return GMOCK_MOCKER_(3, constness, Method) \<br>
- .With(gmock_a1, gmock_a2, gmock_a3); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- const ::testing::internal::WithoutMatchers&, \<br>
- constness ::testing::internal::Function<__VA_ARGS__>*) const { \<br>
- return ::testing::internal::AdjustConstness_##constness(this) \<br>
- ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>()); \<br>
- } \<br>
- mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(3, constness, \<br>
- Method)<br>
+#define GMOCK_METHOD3_(tn, constness, ct, Method, ...) \<br>
+ static_assert(3 == \<br>
+ ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+ "MOCK_METHOD<N> must match argument count.");\<br>
+ GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+ GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+ __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, \<br>
+ __VA_ARGS__) gmock_a3) constness { \<br>
+ GMOCK_MOCKER_(3, constness, Method).SetOwnerAndName(this, #Method); \<br>
+ return GMOCK_MOCKER_(3, constness, \<br>
+ Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+ __VA_ARGS__)>(gmock_a1), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3)); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> \<br>
+ gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+ GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+ GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3) constness { \<br>
+ GMOCK_MOCKER_(3, constness, Method).RegisterOwner(this); \<br>
+ return GMOCK_MOCKER_(3, constness, Method).With(gmock_a1, gmock_a2, \<br>
+ gmock_a3); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+ const ::testing::internal::WithoutMatchers&, \<br>
+ constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+ return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+ gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>()); \<br>
+ } \<br>
+ mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(3, constness, \<br>
+ Method)<br>
<br>
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD4_(tn, constness, ct, Method, ...) \<br>
- GMOCK_RESULT_(tn, __VA_ARGS__) \<br>
- ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
- GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4) constness { \<br>
- GTEST_COMPILE_ASSERT_( \<br>
- (::testing::tuple_size<tn ::testing::internal::Function< \<br>
- __VA_ARGS__>::ArgumentTuple>::value == 4), \<br>
- this_method_does_not_take_4_arguments); \<br>
- GMOCK_MOCKER_(4, constness, Method).SetOwnerAndName(this, #Method); \<br>
- return GMOCK_MOCKER_(4, constness, Method) \<br>
- .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
- gmock_a1), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
- gmock_a2), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \<br>
- gmock_a3), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \<br>
- gmock_a4)); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
- GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4) constness { \<br>
- GMOCK_MOCKER_(4, constness, Method).RegisterOwner(this); \<br>
- return GMOCK_MOCKER_(4, constness, Method) \<br>
- .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- const ::testing::internal::WithoutMatchers&, \<br>
- constness ::testing::internal::Function<__VA_ARGS__>*) const { \<br>
- return ::testing::internal::AdjustConstness_##constness(this) \<br>
- ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>()); \<br>
- } \<br>
- mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(4, constness, \<br>
- Method)<br>
+#define GMOCK_METHOD4_(tn, constness, ct, Method, ...) \<br>
+ static_assert(4 == \<br>
+ ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+ "MOCK_METHOD<N> must match argument count.");\<br>
+ GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+ GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+ __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+ GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4) constness { \<br>
+ GMOCK_MOCKER_(4, constness, Method).SetOwnerAndName(this, #Method); \<br>
+ return GMOCK_MOCKER_(4, constness, \<br>
+ Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+ __VA_ARGS__)>(gmock_a1), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4)); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> \<br>
+ gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+ GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+ GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+ GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4) constness { \<br>
+ GMOCK_MOCKER_(4, constness, Method).RegisterOwner(this); \<br>
+ return GMOCK_MOCKER_(4, constness, Method).With(gmock_a1, gmock_a2, \<br>
+ gmock_a3, gmock_a4); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+ const ::testing::internal::WithoutMatchers&, \<br>
+ constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+ return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+ gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>()); \<br>
+ } \<br>
+ mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(4, constness, \<br>
+ Method)<br>
<br>
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD5_(tn, constness, ct, Method, ...) \<br>
- GMOCK_RESULT_(tn, __VA_ARGS__) \<br>
- ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
- GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
- GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5) constness { \<br>
- GTEST_COMPILE_ASSERT_( \<br>
- (::testing::tuple_size<tn ::testing::internal::Function< \<br>
- __VA_ARGS__>::ArgumentTuple>::value == 5), \<br>
- this_method_does_not_take_5_arguments); \<br>
- GMOCK_MOCKER_(5, constness, Method).SetOwnerAndName(this, #Method); \<br>
- return GMOCK_MOCKER_(5, constness, Method) \<br>
- .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
- gmock_a1), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
- gmock_a2), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \<br>
- gmock_a3), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \<br>
- gmock_a4), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \<br>
- gmock_a5)); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
- GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
- GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5) constness { \<br>
- GMOCK_MOCKER_(5, constness, Method).RegisterOwner(this); \<br>
- return GMOCK_MOCKER_(5, constness, Method) \<br>
- .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- const ::testing::internal::WithoutMatchers&, \<br>
- constness ::testing::internal::Function<__VA_ARGS__>*) const { \<br>
- return ::testing::internal::AdjustConstness_##constness(this) \<br>
- ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>()); \<br>
- } \<br>
- mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(5, constness, \<br>
- Method)<br>
+#define GMOCK_METHOD5_(tn, constness, ct, Method, ...) \<br>
+ static_assert(5 == \<br>
+ ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+ "MOCK_METHOD<N> must match argument count.");\<br>
+ GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+ GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+ __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+ GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \<br>
+ __VA_ARGS__) gmock_a5) constness { \<br>
+ GMOCK_MOCKER_(5, constness, Method).SetOwnerAndName(this, #Method); \<br>
+ return GMOCK_MOCKER_(5, constness, \<br>
+ Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+ __VA_ARGS__)>(gmock_a1), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5)); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> \<br>
+ gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+ GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+ GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+ GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
+ GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5) constness { \<br>
+ GMOCK_MOCKER_(5, constness, Method).RegisterOwner(this); \<br>
+ return GMOCK_MOCKER_(5, constness, Method).With(gmock_a1, gmock_a2, \<br>
+ gmock_a3, gmock_a4, gmock_a5); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+ const ::testing::internal::WithoutMatchers&, \<br>
+ constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+ return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+ gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>()); \<br>
+ } \<br>
+ mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(5, constness, \<br>
+ Method)<br>
<br>
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD6_(tn, constness, ct, Method, ...) \<br>
- GMOCK_RESULT_(tn, __VA_ARGS__) \<br>
- ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
- GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
- GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
- GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6) constness { \<br>
- GTEST_COMPILE_ASSERT_( \<br>
- (::testing::tuple_size<tn ::testing::internal::Function< \<br>
- __VA_ARGS__>::ArgumentTuple>::value == 6), \<br>
- this_method_does_not_take_6_arguments); \<br>
- GMOCK_MOCKER_(6, constness, Method).SetOwnerAndName(this, #Method); \<br>
- return GMOCK_MOCKER_(6, constness, Method) \<br>
- .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
- gmock_a1), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
- gmock_a2), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \<br>
- gmock_a3), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \<br>
- gmock_a4), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \<br>
- gmock_a5), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \<br>
- gmock_a6)); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
- GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
- GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
- GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6) constness { \<br>
- GMOCK_MOCKER_(6, constness, Method).RegisterOwner(this); \<br>
- return GMOCK_MOCKER_(6, constness, Method) \<br>
- .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- const ::testing::internal::WithoutMatchers&, \<br>
- constness ::testing::internal::Function<__VA_ARGS__>*) const { \<br>
- return ::testing::internal::AdjustConstness_##constness(this) \<br>
- ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>()); \<br>
- } \<br>
- mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(6, constness, \<br>
- Method)<br>
+#define GMOCK_METHOD6_(tn, constness, ct, Method, ...) \<br>
+ static_assert(6 == \<br>
+ ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+ "MOCK_METHOD<N> must match argument count.");\<br>
+ GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+ GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+ __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+ GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \<br>
+ __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, \<br>
+ __VA_ARGS__) gmock_a6) constness { \<br>
+ GMOCK_MOCKER_(6, constness, Method).SetOwnerAndName(this, #Method); \<br>
+ return GMOCK_MOCKER_(6, constness, \<br>
+ Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+ __VA_ARGS__)>(gmock_a1), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6)); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> \<br>
+ gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+ GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+ GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+ GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
+ GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
+ GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6) constness { \<br>
+ GMOCK_MOCKER_(6, constness, Method).RegisterOwner(this); \<br>
+ return GMOCK_MOCKER_(6, constness, Method).With(gmock_a1, gmock_a2, \<br>
+ gmock_a3, gmock_a4, gmock_a5, gmock_a6); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+ const ::testing::internal::WithoutMatchers&, \<br>
+ constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+ return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+ gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>()); \<br>
+ } \<br>
+ mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(6, constness, \<br>
+ Method)<br>
<br>
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD7_(tn, constness, ct, Method, ...) \<br>
- GMOCK_RESULT_(tn, __VA_ARGS__) \<br>
- ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
- GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
- GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
- GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
- GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7) constness { \<br>
- GTEST_COMPILE_ASSERT_( \<br>
- (::testing::tuple_size<tn ::testing::internal::Function< \<br>
- __VA_ARGS__>::ArgumentTuple>::value == 7), \<br>
- this_method_does_not_take_7_arguments); \<br>
- GMOCK_MOCKER_(7, constness, Method).SetOwnerAndName(this, #Method); \<br>
- return GMOCK_MOCKER_(7, constness, Method) \<br>
- .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
- gmock_a1), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
- gmock_a2), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \<br>
- gmock_a3), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \<br>
- gmock_a4), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \<br>
- gmock_a5), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \<br>
- gmock_a6), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \<br>
- gmock_a7)); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
- GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
- GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
- GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
- GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7) constness { \<br>
- GMOCK_MOCKER_(7, constness, Method).RegisterOwner(this); \<br>
- return GMOCK_MOCKER_(7, constness, Method) \<br>
- .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6, \<br>
- gmock_a7); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- const ::testing::internal::WithoutMatchers&, \<br>
- constness ::testing::internal::Function<__VA_ARGS__>*) const { \<br>
- return ::testing::internal::AdjustConstness_##constness(this) \<br>
- ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>()); \<br>
- } \<br>
- mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(7, constness, \<br>
- Method)<br>
+#define GMOCK_METHOD7_(tn, constness, ct, Method, ...) \<br>
+ static_assert(7 == \<br>
+ ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+ "MOCK_METHOD<N> must match argument count.");\<br>
+ GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+ GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+ __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+ GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \<br>
+ __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+ GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7) constness { \<br>
+ GMOCK_MOCKER_(7, constness, Method).SetOwnerAndName(this, #Method); \<br>
+ return GMOCK_MOCKER_(7, constness, \<br>
+ Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+ __VA_ARGS__)>(gmock_a1), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7)); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> \<br>
+ gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+ GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+ GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+ GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
+ GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
+ GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+ GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7) constness { \<br>
+ GMOCK_MOCKER_(7, constness, Method).RegisterOwner(this); \<br>
+ return GMOCK_MOCKER_(7, constness, Method).With(gmock_a1, gmock_a2, \<br>
+ gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+ const ::testing::internal::WithoutMatchers&, \<br>
+ constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+ return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+ gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>()); \<br>
+ } \<br>
+ mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(7, constness, \<br>
+ Method)<br>
<br>
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD8_(tn, constness, ct, Method, ...) \<br>
- GMOCK_RESULT_(tn, __VA_ARGS__) \<br>
- ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
- GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
- GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
- GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
- GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, \<br>
- GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8) constness { \<br>
- GTEST_COMPILE_ASSERT_( \<br>
- (::testing::tuple_size<tn ::testing::internal::Function< \<br>
- __VA_ARGS__>::ArgumentTuple>::value == 8), \<br>
- this_method_does_not_take_8_arguments); \<br>
- GMOCK_MOCKER_(8, constness, Method).SetOwnerAndName(this, #Method); \<br>
- return GMOCK_MOCKER_(8, constness, Method) \<br>
- .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
- gmock_a1), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
- gmock_a2), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \<br>
- gmock_a3), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \<br>
- gmock_a4), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \<br>
- gmock_a5), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \<br>
- gmock_a6), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \<br>
- gmock_a7), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>( \<br>
- gmock_a8)); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
- GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
- GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
- GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
- GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \<br>
- GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8) constness { \<br>
- GMOCK_MOCKER_(8, constness, Method).RegisterOwner(this); \<br>
- return GMOCK_MOCKER_(8, constness, Method) \<br>
- .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6, \<br>
- gmock_a7, gmock_a8); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- const ::testing::internal::WithoutMatchers&, \<br>
- constness ::testing::internal::Function<__VA_ARGS__>*) const { \<br>
- return ::testing::internal::AdjustConstness_##constness(this) \<br>
- ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>()); \<br>
- } \<br>
- mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(8, constness, \<br>
- Method)<br>
+#define GMOCK_METHOD8_(tn, constness, ct, Method, ...) \<br>
+ static_assert(8 == \<br>
+ ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+ "MOCK_METHOD<N> must match argument count.");\<br>
+ GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+ GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+ __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+ GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \<br>
+ __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+ GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, GMOCK_ARG_(tn, 8, \<br>
+ __VA_ARGS__) gmock_a8) constness { \<br>
+ GMOCK_MOCKER_(8, constness, Method).SetOwnerAndName(this, #Method); \<br>
+ return GMOCK_MOCKER_(8, constness, \<br>
+ Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+ __VA_ARGS__)>(gmock_a1), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(gmock_a8)); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> \<br>
+ gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+ GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+ GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+ GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
+ GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
+ GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+ GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \<br>
+ GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8) constness { \<br>
+ GMOCK_MOCKER_(8, constness, Method).RegisterOwner(this); \<br>
+ return GMOCK_MOCKER_(8, constness, Method).With(gmock_a1, gmock_a2, \<br>
+ gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+ const ::testing::internal::WithoutMatchers&, \<br>
+ constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+ return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+ gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>()); \<br>
+ } \<br>
+ mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(8, constness, \<br>
+ Method)<br>
<br>
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD9_(tn, constness, ct, Method, ...) \<br>
- GMOCK_RESULT_(tn, __VA_ARGS__) \<br>
- ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
- GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
- GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
- GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
- GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, \<br>
- GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8, \<br>
- GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9) constness { \<br>
- GTEST_COMPILE_ASSERT_( \<br>
- (::testing::tuple_size<tn ::testing::internal::Function< \<br>
- __VA_ARGS__>::ArgumentTuple>::value == 9), \<br>
- this_method_does_not_take_9_arguments); \<br>
- GMOCK_MOCKER_(9, constness, Method).SetOwnerAndName(this, #Method); \<br>
- return GMOCK_MOCKER_(9, constness, Method) \<br>
- .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
- gmock_a1), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
- gmock_a2), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \<br>
- gmock_a3), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \<br>
- gmock_a4), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \<br>
- gmock_a5), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \<br>
- gmock_a6), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \<br>
- gmock_a7), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>( \<br>
- gmock_a8), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>( \<br>
- gmock_a9)); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
- GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
- GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
- GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
- GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \<br>
- GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \<br>
- GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9) constness { \<br>
- GMOCK_MOCKER_(9, constness, Method).RegisterOwner(this); \<br>
- return GMOCK_MOCKER_(9, constness, Method) \<br>
- .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6, \<br>
- gmock_a7, gmock_a8, gmock_a9); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- const ::testing::internal::WithoutMatchers&, \<br>
- constness ::testing::internal::Function<__VA_ARGS__>*) const { \<br>
- return ::testing::internal::AdjustConstness_##constness(this) \<br>
- ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 9, __VA_ARGS__)>()); \<br>
- } \<br>
- mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(9, constness, \<br>
- Method)<br>
+#define GMOCK_METHOD9_(tn, constness, ct, Method, ...) \<br>
+ static_assert(9 == \<br>
+ ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+ "MOCK_METHOD<N> must match argument count.");\<br>
+ GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+ GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+ __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+ GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \<br>
+ __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+ GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, GMOCK_ARG_(tn, 8, \<br>
+ __VA_ARGS__) gmock_a8, GMOCK_ARG_(tn, 9, \<br>
+ __VA_ARGS__) gmock_a9) constness { \<br>
+ GMOCK_MOCKER_(9, constness, Method).SetOwnerAndName(this, #Method); \<br>
+ return GMOCK_MOCKER_(9, constness, \<br>
+ Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+ __VA_ARGS__)>(gmock_a1), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(gmock_a8), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(gmock_a9)); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> \<br>
+ gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+ GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+ GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+ GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
+ GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
+ GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+ GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \<br>
+ GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \<br>
+ GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9) constness { \<br>
+ GMOCK_MOCKER_(9, constness, Method).RegisterOwner(this); \<br>
+ return GMOCK_MOCKER_(9, constness, Method).With(gmock_a1, gmock_a2, \<br>
+ gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, \<br>
+ gmock_a9); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+ const ::testing::internal::WithoutMatchers&, \<br>
+ constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+ return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+ gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 9, __VA_ARGS__)>()); \<br>
+ } \<br>
+ mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(9, constness, \<br>
+ Method)<br>
<br>
// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD10_(tn, constness, ct, Method, ...) \<br>
- GMOCK_RESULT_(tn, __VA_ARGS__) \<br>
- ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
- GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
- GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
- GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
- GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, \<br>
- GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8, \<br>
- GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9, \<br>
- GMOCK_ARG_(tn, 10, __VA_ARGS__) gmock_a10) constness { \<br>
- GTEST_COMPILE_ASSERT_( \<br>
- (::testing::tuple_size<tn ::testing::internal::Function< \<br>
- __VA_ARGS__>::ArgumentTuple>::value == 10), \<br>
- this_method_does_not_take_10_arguments); \<br>
- GMOCK_MOCKER_(10, constness, Method).SetOwnerAndName(this, #Method); \<br>
- return GMOCK_MOCKER_(10, constness, Method) \<br>
- .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
- gmock_a1), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
- gmock_a2), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \<br>
- gmock_a3), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \<br>
- gmock_a4), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \<br>
- gmock_a5), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \<br>
- gmock_a6), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \<br>
- gmock_a7), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>( \<br>
- gmock_a8), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>( \<br>
- gmock_a9), \<br>
- ::testing::internal::forward<GMOCK_ARG_(tn, 10, __VA_ARGS__)>( \<br>
- gmock_a10)); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
- GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
- GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
- GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
- GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
- GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
- GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \<br>
- GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \<br>
- GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9, \<br>
- GMOCK_MATCHER_(tn, 10, __VA_ARGS__) gmock_a10) constness { \<br>
- GMOCK_MOCKER_(10, constness, Method).RegisterOwner(this); \<br>
- return GMOCK_MOCKER_(10, constness, Method) \<br>
- .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6, \<br>
- gmock_a7, gmock_a8, gmock_a9, gmock_a10); \<br>
- } \<br>
- ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
- const ::testing::internal::WithoutMatchers&, \<br>
- constness ::testing::internal::Function<__VA_ARGS__>*) const { \<br>
- return ::testing::internal::AdjustConstness_##constness(this) \<br>
- ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(), \<br>
- ::testing::A<GMOCK_ARG_(tn, 10, __VA_ARGS__)>()); \<br>
- } \<br>
- mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(10, constness, \<br>
- Method)<br>
+#define GMOCK_METHOD10_(tn, constness, ct, Method, ...) \<br>
+ static_assert(10 == \<br>
+ ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+ "MOCK_METHOD<N> must match argument count.");\<br>
+ GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+ GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+ __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+ GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \<br>
+ __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+ GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, GMOCK_ARG_(tn, 8, \<br>
+ __VA_ARGS__) gmock_a8, GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9, \<br>
+ GMOCK_ARG_(tn, 10, __VA_ARGS__) gmock_a10) constness { \<br>
+ GMOCK_MOCKER_(10, constness, Method).SetOwnerAndName(this, #Method); \<br>
+ return GMOCK_MOCKER_(10, constness, \<br>
+ Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+ __VA_ARGS__)>(gmock_a1), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(gmock_a8), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(gmock_a9), \<br>
+ ::std::forward<GMOCK_ARG_(tn, 10, __VA_ARGS__)>(gmock_a10)); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> \<br>
+ gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+ GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+ GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+ GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
+ GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
+ GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+ GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \<br>
+ GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \<br>
+ GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9, \<br>
+ GMOCK_MATCHER_(tn, 10, \<br>
+ __VA_ARGS__) gmock_a10) constness { \<br>
+ GMOCK_MOCKER_(10, constness, Method).RegisterOwner(this); \<br>
+ return GMOCK_MOCKER_(10, constness, Method).With(gmock_a1, gmock_a2, \<br>
+ gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, gmock_a9, \<br>
+ gmock_a10); \<br>
+ } \<br>
+ ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+ const ::testing::internal::WithoutMatchers&, \<br>
+ constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+ return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+ gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(), \<br>
+ ::testing::A<GMOCK_ARG_(tn, 10, __VA_ARGS__)>()); \<br>
+ } \<br>
+ mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(10, constness, \<br>
+ Method)<br>
<br>
#define MOCK_METHOD0(m, ...) GMOCK_METHOD0_(, , , m, __VA_ARGS__)<br>
#define MOCK_METHOD1(m, ...) GMOCK_METHOD1_(, , , m, __VA_ARGS__)<br>
@@ -1100,283 +749,6 @@ using internal::FunctionMocker;<br>
#define MOCK_CONST_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \<br>
GMOCK_METHOD10_(typename, const, ct, m, __VA_ARGS__)<br>
<br>
-// A MockFunction<F> class has one mock method whose type is F. It is<br>
-// useful when you just want your test code to emit some messages and<br>
-// have Google Mock verify the right messages are sent (and perhaps at<br>
-// the right times). For example, if you are exercising code:<br>
-//<br>
-// Foo(1);<br>
-// Foo(2);<br>
-// Foo(3);<br>
-//<br>
-// and want to verify that Foo(1) and Foo(3) both invoke<br>
-// mock.Bar("a"), but Foo(2) doesn't invoke anything, you can write:<br>
-//<br>
-// TEST(FooTest, InvokesBarCorrectly) {<br>
-// MyMock mock;<br>
-// MockFunction<void(string check_point_name)> check;<br>
-// {<br>
-// InSequence s;<br>
-//<br>
-// EXPECT_CALL(mock, Bar("a"));<br>
-// EXPECT_CALL(check, Call("1"));<br>
-// EXPECT_CALL(check, Call("2"));<br>
-// EXPECT_CALL(mock, Bar("a"));<br>
-// }<br>
-// Foo(1);<br>
-// check.Call("1");<br>
-// Foo(2);<br>
-// check.Call("2");<br>
-// Foo(3);<br>
-// }<br>
-//<br>
-// The expectation spec says that the first Bar("a") must happen<br>
-// before check point "1", the second Bar("a") must happen after check<br>
-// point "2", and nothing should happen between the two check<br>
-// points. The explicit check points make it easy to tell which<br>
-// Bar("a") is called by which call to Foo().<br>
-//<br>
-// MockFunction<F> can also be used to exercise code that accepts<br>
-// std::function<F> callbacks. To do so, use AsStdFunction() method<br>
-// to create std::function proxy forwarding to original object's Call.<br>
-// Example:<br>
-//<br>
-// TEST(FooTest, RunsCallbackWithBarArgument) {<br>
-// MockFunction<int(string)> callback;<br>
-// EXPECT_CALL(callback, Call("bar")).WillOnce(Return(1));<br>
-// Foo(callback.AsStdFunction());<br>
-// }<br>
-template <typename F><br>
-class MockFunction;<br>
-<br>
-template <typename R><br>
-class MockFunction<R()> {<br>
- public:<br>
- MockFunction() {}<br>
-<br>
- MOCK_METHOD0_T(Call, R());<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
- ::std::function<R()> AsStdFunction() {<br>
- return [this]() -> R {<br>
- return this->Call();<br>
- };<br>
- }<br>
-#endif // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0><br>
-class MockFunction<R(A0)> {<br>
- public:<br>
- MockFunction() {}<br>
-<br>
- MOCK_METHOD1_T(Call, R(A0));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
- ::std::function<R(A0)> AsStdFunction() {<br>
- return [this](A0 a0) -> R {<br>
- return this->Call(::std::move(a0));<br>
- };<br>
- }<br>
-#endif // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1><br>
-class MockFunction<R(A0, A1)> {<br>
- public:<br>
- MockFunction() {}<br>
-<br>
- MOCK_METHOD2_T(Call, R(A0, A1));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
- ::std::function<R(A0, A1)> AsStdFunction() {<br>
- return [this](A0 a0, A1 a1) -> R {<br>
- return this->Call(::std::move(a0), ::std::move(a1));<br>
- };<br>
- }<br>
-#endif // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2><br>
-class MockFunction<R(A0, A1, A2)> {<br>
- public:<br>
- MockFunction() {}<br>
-<br>
- MOCK_METHOD3_T(Call, R(A0, A1, A2));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
- ::std::function<R(A0, A1, A2)> AsStdFunction() {<br>
- return [this](A0 a0, A1 a1, A2 a2) -> R {<br>
- return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2));<br>
- };<br>
- }<br>
-#endif // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2, typename A3><br>
-class MockFunction<R(A0, A1, A2, A3)> {<br>
- public:<br>
- MockFunction() {}<br>
-<br>
- MOCK_METHOD4_T(Call, R(A0, A1, A2, A3));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
- ::std::function<R(A0, A1, A2, A3)> AsStdFunction() {<br>
- return [this](A0 a0, A1 a1, A2 a2, A3 a3) -> R {<br>
- return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),<br>
- ::std::move(a3));<br>
- };<br>
- }<br>
-#endif // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2, typename A3,<br>
- typename A4><br>
-class MockFunction<R(A0, A1, A2, A3, A4)> {<br>
- public:<br>
- MockFunction() {}<br>
-<br>
- MOCK_METHOD5_T(Call, R(A0, A1, A2, A3, A4));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
- ::std::function<R(A0, A1, A2, A3, A4)> AsStdFunction() {<br>
- return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) -> R {<br>
- return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),<br>
- ::std::move(a3), ::std::move(a4));<br>
- };<br>
- }<br>
-#endif // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2, typename A3,<br>
- typename A4, typename A5><br>
-class MockFunction<R(A0, A1, A2, A3, A4, A5)> {<br>
- public:<br>
- MockFunction() {}<br>
-<br>
- MOCK_METHOD6_T(Call, R(A0, A1, A2, A3, A4, A5));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
- ::std::function<R(A0, A1, A2, A3, A4, A5)> AsStdFunction() {<br>
- return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) -> R {<br>
- return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),<br>
- ::std::move(a3), ::std::move(a4), ::std::move(a5));<br>
- };<br>
- }<br>
-#endif // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2, typename A3,<br>
- typename A4, typename A5, typename A6><br>
-class MockFunction<R(A0, A1, A2, A3, A4, A5, A6)> {<br>
- public:<br>
- MockFunction() {}<br>
-<br>
- MOCK_METHOD7_T(Call, R(A0, A1, A2, A3, A4, A5, A6));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
- ::std::function<R(A0, A1, A2, A3, A4, A5, A6)> AsStdFunction() {<br>
- return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) -> R {<br>
- return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),<br>
- ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6));<br>
- };<br>
- }<br>
-#endif // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2, typename A3,<br>
- typename A4, typename A5, typename A6, typename A7><br>
-class MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7)> {<br>
- public:<br>
- MockFunction() {}<br>
-<br>
- MOCK_METHOD8_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
- ::std::function<R(A0, A1, A2, A3, A4, A5, A6, A7)> AsStdFunction() {<br>
- return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) -> R {<br>
- return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),<br>
- ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6),<br>
- ::std::move(a7));<br>
- };<br>
- }<br>
-#endif // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2, typename A3,<br>
- typename A4, typename A5, typename A6, typename A7, typename A8><br>
-class MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7, A8)> {<br>
- public:<br>
- MockFunction() {}<br>
-<br>
- MOCK_METHOD9_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
- ::std::function<R(A0, A1, A2, A3, A4, A5, A6, A7, A8)> AsStdFunction() {<br>
- return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7,<br>
- A8 a8) -> R {<br>
- return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),<br>
- ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6),<br>
- ::std::move(a7), ::std::move(a8));<br>
- };<br>
- }<br>
-#endif // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2, typename A3,<br>
- typename A4, typename A5, typename A6, typename A7, typename A8,<br>
- typename A9><br>
-class MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)> {<br>
- public:<br>
- MockFunction() {}<br>
-<br>
- MOCK_METHOD10_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
- ::std::function<R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)> AsStdFunction() {<br>
- return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7,<br>
- A8 a8, A9 a9) -> R {<br>
- return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),<br>
- ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6),<br>
- ::std::move(a7), ::std::move(a8), ::std::move(a9));<br>
- };<br>
- }<br>
-#endif // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
} // namespace testing<br>
<br>
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h<br>
index 94460cbe77819..48ea9358d7c67 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h<br>
@@ -45,1131 +45,10 @@<br>
#include <iterator><br>
#include <sstream><br>
#include <string><br>
+#include <utility><br>
#include <vector><br>
#include "gmock/gmock-matchers.h"<br>
<br>
-namespace testing {<br>
-namespace internal {<br>
-<br>
-// The type of the i-th (0-based) field of Tuple.<br>
-#define GMOCK_FIELD_TYPE_(Tuple, i) \<br>
- typename ::testing::tuple_element<i, Tuple>::type<br>
-<br>
-// TupleFields<Tuple, k0, ..., kn> is for selecting fields from a<br>
-// tuple of type Tuple. It has two members:<br>
-//<br>
-// type: a tuple type whose i-th field is the ki-th field of Tuple.<br>
-// GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple.<br>
-//<br>
-// For example, in class TupleFields<tuple<bool, char, int>, 2, 0>, we have:<br>
-//<br>
-// type is tuple<int, bool>, and<br>
-// GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true).<br>
-<br>
-template <class Tuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,<br>
- int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,<br>
- int k9 = -1><br>
-class TupleFields;<br>
-<br>
-// This generic version is used when there are 10 selectors.<br>
-template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,<br>
- int k7, int k8, int k9><br>
-class TupleFields {<br>
- public:<br>
- typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
- GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),<br>
- GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),<br>
- GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),<br>
- GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8),<br>
- GMOCK_FIELD_TYPE_(Tuple, k9)> type;<br>
- static type GetSelectedFields(const Tuple& t) {<br>
- return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),<br>
- get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t), get<k9>(t));<br>
- }<br>
-};<br>
-<br>
-// The following specialization is used for 0 ~ 9 selectors.<br>
-<br>
-template <class Tuple><br>
-class TupleFields<Tuple, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
- typedef ::testing::tuple<> type;<br>
- static type GetSelectedFields(const Tuple& /* t */) {<br>
- return type();<br>
- }<br>
-};<br>
-<br>
-template <class Tuple, int k0><br>
-class TupleFields<Tuple, k0, -1, -1, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
- typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0)> type;<br>
- static type GetSelectedFields(const Tuple& t) {<br>
- return type(get<k0>(t));<br>
- }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1><br>
-class TupleFields<Tuple, k0, k1, -1, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
- typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
- GMOCK_FIELD_TYPE_(Tuple, k1)> type;<br>
- static type GetSelectedFields(const Tuple& t) {<br>
- return type(get<k0>(t), get<k1>(t));<br>
- }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1, int k2><br>
-class TupleFields<Tuple, k0, k1, k2, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
- typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
- GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2)> type;<br>
- static type GetSelectedFields(const Tuple& t) {<br>
- return type(get<k0>(t), get<k1>(t), get<k2>(t));<br>
- }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1, int k2, int k3><br>
-class TupleFields<Tuple, k0, k1, k2, k3, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
- typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
- GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),<br>
- GMOCK_FIELD_TYPE_(Tuple, k3)> type;<br>
- static type GetSelectedFields(const Tuple& t) {<br>
- return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t));<br>
- }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1, int k2, int k3, int k4><br>
-class TupleFields<Tuple, k0, k1, k2, k3, k4, -1, -1, -1, -1, -1> {<br>
- public:<br>
- typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
- GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),<br>
- GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4)> type;<br>
- static type GetSelectedFields(const Tuple& t) {<br>
- return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t));<br>
- }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5><br>
-class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, -1, -1, -1, -1> {<br>
- public:<br>
- typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
- GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),<br>
- GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),<br>
- GMOCK_FIELD_TYPE_(Tuple, k5)> type;<br>
- static type GetSelectedFields(const Tuple& t) {<br>
- return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),<br>
- get<k5>(t));<br>
- }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6><br>
-class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, -1, -1, -1> {<br>
- public:<br>
- typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
- GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),<br>
- GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),<br>
- GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6)> type;<br>
- static type GetSelectedFields(const Tuple& t) {<br>
- return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),<br>
- get<k5>(t), get<k6>(t));<br>
- }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,<br>
- int k7><br>
-class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, -1, -1> {<br>
- public:<br>
- typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
- GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),<br>
- GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),<br>
- GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),<br>
- GMOCK_FIELD_TYPE_(Tuple, k7)> type;<br>
- static type GetSelectedFields(const Tuple& t) {<br>
- return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),<br>
- get<k5>(t), get<k6>(t), get<k7>(t));<br>
- }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,<br>
- int k7, int k8><br>
-class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, -1> {<br>
- public:<br>
- typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
- GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),<br>
- GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),<br>
- GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),<br>
- GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8)> type;<br>
- static type GetSelectedFields(const Tuple& t) {<br>
- return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),<br>
- get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t));<br>
- }<br>
-};<br>
-<br>
-#undef GMOCK_FIELD_TYPE_<br>
-<br>
-// Implements the Args() matcher.<br>
-template <class ArgsTuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,<br>
- int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,<br>
- int k9 = -1><br>
-class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {<br>
- public:<br>
- // ArgsTuple may have top-level const or reference modifiers.<br>
- typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple;<br>
- typedef typename internal::TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5,<br>
- k6, k7, k8, k9>::type SelectedArgs;<br>
- typedef Matcher<const SelectedArgs&> MonomorphicInnerMatcher;<br>
-<br>
- template <typename InnerMatcher><br>
- explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher)<br>
- : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}<br>
-<br>
- virtual bool MatchAndExplain(ArgsTuple args,<br>
- MatchResultListener* listener) const {<br>
- const SelectedArgs& selected_args = GetSelectedArgs(args);<br>
- if (!listener->IsInterested())<br>
- return inner_matcher_.Matches(selected_args);<br>
-<br>
- PrintIndices(listener->stream());<br>
- *listener << "are " << PrintToString(selected_args);<br>
-<br>
- StringMatchResultListener inner_listener;<br>
- const bool match = inner_matcher_.MatchAndExplain(selected_args,<br>
- &inner_listener);<br>
- PrintIfNotEmpty(inner_listener.str(), listener->stream());<br>
- return match;<br>
- }<br>
-<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
- *os << "are a tuple ";<br>
- PrintIndices(os);<br>
- inner_matcher_.DescribeTo(os);<br>
- }<br>
-<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
- *os << "are a tuple ";<br>
- PrintIndices(os);<br>
- inner_matcher_.DescribeNegationTo(os);<br>
- }<br>
-<br>
- private:<br>
- static SelectedArgs GetSelectedArgs(ArgsTuple args) {<br>
- return TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, k6, k7, k8,<br>
- k9>::GetSelectedFields(args);<br>
- }<br>
-<br>
- // Prints the indices of the selected fields.<br>
- static void PrintIndices(::std::ostream* os) {<br>
- *os << "whose fields (";<br>
- const int indices[10] = { k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 };<br>
- for (int i = 0; i < 10; i++) {<br>
- if (indices[i] < 0)<br>
- break;<br>
-<br>
- if (i >= 1)<br>
- *os << ", ";<br>
-<br>
- *os << "#" << indices[i];<br>
- }<br>
- *os << ") ";<br>
- }<br>
-<br>
- const MonomorphicInnerMatcher inner_matcher_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl);<br>
-};<br>
-<br>
-template <class InnerMatcher, int k0 = -1, int k1 = -1, int k2 = -1,<br>
- int k3 = -1, int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1,<br>
- int k8 = -1, int k9 = -1><br>
-class ArgsMatcher {<br>
- public:<br>
- explicit ArgsMatcher(const InnerMatcher& inner_matcher)<br>
- : inner_matcher_(inner_matcher) {}<br>
-<br>
- template <typename ArgsTuple><br>
- operator Matcher<ArgsTuple>() const {<br>
- return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k0, k1, k2, k3, k4, k5,<br>
- k6, k7, k8, k9>(inner_matcher_));<br>
- }<br>
-<br>
- private:<br>
- const InnerMatcher inner_matcher_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(ArgsMatcher);<br>
-};<br>
-<br>
-// A set of metafunctions for computing the result type of AllOf.<br>
-// AllOf(m1, ..., mN) returns<br>
-// AllOfResultN<decltype(m1), ..., decltype(mN)>::type.<br>
-<br>
-// Although AllOf isn't defined for one argument, AllOfResult1 is defined<br>
-// to simplify the implementation.<br>
-template <typename M1><br>
-struct AllOfResult1 {<br>
- typedef M1 type;<br>
-};<br>
-<br>
-template <typename M1, typename M2><br>
-struct AllOfResult2 {<br>
- typedef BothOfMatcher<<br>
- typename AllOfResult1<M1>::type,<br>
- typename AllOfResult1<M2>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3><br>
-struct AllOfResult3 {<br>
- typedef BothOfMatcher<<br>
- typename AllOfResult1<M1>::type,<br>
- typename AllOfResult2<M2, M3>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4><br>
-struct AllOfResult4 {<br>
- typedef BothOfMatcher<<br>
- typename AllOfResult2<M1, M2>::type,<br>
- typename AllOfResult2<M3, M4>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5><br>
-struct AllOfResult5 {<br>
- typedef BothOfMatcher<<br>
- typename AllOfResult2<M1, M2>::type,<br>
- typename AllOfResult3<M3, M4, M5>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6><br>
-struct AllOfResult6 {<br>
- typedef BothOfMatcher<<br>
- typename AllOfResult3<M1, M2, M3>::type,<br>
- typename AllOfResult3<M4, M5, M6>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7><br>
-struct AllOfResult7 {<br>
- typedef BothOfMatcher<<br>
- typename AllOfResult3<M1, M2, M3>::type,<br>
- typename AllOfResult4<M4, M5, M6, M7>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7, typename M8><br>
-struct AllOfResult8 {<br>
- typedef BothOfMatcher<<br>
- typename AllOfResult4<M1, M2, M3, M4>::type,<br>
- typename AllOfResult4<M5, M6, M7, M8>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7, typename M8, typename M9><br>
-struct AllOfResult9 {<br>
- typedef BothOfMatcher<<br>
- typename AllOfResult4<M1, M2, M3, M4>::type,<br>
- typename AllOfResult5<M5, M6, M7, M8, M9>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7, typename M8, typename M9, typename M10><br>
-struct AllOfResult10 {<br>
- typedef BothOfMatcher<<br>
- typename AllOfResult5<M1, M2, M3, M4, M5>::type,<br>
- typename AllOfResult5<M6, M7, M8, M9, M10>::type<br>
- > type;<br>
-};<br>
-<br>
-// A set of metafunctions for computing the result type of AnyOf.<br>
-// AnyOf(m1, ..., mN) returns<br>
-// AnyOfResultN<decltype(m1), ..., decltype(mN)>::type.<br>
-<br>
-// Although AnyOf isn't defined for one argument, AnyOfResult1 is defined<br>
-// to simplify the implementation.<br>
-template <typename M1><br>
-struct AnyOfResult1 {<br>
- typedef M1 type;<br>
-};<br>
-<br>
-template <typename M1, typename M2><br>
-struct AnyOfResult2 {<br>
- typedef EitherOfMatcher<<br>
- typename AnyOfResult1<M1>::type,<br>
- typename AnyOfResult1<M2>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3><br>
-struct AnyOfResult3 {<br>
- typedef EitherOfMatcher<<br>
- typename AnyOfResult1<M1>::type,<br>
- typename AnyOfResult2<M2, M3>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4><br>
-struct AnyOfResult4 {<br>
- typedef EitherOfMatcher<<br>
- typename AnyOfResult2<M1, M2>::type,<br>
- typename AnyOfResult2<M3, M4>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5><br>
-struct AnyOfResult5 {<br>
- typedef EitherOfMatcher<<br>
- typename AnyOfResult2<M1, M2>::type,<br>
- typename AnyOfResult3<M3, M4, M5>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6><br>
-struct AnyOfResult6 {<br>
- typedef EitherOfMatcher<<br>
- typename AnyOfResult3<M1, M2, M3>::type,<br>
- typename AnyOfResult3<M4, M5, M6>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7><br>
-struct AnyOfResult7 {<br>
- typedef EitherOfMatcher<<br>
- typename AnyOfResult3<M1, M2, M3>::type,<br>
- typename AnyOfResult4<M4, M5, M6, M7>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7, typename M8><br>
-struct AnyOfResult8 {<br>
- typedef EitherOfMatcher<<br>
- typename AnyOfResult4<M1, M2, M3, M4>::type,<br>
- typename AnyOfResult4<M5, M6, M7, M8>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7, typename M8, typename M9><br>
-struct AnyOfResult9 {<br>
- typedef EitherOfMatcher<<br>
- typename AnyOfResult4<M1, M2, M3, M4>::type,<br>
- typename AnyOfResult5<M5, M6, M7, M8, M9>::type<br>
- > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7, typename M8, typename M9, typename M10><br>
-struct AnyOfResult10 {<br>
- typedef EitherOfMatcher<<br>
- typename AnyOfResult5<M1, M2, M3, M4, M5>::type,<br>
- typename AnyOfResult5<M6, M7, M8, M9, M10>::type<br>
- > type;<br>
-};<br>
-<br>
-} // namespace internal<br>
-<br>
-// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected<br>
-// fields of it matches a_matcher. C++ doesn't support default<br>
-// arguments for function templates, so we have to overload it.<br>
-template <typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher><br>
-Args(const InnerMatcher& matcher) {<br>
- return internal::ArgsMatcher<InnerMatcher>(matcher);<br>
-}<br>
-<br>
-template <int k1, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1><br>
-Args(const InnerMatcher& matcher) {<br>
- return internal::ArgsMatcher<InnerMatcher, k1>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2><br>
-Args(const InnerMatcher& matcher) {<br>
- return internal::ArgsMatcher<InnerMatcher, k1, k2>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3><br>
-Args(const InnerMatcher& matcher) {<br>
- return internal::ArgsMatcher<InnerMatcher, k1, k2, k3>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4><br>
-Args(const InnerMatcher& matcher) {<br>
- return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5><br>
-Args(const InnerMatcher& matcher) {<br>
- return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6><br>
-Args(const InnerMatcher& matcher) {<br>
- return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7,<br>
- typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7><br>
-Args(const InnerMatcher& matcher) {<br>
- return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6,<br>
- k7>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,<br>
- typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8><br>
-Args(const InnerMatcher& matcher) {<br>
- return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7,<br>
- k8>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,<br>
- int k9, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9><br>
-Args(const InnerMatcher& matcher) {<br>
- return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,<br>
- k9>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,<br>
- int k9, int k10, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9,<br>
- k10><br>
-Args(const InnerMatcher& matcher) {<br>
- return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,<br>
- k9, k10>(matcher);<br>
-}<br>
-<br>
-// ElementsAre(e_1, e_2, ... e_n) matches an STL-style container with<br>
-// n elements, where the i-th element in the container must<br>
-// match the i-th argument in the list. Each argument of<br>
-// ElementsAre() can be either a value or a matcher. We support up to<br>
-// 10 arguments.<br>
-//<br>
-// The use of DecayArray in the implementation allows ElementsAre()<br>
-// to accept string literals, whose type is const char[N], but we<br>
-// want to treat them as const char*.<br>
-//<br>
-// NOTE: Since ElementsAre() cares about the order of the elements, it<br>
-// must not be used with containers whose elements's order is<br>
-// undefined (e.g. hash_map).<br>
-<br>
-inline internal::ElementsAreMatcher<<br>
- ::testing::tuple<> ><br>
-ElementsAre() {<br>
- typedef ::testing::tuple<> Args;<br>
- return internal::ElementsAreMatcher<Args>(Args());<br>
-}<br>
-<br>
-template <typename T1><br>
-inline internal::ElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type> ><br>
-ElementsAre(const T1& e1) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type> Args;<br>
- return internal::ElementsAreMatcher<Args>(Args(e1));<br>
-}<br>
-<br>
-template <typename T1, typename T2><br>
-inline internal::ElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type> Args;<br>
- return internal::ElementsAreMatcher<Args>(Args(e1, e2));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3><br>
-inline internal::ElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type> Args;<br>
- return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4><br>
-inline internal::ElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type> Args;<br>
- return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5><br>
-inline internal::ElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
- const T5& e5) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type> Args;<br>
- return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6><br>
-inline internal::ElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
- const T5& e5, const T6& e6) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type> Args;<br>
- return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7><br>
-inline internal::ElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
- const T5& e5, const T6& e6, const T7& e7) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type> Args;<br>
- return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8><br>
-inline internal::ElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type,<br>
- typename internal::DecayArray<T8>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
- const T5& e5, const T6& e6, const T7& e7, const T8& e8) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type,<br>
- typename internal::DecayArray<T8>::type> Args;<br>
- return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,<br>
- e8));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9><br>
-inline internal::ElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type,<br>
- typename internal::DecayArray<T8>::type,<br>
- typename internal::DecayArray<T9>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
- const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type,<br>
- typename internal::DecayArray<T8>::type,<br>
- typename internal::DecayArray<T9>::type> Args;<br>
- return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,<br>
- e8, e9));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10><br>
-inline internal::ElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type,<br>
- typename internal::DecayArray<T8>::type,<br>
- typename internal::DecayArray<T9>::type,<br>
- typename internal::DecayArray<T10>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
- const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9,<br>
- const T10& e10) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type,<br>
- typename internal::DecayArray<T8>::type,<br>
- typename internal::DecayArray<T9>::type,<br>
- typename internal::DecayArray<T10>::type> Args;<br>
- return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,<br>
- e8, e9, e10));<br>
-}<br>
-<br>
-// UnorderedElementsAre(e_1, e_2, ..., e_n) is an ElementsAre extension<br>
-// that matches n elements in any order. We support up to n=10 arguments.<br>
-//<br>
-// If you have >10 elements, consider UnorderedElementsAreArray() or<br>
-// UnorderedPointwise() instead.<br>
-<br>
-inline internal::UnorderedElementsAreMatcher<<br>
- ::testing::tuple<> ><br>
-UnorderedElementsAre() {<br>
- typedef ::testing::tuple<> Args;<br>
- return internal::UnorderedElementsAreMatcher<Args>(Args());<br>
-}<br>
-<br>
-template <typename T1><br>
-inline internal::UnorderedElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type> ><br>
-UnorderedElementsAre(const T1& e1) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type> Args;<br>
- return internal::UnorderedElementsAreMatcher<Args>(Args(e1));<br>
-}<br>
-<br>
-template <typename T1, typename T2><br>
-inline internal::UnorderedElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type> Args;<br>
- return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3><br>
-inline internal::UnorderedElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type> Args;<br>
- return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4><br>
-inline internal::UnorderedElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type> Args;<br>
- return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5><br>
-inline internal::UnorderedElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
- const T5& e5) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type> Args;<br>
- return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6><br>
-inline internal::UnorderedElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
- const T5& e5, const T6& e6) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type> Args;<br>
- return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,<br>
- e6));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7><br>
-inline internal::UnorderedElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
- const T5& e5, const T6& e6, const T7& e7) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type> Args;<br>
- return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,<br>
- e6, e7));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8><br>
-inline internal::UnorderedElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type,<br>
- typename internal::DecayArray<T8>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
- const T5& e5, const T6& e6, const T7& e7, const T8& e8) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type,<br>
- typename internal::DecayArray<T8>::type> Args;<br>
- return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,<br>
- e6, e7, e8));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9><br>
-inline internal::UnorderedElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type,<br>
- typename internal::DecayArray<T8>::type,<br>
- typename internal::DecayArray<T9>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
- const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type,<br>
- typename internal::DecayArray<T8>::type,<br>
- typename internal::DecayArray<T9>::type> Args;<br>
- return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,<br>
- e6, e7, e8, e9));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10><br>
-inline internal::UnorderedElementsAreMatcher<<br>
- ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type,<br>
- typename internal::DecayArray<T8>::type,<br>
- typename internal::DecayArray<T9>::type,<br>
- typename internal::DecayArray<T10>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
- const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9,<br>
- const T10& e10) {<br>
- typedef ::testing::tuple<<br>
- typename internal::DecayArray<T1>::type,<br>
- typename internal::DecayArray<T2>::type,<br>
- typename internal::DecayArray<T3>::type,<br>
- typename internal::DecayArray<T4>::type,<br>
- typename internal::DecayArray<T5>::type,<br>
- typename internal::DecayArray<T6>::type,<br>
- typename internal::DecayArray<T7>::type,<br>
- typename internal::DecayArray<T8>::type,<br>
- typename internal::DecayArray<T9>::type,<br>
- typename internal::DecayArray<T10>::type> Args;<br>
- return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,<br>
- e6, e7, e8, e9, e10));<br>
-}<br>
-<br>
-// AllOf(m1, m2, ..., mk) matches any value that matches all of the given<br>
-// sub-matchers. AllOf is called fully qualified to prevent ADL from firing.<br>
-<br>
-template <typename M1, typename M2><br>
-inline typename internal::AllOfResult2<M1, M2>::type<br>
-AllOf(M1 m1, M2 m2) {<br>
- return typename internal::AllOfResult2<M1, M2>::type(<br>
- m1,<br>
- m2);<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3><br>
-inline typename internal::AllOfResult3<M1, M2, M3>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3) {<br>
- return typename internal::AllOfResult3<M1, M2, M3>::type(<br>
- m1,<br>
- ::testing::AllOf(m2, m3));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4><br>
-inline typename internal::AllOfResult4<M1, M2, M3, M4>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3, M4 m4) {<br>
- return typename internal::AllOfResult4<M1, M2, M3, M4>::type(<br>
- ::testing::AllOf(m1, m2),<br>
- ::testing::AllOf(m3, m4));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5><br>
-inline typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {<br>
- return typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type(<br>
- ::testing::AllOf(m1, m2),<br>
- ::testing::AllOf(m3, m4, m5));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6><br>
-inline typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {<br>
- return typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type(<br>
- ::testing::AllOf(m1, m2, m3),<br>
- ::testing::AllOf(m4, m5, m6));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7><br>
-inline typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {<br>
- return typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(<br>
- ::testing::AllOf(m1, m2, m3),<br>
- ::testing::AllOf(m4, m5, m6, m7));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7, typename M8><br>
-inline typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {<br>
- return typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(<br>
- ::testing::AllOf(m1, m2, m3, m4),<br>
- ::testing::AllOf(m5, m6, m7, m8));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7, typename M8, typename M9><br>
-inline typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {<br>
- return typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,<br>
- M9>::type(<br>
- ::testing::AllOf(m1, m2, m3, m4),<br>
- ::testing::AllOf(m5, m6, m7, m8, m9));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7, typename M8, typename M9, typename M10><br>
-inline typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,<br>
- M10>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
- return typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,<br>
- M10>::type(<br>
- ::testing::AllOf(m1, m2, m3, m4, m5),<br>
- ::testing::AllOf(m6, m7, m8, m9, m10));<br>
-}<br>
-<br>
-// AnyOf(m1, m2, ..., mk) matches any value that matches any of the given<br>
-// sub-matchers. AnyOf is called fully qualified to prevent ADL from firing.<br>
-<br>
-template <typename M1, typename M2><br>
-inline typename internal::AnyOfResult2<M1, M2>::type<br>
-AnyOf(M1 m1, M2 m2) {<br>
- return typename internal::AnyOfResult2<M1, M2>::type(<br>
- m1,<br>
- m2);<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3><br>
-inline typename internal::AnyOfResult3<M1, M2, M3>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3) {<br>
- return typename internal::AnyOfResult3<M1, M2, M3>::type(<br>
- m1,<br>
- ::testing::AnyOf(m2, m3));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4><br>
-inline typename internal::AnyOfResult4<M1, M2, M3, M4>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3, M4 m4) {<br>
- return typename internal::AnyOfResult4<M1, M2, M3, M4>::type(<br>
- ::testing::AnyOf(m1, m2),<br>
- ::testing::AnyOf(m3, m4));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5><br>
-inline typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {<br>
- return typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type(<br>
- ::testing::AnyOf(m1, m2),<br>
- ::testing::AnyOf(m3, m4, m5));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6><br>
-inline typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {<br>
- return typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type(<br>
- ::testing::AnyOf(m1, m2, m3),<br>
- ::testing::AnyOf(m4, m5, m6));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7><br>
-inline typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {<br>
- return typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(<br>
- ::testing::AnyOf(m1, m2, m3),<br>
- ::testing::AnyOf(m4, m5, m6, m7));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7, typename M8><br>
-inline typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {<br>
- return typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(<br>
- ::testing::AnyOf(m1, m2, m3, m4),<br>
- ::testing::AnyOf(m5, m6, m7, m8));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7, typename M8, typename M9><br>
-inline typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {<br>
- return typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,<br>
- M9>::type(<br>
- ::testing::AnyOf(m1, m2, m3, m4),<br>
- ::testing::AnyOf(m5, m6, m7, m8, m9));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
- typename M6, typename M7, typename M8, typename M9, typename M10><br>
-inline typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,<br>
- M10>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
- return typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,<br>
- M10>::type(<br>
- ::testing::AnyOf(m1, m2, m3, m4, m5),<br>
- ::testing::AnyOf(m6, m7, m8, m9, m10));<br>
-}<br>
-<br>
-} // namespace testing<br>
-<br>
-<br>
// The MATCHER* family of macros can be used in a namespace scope to<br>
// define custom matchers easily.<br>
//<br>
@@ -1373,18 +252,15 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
// overloading matchers based on parameter types (as opposed to just<br>
// based on the number of parameters).<br>
//<br>
-// MATCHER*() can only be used in a namespace scope. The reason is<br>
-// that C++ doesn't yet allow function-local types to be used to<br>
-// instantiate templates. The up-coming C++0x standard will fix this.<br>
-// Once that's done, we'll consider supporting using MATCHER*() inside<br>
-// a function.<br>
+// MATCHER*() can only be used in a namespace scope as templates cannot be<br>
+// declared inside of a local class.<br>
//<br>
// More Information<br>
// ================<br>
//<br>
// To learn more about using these macros, please search for 'MATCHER'<br>
// on<br>
-// <a href="https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md" rel="noreferrer" target="_blank">https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md</a><br>
+// <a href="https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md" rel="noreferrer" target="_blank">https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md</a><br>
<br>
#define MATCHER(name, description)\<br>
class name##Matcher {\<br>
@@ -1407,12 +283,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
private:\<br>
::std::string FormatDescription(bool negation) const {\<br>
::std::string gmock_description = (description);\<br>
- if (!gmock_description.empty())\<br>
+ if (!gmock_description.empty()) {\<br>
return gmock_description;\<br>
+ }\<br>
return ::testing::internal::FormatMatcherDescription(\<br>
negation, #name, \<br>
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
- ::testing::tuple<>()));\<br>
+ ::std::tuple<>()));\<br>
}\<br>
};\<br>
template <typename arg_type>\<br>
@@ -1442,7 +319,7 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
GTEST_REFERENCE_TO_CONST_(arg_type)> {\<br>
public:\<br>
explicit gmock_Impl(p0##_type gmock_p0)\<br>
- : p0(::testing::internal::move(gmock_p0)) {}\<br>
+ : p0(::std::move(gmock_p0)) {}\<br>
virtual bool MatchAndExplain(\<br>
GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
::testing::MatchResultListener* result_listener) const;\<br>
@@ -1456,12 +333,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
private:\<br>
::std::string FormatDescription(bool negation) const {\<br>
::std::string gmock_description = (description);\<br>
- if (!gmock_description.empty())\<br>
+ if (!gmock_description.empty()) {\<br>
return gmock_description;\<br>
+ }\<br>
return ::testing::internal::FormatMatcherDescription(\<br>
negation, #name, \<br>
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
- ::testing::tuple<p0##_type>(p0)));\<br>
+ ::std::tuple<p0##_type>(p0)));\<br>
}\<br>
};\<br>
template <typename arg_type>\<br>
@@ -1469,8 +347,7 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
return ::testing::Matcher<arg_type>(\<br>
new gmock_Impl<arg_type>(p0));\<br>
}\<br>
- explicit name##MatcherP(p0##_type gmock_p0) : \<br>
- p0(::testing::internal::move(gmock_p0)) {\<br>
+ explicit name##MatcherP(p0##_type gmock_p0) : p0(::std::move(gmock_p0)) {\<br>
}\<br>
p0##_type const p0;\<br>
private:\<br>
@@ -1495,8 +372,7 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
GTEST_REFERENCE_TO_CONST_(arg_type)> {\<br>
public:\<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\<br>
- : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)) {}\<br>
+ : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)) {}\<br>
virtual bool MatchAndExplain(\<br>
GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
::testing::MatchResultListener* result_listener) const;\<br>
@@ -1511,12 +387,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
private:\<br>
::std::string FormatDescription(bool negation) const {\<br>
::std::string gmock_description = (description);\<br>
- if (!gmock_description.empty())\<br>
+ if (!gmock_description.empty()) {\<br>
return gmock_description;\<br>
+ }\<br>
return ::testing::internal::FormatMatcherDescription(\<br>
negation, #name, \<br>
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
- ::testing::tuple<p0##_type, p1##_type>(p0, p1)));\<br>
+ ::std::tuple<p0##_type, p1##_type>(p0, p1)));\<br>
}\<br>
};\<br>
template <typename arg_type>\<br>
@@ -1525,8 +402,8 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
new gmock_Impl<arg_type>(p0, p1));\<br>
}\<br>
name##MatcherP2(p0##_type gmock_p0, \<br>
- p1##_type gmock_p1) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)) {\<br>
+ p1##_type gmock_p1) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)) {\<br>
}\<br>
p0##_type const p0;\<br>
p1##_type const p1;\<br>
@@ -1554,9 +431,8 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
GTEST_REFERENCE_TO_CONST_(arg_type)> {\<br>
public:\<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\<br>
- : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)) {}\<br>
+ : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+ p2(::std::move(gmock_p2)) {}\<br>
virtual bool MatchAndExplain(\<br>
GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
::testing::MatchResultListener* result_listener) const;\<br>
@@ -1572,13 +448,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
private:\<br>
::std::string FormatDescription(bool negation) const {\<br>
::std::string gmock_description = (description);\<br>
- if (!gmock_description.empty())\<br>
+ if (!gmock_description.empty()) {\<br>
return gmock_description;\<br>
+ }\<br>
return ::testing::internal::FormatMatcherDescription(\<br>
negation, #name, \<br>
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
- ::testing::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, \<br>
- p2)));\<br>
+ ::std::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, p2)));\<br>
}\<br>
};\<br>
template <typename arg_type>\<br>
@@ -1587,9 +463,8 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
new gmock_Impl<arg_type>(p0, p1, p2));\<br>
}\<br>
name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
- p2##_type gmock_p2) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)) {\<br>
+ p2##_type gmock_p2) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)) {\<br>
}\<br>
p0##_type const p0;\<br>
p1##_type const p1;\<br>
@@ -1620,10 +495,8 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
public:\<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3)\<br>
- : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)) {}\<br>
+ : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+ p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)) {}\<br>
virtual bool MatchAndExplain(\<br>
GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
::testing::MatchResultListener* result_listener) const;\<br>
@@ -1640,13 +513,14 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
private:\<br>
::std::string FormatDescription(bool negation) const {\<br>
::std::string gmock_description = (description);\<br>
- if (!gmock_description.empty())\<br>
+ if (!gmock_description.empty()) {\<br>
return gmock_description;\<br>
+ }\<br>
return ::testing::internal::FormatMatcherDescription(\<br>
negation, #name, \<br>
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
- ::testing::tuple<p0##_type, p1##_type, p2##_type, \<br>
- p3##_type>(p0, p1, p2, p3)));\<br>
+ ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type>(p0, \<br>
+ p1, p2, p3)));\<br>
}\<br>
};\<br>
template <typename arg_type>\<br>
@@ -1655,11 +529,9 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
new gmock_Impl<arg_type>(p0, p1, p2, p3));\<br>
}\<br>
name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
- p2##_type gmock_p2, \<br>
- p3##_type gmock_p3) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)) {\<br>
+ p2##_type gmock_p2, p3##_type gmock_p3) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+ p3(::std::move(gmock_p3)) {\<br>
}\<br>
p0##_type const p0;\<br>
p1##_type const p1;\<br>
@@ -1695,11 +567,9 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
public:\<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, p4##_type gmock_p4)\<br>
- : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)) {}\<br>
+ : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+ p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \<br>
+ p4(::std::move(gmock_p4)) {}\<br>
virtual bool MatchAndExplain(\<br>
GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
::testing::MatchResultListener* result_listener) const;\<br>
@@ -1717,12 +587,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
private:\<br>
::std::string FormatDescription(bool negation) const {\<br>
::std::string gmock_description = (description);\<br>
- if (!gmock_description.empty())\<br>
+ if (!gmock_description.empty()) {\<br>
return gmock_description;\<br>
+ }\<br>
return ::testing::internal::FormatMatcherDescription(\<br>
negation, #name, \<br>
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
- ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
+ ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
p4##_type>(p0, p1, p2, p3, p4)));\<br>
}\<br>
};\<br>
@@ -1733,11 +604,9 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
}\<br>
name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
p2##_type gmock_p2, p3##_type gmock_p3, \<br>
- p4##_type gmock_p4) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)) {\<br>
+ p4##_type gmock_p4) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+ p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)) {\<br>
}\<br>
p0##_type const p0;\<br>
p1##_type const p1;\<br>
@@ -1774,12 +643,9 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
public:\<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5)\<br>
- : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)), \<br>
- p5(::testing::internal::move(gmock_p5)) {}\<br>
+ : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+ p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \<br>
+ p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)) {}\<br>
virtual bool MatchAndExplain(\<br>
GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
::testing::MatchResultListener* result_listener) const;\<br>
@@ -1798,12 +664,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
private:\<br>
::std::string FormatDescription(bool negation) const {\<br>
::std::string gmock_description = (description);\<br>
- if (!gmock_description.empty())\<br>
+ if (!gmock_description.empty()) {\<br>
return gmock_description;\<br>
+ }\<br>
return ::testing::internal::FormatMatcherDescription(\<br>
negation, #name, \<br>
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
- ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
+ ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\<br>
}\<br>
};\<br>
@@ -1814,12 +681,10 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
}\<br>
name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
- p5##_type gmock_p5) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)), \<br>
- p5(::testing::internal::move(gmock_p5)) {\<br>
+ p5##_type gmock_p5) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+ p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+ p5(::std::move(gmock_p5)) {\<br>
}\<br>
p0##_type const p0;\<br>
p1##_type const p1;\<br>
@@ -1859,13 +724,10 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
p6##_type gmock_p6)\<br>
- : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)), \<br>
- p5(::testing::internal::move(gmock_p5)), \<br>
- p6(::testing::internal::move(gmock_p6)) {}\<br>
+ : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+ p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \<br>
+ p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \<br>
+ p6(::std::move(gmock_p6)) {}\<br>
virtual bool MatchAndExplain(\<br>
GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
::testing::MatchResultListener* result_listener) const;\<br>
@@ -1885,12 +747,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
private:\<br>
::std::string FormatDescription(bool negation) const {\<br>
::std::string gmock_description = (description);\<br>
- if (!gmock_description.empty())\<br>
+ if (!gmock_description.empty()) {\<br>
return gmock_description;\<br>
+ }\<br>
return ::testing::internal::FormatMatcherDescription(\<br>
negation, #name, \<br>
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
- ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
+ ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, \<br>
p6)));\<br>
}\<br>
@@ -1902,14 +765,10 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
}\<br>
name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
- p5##_type gmock_p5, \<br>
- p6##_type gmock_p6) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)), \<br>
- p5(::testing::internal::move(gmock_p5)), \<br>
- p6(::testing::internal::move(gmock_p6)) {\<br>
+ p5##_type gmock_p5, p6##_type gmock_p6) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+ p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+ p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)) {\<br>
}\<br>
p0##_type const p0;\<br>
p1##_type const p1;\<br>
@@ -1953,14 +812,10 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
p6##_type gmock_p6, p7##_type gmock_p7)\<br>
- : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)), \<br>
- p5(::testing::internal::move(gmock_p5)), \<br>
- p6(::testing::internal::move(gmock_p6)), \<br>
- p7(::testing::internal::move(gmock_p7)) {}\<br>
+ : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+ p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \<br>
+ p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \<br>
+ p6(::std::move(gmock_p6)), p7(::std::move(gmock_p7)) {}\<br>
virtual bool MatchAndExplain(\<br>
GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
::testing::MatchResultListener* result_listener) const;\<br>
@@ -1981,12 +836,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
private:\<br>
::std::string FormatDescription(bool negation) const {\<br>
::std::string gmock_description = (description);\<br>
- if (!gmock_description.empty())\<br>
+ if (!gmock_description.empty()) {\<br>
return gmock_description;\<br>
+ }\<br>
return ::testing::internal::FormatMatcherDescription(\<br>
negation, #name, \<br>
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
- ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
+ ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, \<br>
p3, p4, p5, p6, p7)));\<br>
}\<br>
@@ -1999,14 +855,11 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
p5##_type gmock_p5, p6##_type gmock_p6, \<br>
- p7##_type gmock_p7) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)), \<br>
- p5(::testing::internal::move(gmock_p5)), \<br>
- p6(::testing::internal::move(gmock_p6)), \<br>
- p7(::testing::internal::move(gmock_p7)) {\<br>
+ p7##_type gmock_p7) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+ p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+ p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \<br>
+ p7(::std::move(gmock_p7)) {\<br>
}\<br>
p0##_type const p0;\<br>
p1##_type const p1;\<br>
@@ -2053,15 +906,11 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8)\<br>
- : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)), \<br>
- p5(::testing::internal::move(gmock_p5)), \<br>
- p6(::testing::internal::move(gmock_p6)), \<br>
- p7(::testing::internal::move(gmock_p7)), \<br>
- p8(::testing::internal::move(gmock_p8)) {}\<br>
+ : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+ p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \<br>
+ p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \<br>
+ p6(::std::move(gmock_p6)), p7(::std::move(gmock_p7)), \<br>
+ p8(::std::move(gmock_p8)) {}\<br>
virtual bool MatchAndExplain(\<br>
GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
::testing::MatchResultListener* result_listener) const;\<br>
@@ -2083,12 +932,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
private:\<br>
::std::string FormatDescription(bool negation) const {\<br>
::std::string gmock_description = (description);\<br>
- if (!gmock_description.empty())\<br>
+ if (!gmock_description.empty()) {\<br>
return gmock_description;\<br>
+ }\<br>
return ::testing::internal::FormatMatcherDescription(\<br>
negation, #name, \<br>
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
- ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
+ ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
p4##_type, p5##_type, p6##_type, p7##_type, \<br>
p8##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\<br>
}\<br>
@@ -2101,15 +951,11 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \<br>
- p8##_type gmock_p8) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)), \<br>
- p5(::testing::internal::move(gmock_p5)), \<br>
- p6(::testing::internal::move(gmock_p6)), \<br>
- p7(::testing::internal::move(gmock_p7)), \<br>
- p8(::testing::internal::move(gmock_p8)) {\<br>
+ p8##_type gmock_p8) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+ p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+ p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \<br>
+ p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)) {\<br>
}\<br>
p0##_type const p0;\<br>
p1##_type const p1;\<br>
@@ -2160,16 +1006,11 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \<br>
p9##_type gmock_p9)\<br>
- : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)), \<br>
- p5(::testing::internal::move(gmock_p5)), \<br>
- p6(::testing::internal::move(gmock_p6)), \<br>
- p7(::testing::internal::move(gmock_p7)), \<br>
- p8(::testing::internal::move(gmock_p8)), \<br>
- p9(::testing::internal::move(gmock_p9)) {}\<br>
+ : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+ p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \<br>
+ p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \<br>
+ p6(::std::move(gmock_p6)), p7(::std::move(gmock_p7)), \<br>
+ p8(::std::move(gmock_p8)), p9(::std::move(gmock_p9)) {}\<br>
virtual bool MatchAndExplain(\<br>
GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
::testing::MatchResultListener* result_listener) const;\<br>
@@ -2192,12 +1033,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
private:\<br>
::std::string FormatDescription(bool negation) const {\<br>
::std::string gmock_description = (description);\<br>
- if (!gmock_description.empty())\<br>
+ if (!gmock_description.empty()) {\<br>
return gmock_description;\<br>
+ }\<br>
return ::testing::internal::FormatMatcherDescription(\<br>
negation, #name, \<br>
::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
- ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
+ ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \<br>
p9##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\<br>
}\<br>
@@ -2210,17 +1052,12 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \<br>
- p8##_type gmock_p8, \<br>
- p9##_type gmock_p9) : p0(::testing::internal::move(gmock_p0)), \<br>
- p1(::testing::internal::move(gmock_p1)), \<br>
- p2(::testing::internal::move(gmock_p2)), \<br>
- p3(::testing::internal::move(gmock_p3)), \<br>
- p4(::testing::internal::move(gmock_p4)), \<br>
- p5(::testing::internal::move(gmock_p5)), \<br>
- p6(::testing::internal::move(gmock_p6)), \<br>
- p7(::testing::internal::move(gmock_p7)), \<br>
- p8(::testing::internal::move(gmock_p8)), \<br>
- p9(::testing::internal::move(gmock_p9)) {\<br>
+ p8##_type gmock_p8, p9##_type gmock_p9) : p0(::std::move(gmock_p0)), \<br>
+ p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+ p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+ p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \<br>
+ p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)), \<br>
+ p9(::std::move(gmock_p9)) {\<br>
}\<br>
p0##_type const p0;\<br>
p1##_type const p1;\<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-nice-strict.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-nice-strict.h<br>
deleted file mode 100644<br>
index fe3ee69cef925..0000000000000<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-nice-strict.h<br>
+++ /dev/null<br>
@@ -1,461 +0,0 @@<br>
-// This file was GENERATED by command:<br>
-// pump.py gmock-generated-nice-strict.h.pump<br>
-// DO NOT EDIT BY HAND!!!<br>
-<br>
-// Copyright 2008, Google Inc.<br>
-// All rights reserved.<br>
-//<br>
-// Redistribution and use in source and binary forms, with or without<br>
-// modification, are permitted provided that the following conditions are<br>
-// met:<br>
-//<br>
-// * Redistributions of source code must retain the above copyright<br>
-// notice, this list of conditions and the following disclaimer.<br>
-// * Redistributions in binary form must reproduce the above<br>
-// copyright notice, this list of conditions and the following disclaimer<br>
-// in the documentation and/or other materials provided with the<br>
-// distribution.<br>
-// * Neither the name of Google Inc. nor the names of its<br>
-// contributors may be used to endorse or promote products derived from<br>
-// this software without specific prior written permission.<br>
-//<br>
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
-<br>
-<br>
-// Implements class templates NiceMock, NaggyMock, and StrictMock.<br>
-//<br>
-// Given a mock class MockFoo that is created using Google Mock,<br>
-// NiceMock<MockFoo> is a subclass of MockFoo that allows<br>
-// uninteresting calls (i.e. calls to mock methods that have no<br>
-// EXPECT_CALL specs), NaggyMock<MockFoo> is a subclass of MockFoo<br>
-// that prints a warning when an uninteresting call occurs, and<br>
-// StrictMock<MockFoo> is a subclass of MockFoo that treats all<br>
-// uninteresting calls as errors.<br>
-//<br>
-// Currently a mock is naggy by default, so MockFoo and<br>
-// NaggyMock<MockFoo> behave like the same. However, we will soon<br>
-// switch the default behavior of mocks to be nice, as that in general<br>
-// leads to more maintainable tests. When that happens, MockFoo will<br>
-// stop behaving like NaggyMock<MockFoo> and start behaving like<br>
-// NiceMock<MockFoo>.<br>
-//<br>
-// NiceMock, NaggyMock, and StrictMock "inherit" the constructors of<br>
-// their respective base class. Therefore you can write<br>
-// NiceMock<MockFoo>(5, "a") to construct a nice mock where MockFoo<br>
-// has a constructor that accepts (int, const char*), for example.<br>
-//<br>
-// A known limitation is that NiceMock<MockFoo>, NaggyMock<MockFoo>,<br>
-// and StrictMock<MockFoo> only works for mock methods defined using<br>
-// the MOCK_METHOD* family of macros DIRECTLY in the MockFoo class.<br>
-// If a mock method is defined in a base class of MockFoo, the "nice"<br>
-// or "strict" modifier may not affect it, depending on the compiler.<br>
-// In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT<br>
-// supported.<br>
-<br>
-// GOOGLETEST_CM0002 DO NOT DELETE<br>
-<br>
-// IWYU pragma: private, include "gmock/gmock.h"<br>
-<br>
-#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_<br>
-#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_<br>
-<br>
-#include "gmock/gmock-spec-builders.h"<br>
-#include "gmock/internal/gmock-port.h"<br>
-<br>
-namespace testing {<br>
-<br>
-template <class MockClass><br>
-class NiceMock : public MockClass {<br>
- public:<br>
- NiceMock() : MockClass() {<br>
- ::testing::Mock::AllowUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
-#if GTEST_LANG_CXX11<br>
- // Ideally, we would inherit base class's constructors through a using<br>
- // declaration, which would preserve their visibility. However, many existing<br>
- // tests rely on the fact that current implementation reexports protected<br>
- // constructors as public. These tests would need to be cleaned up first.<br>
-<br>
- // Single argument constructor is special-cased so that it can be<br>
- // made explicit.<br>
- template <typename A><br>
- explicit NiceMock(A&& arg) : MockClass(std::forward<A>(arg)) {<br>
- ::testing::Mock::AllowUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename... An><br>
- NiceMock(A1&& arg1, A2&& arg2, An&&... args)<br>
- : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),<br>
- std::forward<An>(args)...) {<br>
- ::testing::Mock::AllowUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-#else<br>
- // C++98 doesn't have variadic templates, so we have to define one<br>
- // for each arity.<br>
- template <typename A1><br>
- explicit NiceMock(const A1& a1) : MockClass(a1) {<br>
- ::testing::Mock::AllowUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
- template <typename A1, typename A2><br>
- NiceMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {<br>
- ::testing::Mock::AllowUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3><br>
- NiceMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {<br>
- ::testing::Mock::AllowUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4><br>
- NiceMock(const A1& a1, const A2& a2, const A3& a3,<br>
- const A4& a4) : MockClass(a1, a2, a3, a4) {<br>
- ::testing::Mock::AllowUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5><br>
- NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5) : MockClass(a1, a2, a3, a4, a5) {<br>
- ::testing::Mock::AllowUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6><br>
- NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {<br>
- ::testing::Mock::AllowUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7><br>
- NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5,<br>
- a6, a7) {<br>
- ::testing::Mock::AllowUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7, typename A8><br>
- NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1,<br>
- a2, a3, a4, a5, a6, a7, a8) {<br>
- ::testing::Mock::AllowUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7, typename A8, typename A9><br>
- NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5, const A6& a6, const A7& a7, const A8& a8,<br>
- const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {<br>
- ::testing::Mock::AllowUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7, typename A8, typename A9, typename A10><br>
- NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9,<br>
- const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {<br>
- ::testing::Mock::AllowUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
-#endif // GTEST_LANG_CXX11<br>
-<br>
- ~NiceMock() {<br>
- ::testing::Mock::UnregisterCallReaction(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(NiceMock);<br>
-};<br>
-<br>
-template <class MockClass><br>
-class NaggyMock : public MockClass {<br>
- public:<br>
- NaggyMock() : MockClass() {<br>
- ::testing::Mock::WarnUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
-#if GTEST_LANG_CXX11<br>
- // Ideally, we would inherit base class's constructors through a using<br>
- // declaration, which would preserve their visibility. However, many existing<br>
- // tests rely on the fact that current implementation reexports protected<br>
- // constructors as public. These tests would need to be cleaned up first.<br>
-<br>
- // Single argument constructor is special-cased so that it can be<br>
- // made explicit.<br>
- template <typename A><br>
- explicit NaggyMock(A&& arg) : MockClass(std::forward<A>(arg)) {<br>
- ::testing::Mock::WarnUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename... An><br>
- NaggyMock(A1&& arg1, A2&& arg2, An&&... args)<br>
- : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),<br>
- std::forward<An>(args)...) {<br>
- ::testing::Mock::WarnUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-#else<br>
- // C++98 doesn't have variadic templates, so we have to define one<br>
- // for each arity.<br>
- template <typename A1><br>
- explicit NaggyMock(const A1& a1) : MockClass(a1) {<br>
- ::testing::Mock::WarnUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
- template <typename A1, typename A2><br>
- NaggyMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {<br>
- ::testing::Mock::WarnUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3><br>
- NaggyMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {<br>
- ::testing::Mock::WarnUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4><br>
- NaggyMock(const A1& a1, const A2& a2, const A3& a3,<br>
- const A4& a4) : MockClass(a1, a2, a3, a4) {<br>
- ::testing::Mock::WarnUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5><br>
- NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5) : MockClass(a1, a2, a3, a4, a5) {<br>
- ::testing::Mock::WarnUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6><br>
- NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {<br>
- ::testing::Mock::WarnUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7><br>
- NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5,<br>
- a6, a7) {<br>
- ::testing::Mock::WarnUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7, typename A8><br>
- NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1,<br>
- a2, a3, a4, a5, a6, a7, a8) {<br>
- ::testing::Mock::WarnUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7, typename A8, typename A9><br>
- NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5, const A6& a6, const A7& a7, const A8& a8,<br>
- const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {<br>
- ::testing::Mock::WarnUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7, typename A8, typename A9, typename A10><br>
- NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9,<br>
- const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {<br>
- ::testing::Mock::WarnUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
-#endif // GTEST_LANG_CXX11<br>
-<br>
- ~NaggyMock() {<br>
- ::testing::Mock::UnregisterCallReaction(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(NaggyMock);<br>
-};<br>
-<br>
-template <class MockClass><br>
-class StrictMock : public MockClass {<br>
- public:<br>
- StrictMock() : MockClass() {<br>
- ::testing::Mock::FailUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
-#if GTEST_LANG_CXX11<br>
- // Ideally, we would inherit base class's constructors through a using<br>
- // declaration, which would preserve their visibility. However, many existing<br>
- // tests rely on the fact that current implementation reexports protected<br>
- // constructors as public. These tests would need to be cleaned up first.<br>
-<br>
- // Single argument constructor is special-cased so that it can be<br>
- // made explicit.<br>
- template <typename A><br>
- explicit StrictMock(A&& arg) : MockClass(std::forward<A>(arg)) {<br>
- ::testing::Mock::FailUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename... An><br>
- StrictMock(A1&& arg1, A2&& arg2, An&&... args)<br>
- : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),<br>
- std::forward<An>(args)...) {<br>
- ::testing::Mock::FailUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-#else<br>
- // C++98 doesn't have variadic templates, so we have to define one<br>
- // for each arity.<br>
- template <typename A1><br>
- explicit StrictMock(const A1& a1) : MockClass(a1) {<br>
- ::testing::Mock::FailUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
- template <typename A1, typename A2><br>
- StrictMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {<br>
- ::testing::Mock::FailUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3><br>
- StrictMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {<br>
- ::testing::Mock::FailUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4><br>
- StrictMock(const A1& a1, const A2& a2, const A3& a3,<br>
- const A4& a4) : MockClass(a1, a2, a3, a4) {<br>
- ::testing::Mock::FailUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5><br>
- StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5) : MockClass(a1, a2, a3, a4, a5) {<br>
- ::testing::Mock::FailUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6><br>
- StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {<br>
- ::testing::Mock::FailUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7><br>
- StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5,<br>
- a6, a7) {<br>
- ::testing::Mock::FailUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7, typename A8><br>
- StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1,<br>
- a2, a3, a4, a5, a6, a7, a8) {<br>
- ::testing::Mock::FailUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7, typename A8, typename A9><br>
- StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5, const A6& a6, const A7& a7, const A8& a8,<br>
- const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {<br>
- ::testing::Mock::FailUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7, typename A8, typename A9, typename A10><br>
- StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
- const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9,<br>
- const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {<br>
- ::testing::Mock::FailUninterestingCalls(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
-#endif // GTEST_LANG_CXX11<br>
-<br>
- ~StrictMock() {<br>
- ::testing::Mock::UnregisterCallReaction(<br>
- internal::ImplicitCast_<MockClass*>(this));<br>
- }<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(StrictMock);<br>
-};<br>
-<br>
-// The following specializations catch some (relatively more common)<br>
-// user errors of nesting nice and strict mocks. They do NOT catch<br>
-// all possible errors.<br>
-<br>
-// These specializations are declared but not defined, as NiceMock,<br>
-// NaggyMock, and StrictMock cannot be nested.<br>
-<br>
-template <typename MockClass><br>
-class NiceMock<NiceMock<MockClass> >;<br>
-template <typename MockClass><br>
-class NiceMock<NaggyMock<MockClass> >;<br>
-template <typename MockClass><br>
-class NiceMock<StrictMock<MockClass> >;<br>
-<br>
-template <typename MockClass><br>
-class NaggyMock<NiceMock<MockClass> >;<br>
-template <typename MockClass><br>
-class NaggyMock<NaggyMock<MockClass> >;<br>
-template <typename MockClass><br>
-class NaggyMock<StrictMock<MockClass> >;<br>
-<br>
-template <typename MockClass><br>
-class StrictMock<NiceMock<MockClass> >;<br>
-template <typename MockClass><br>
-class StrictMock<NaggyMock<MockClass> >;<br>
-template <typename MockClass><br>
-class StrictMock<StrictMock<MockClass> >;<br>
-<br>
-} // namespace testing<br>
-<br>
-#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-matchers.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-matchers.h<br>
index 92a77fc2c11ed..8c604cf14f150 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-matchers.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-matchers.h<br>
@@ -33,6 +33,9 @@<br>
// This file implements some commonly used argument matchers. More<br>
// matchers can be defined by the user implementing the<br>
// MatcherInterface<T> interface if necessary.<br>
+//<br>
+// See googletest/include/gtest/gtest-matchers.h for the definition of class<br>
+// Matcher, class MatcherInterface, and others.<br>
<br>
// GOOGLETEST_CM0002 DO NOT DELETE<br>
<br>
@@ -43,21 +46,32 @@<br>
<br>
#include <math.h><br>
#include <algorithm><br>
+#include <initializer_list><br>
#include <iterator><br>
#include <limits><br>
+#include <memory><br>
#include <ostream> // NOLINT<br>
#include <sstream><br>
#include <string><br>
+#include <type_traits><br>
#include <utility><br>
#include <vector><br>
-#include "gtest/gtest.h"<br>
#include "gmock/internal/gmock-internal-utils.h"<br>
#include "gmock/internal/gmock-port.h"<br>
+#include "gtest/gtest.h"<br>
<br>
-#if GTEST_HAS_STD_INITIALIZER_LIST_<br>
-# include <initializer_list> // NOLINT -- must be after gtest.h<br>
+// MSVC warning C5046 is new as of VS2017 version 15.8.<br>
+#if defined(_MSC_VER) && _MSC_VER >= 1915<br>
+#define GMOCK_MAYBE_5046_ 5046<br>
+#else<br>
+#define GMOCK_MAYBE_5046_<br>
#endif<br>
<br>
+GTEST_DISABLE_MSC_WARNINGS_PUSH_(<br>
+ 4251 GMOCK_MAYBE_5046_ /* class A needs to have dll-interface to be used by<br>
+ clients of class B */<br>
+ /* Symbol involving type with internal linkage not defined */)<br>
+<br>
#ifdef __clang__<br>
#if __has_warning("-Wdeprecated-copy")<br>
#pragma clang diagnostic push<br>
@@ -65,11 +79,6 @@<br>
#endif<br>
#endif<br>
<br>
-GTEST_DISABLE_MSC_WARNINGS_PUSH_(<br>
- 4251 5046 /* class A needs to have dll-interface to be used by clients of<br>
- class B */<br>
- /* Symbol involving type with internal linkage not defined */)<br>
-<br>
namespace testing {<br>
<br>
// To implement a matcher Foo for type T, define:<br>
@@ -84,145 +93,6 @@ namespace testing {<br>
// ownership management as Matcher objects can now be copied like<br>
// plain values.<br>
<br>
-// MatchResultListener is an abstract class. Its << operator can be<br>
-// used by a matcher to explain why a value matches or doesn't match.<br>
-//<br>
-// FIXME: add method<br>
-// bool InterestedInWhy(bool result) const;<br>
-// to indicate whether the listener is interested in why the match<br>
-// result is 'result'.<br>
-class MatchResultListener {<br>
- public:<br>
- // Creates a listener object with the given underlying ostream. The<br>
- // listener does not own the ostream, and does not dereference it<br>
- // in the constructor or destructor.<br>
- explicit MatchResultListener(::std::ostream* os) : stream_(os) {}<br>
- virtual ~MatchResultListener() = 0; // Makes this class abstract.<br>
-<br>
- // Streams x to the underlying ostream; does nothing if the ostream<br>
- // is NULL.<br>
- template <typename T><br>
- MatchResultListener& operator<<(const T& x) {<br>
- if (stream_ != NULL)<br>
- *stream_ << x;<br>
- return *this;<br>
- }<br>
-<br>
- // Returns the underlying ostream.<br>
- ::std::ostream* stream() { return stream_; }<br>
-<br>
- // Returns true iff the listener is interested in an explanation of<br>
- // the match result. A matcher's MatchAndExplain() method can use<br>
- // this information to avoid generating the explanation when no one<br>
- // intends to hear it.<br>
- bool IsInterested() const { return stream_ != NULL; }<br>
-<br>
- private:<br>
- ::std::ostream* const stream_;<br>
-<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener);<br>
-};<br>
-<br>
-inline MatchResultListener::~MatchResultListener() {<br>
-}<br>
-<br>
-// An instance of a subclass of this knows how to describe itself as a<br>
-// matcher.<br>
-class MatcherDescriberInterface {<br>
- public:<br>
- virtual ~MatcherDescriberInterface() {}<br>
-<br>
- // Describes this matcher to an ostream. The function should print<br>
- // a verb phrase that describes the property a value matching this<br>
- // matcher should have. The subject of the verb phrase is the value<br>
- // being matched. For example, the DescribeTo() method of the Gt(7)<br>
- // matcher prints "is greater than 7".<br>
- virtual void DescribeTo(::std::ostream* os) const = 0;<br>
-<br>
- // Describes the negation of this matcher to an ostream. For<br>
- // example, if the description of this matcher is "is greater than<br>
- // 7", the negated description could be "is not greater than 7".<br>
- // You are not required to override this when implementing<br>
- // MatcherInterface, but it is highly advised so that your matcher<br>
- // can produce good error messages.<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
- *os << "not (";<br>
- DescribeTo(os);<br>
- *os << ")";<br>
- }<br>
-};<br>
-<br>
-// The implementation of a matcher.<br>
-template <typename T><br>
-class MatcherInterface : public MatcherDescriberInterface {<br>
- public:<br>
- // Returns true iff the matcher matches x; also explains the match<br>
- // result to 'listener' if necessary (see the next paragraph), in<br>
- // the form of a non-restrictive relative clause ("which ...",<br>
- // "whose ...", etc) that describes x. For example, the<br>
- // MatchAndExplain() method of the Pointee(...) matcher should<br>
- // generate an explanation like "which points to ...".<br>
- //<br>
- // Implementations of MatchAndExplain() should add an explanation of<br>
- // the match result *if and only if* they can provide additional<br>
- // information that's not already present (or not obvious) in the<br>
- // print-out of x and the matcher's description. Whether the match<br>
- // succeeds is not a factor in deciding whether an explanation is<br>
- // needed, as sometimes the caller needs to print a failure message<br>
- // when the match succeeds (e.g. when the matcher is used inside<br>
- // Not()).<br>
- //<br>
- // For example, a "has at least 10 elements" matcher should explain<br>
- // what the actual element count is, regardless of the match result,<br>
- // as it is useful information to the reader; on the other hand, an<br>
- // "is empty" matcher probably only needs to explain what the actual<br>
- // size is when the match fails, as it's redundant to say that the<br>
- // size is 0 when the value is already known to be empty.<br>
- //<br>
- // You should override this method when defining a new matcher.<br>
- //<br>
- // It's the responsibility of the caller (Google Mock) to guarantee<br>
- // that 'listener' is not NULL. This helps to simplify a matcher's<br>
- // implementation when it doesn't care about the performance, as it<br>
- // can talk to 'listener' without checking its validity first.<br>
- // However, in order to implement dummy listeners efficiently,<br>
- // listener->stream() may be NULL.<br>
- virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0;<br>
-<br>
- // Inherits these methods from MatcherDescriberInterface:<br>
- // virtual void DescribeTo(::std::ostream* os) const = 0;<br>
- // virtual void DescribeNegationTo(::std::ostream* os) const;<br>
-};<br>
-<br>
-namespace internal {<br>
-<br>
-// Converts a MatcherInterface<T> to a MatcherInterface<const T&>.<br>
-template <typename T><br>
-class MatcherInterfaceAdapter : public MatcherInterface<const T&> {<br>
- public:<br>
- explicit MatcherInterfaceAdapter(const MatcherInterface<T>* impl)<br>
- : impl_(impl) {}<br>
- virtual ~MatcherInterfaceAdapter() { delete impl_; }<br>
-<br>
- virtual void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); }<br>
-<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
- impl_->DescribeNegationTo(os);<br>
- }<br>
-<br>
- virtual bool MatchAndExplain(const T& x,<br>
- MatchResultListener* listener) const {<br>
- return impl_->MatchAndExplain(x, listener);<br>
- }<br>
-<br>
- private:<br>
- const MatcherInterface<T>* const impl_;<br>
-<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(MatcherInterfaceAdapter);<br>
-};<br>
-<br>
-} // namespace internal<br>
-<br>
// A match result listener that stores the explanation in a string.<br>
class StringMatchResultListener : public MatchResultListener {<br>
public:<br>
@@ -240,409 +110,6 @@ class StringMatchResultListener : public MatchResultListener {<br>
GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener);<br>
};<br>
<br>
-namespace internal {<br>
-<br>
-struct AnyEq {<br>
- template <typename A, typename B><br>
- bool operator()(const A& a, const B& b) const { return a == b; }<br>
-};<br>
-struct AnyNe {<br>
- template <typename A, typename B><br>
- bool operator()(const A& a, const B& b) const { return a != b; }<br>
-};<br>
-struct AnyLt {<br>
- template <typename A, typename B><br>
- bool operator()(const A& a, const B& b) const { return a < b; }<br>
-};<br>
-struct AnyGt {<br>
- template <typename A, typename B><br>
- bool operator()(const A& a, const B& b) const { return a > b; }<br>
-};<br>
-struct AnyLe {<br>
- template <typename A, typename B><br>
- bool operator()(const A& a, const B& b) const { return a <= b; }<br>
-};<br>
-struct AnyGe {<br>
- template <typename A, typename B><br>
- bool operator()(const A& a, const B& b) const { return a >= b; }<br>
-};<br>
-<br>
-// A match result listener that ignores the explanation.<br>
-class DummyMatchResultListener : public MatchResultListener {<br>
- public:<br>
- DummyMatchResultListener() : MatchResultListener(NULL) {}<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener);<br>
-};<br>
-<br>
-// A match result listener that forwards the explanation to a given<br>
-// ostream. The <br>
diff erence between this and MatchResultListener is<br>
-// that the former is concrete.<br>
-class StreamMatchResultListener : public MatchResultListener {<br>
- public:<br>
- explicit StreamMatchResultListener(::std::ostream* os)<br>
- : MatchResultListener(os) {}<br>
-<br>
- private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener);<br>
-};<br>
-<br>
-// An internal class for implementing Matcher<T>, which will derive<br>
-// from it. We put functionalities common to all Matcher<T><br>
-// specializations here to avoid code duplication.<br>
-template <typename T><br>
-class MatcherBase {<br>
- public:<br>
- // Returns true iff the matcher matches x; also explains the match<br>
- // result to 'listener'.<br>
- bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x,<br>
- MatchResultListener* listener) const {<br>
- return impl_->MatchAndExplain(x, listener);<br>
- }<br>
-<br>
- // Returns true iff this matcher matches x.<br>
- bool Matches(GTEST_REFERENCE_TO_CONST_(T) x) const {<br>
- DummyMatchResultListener dummy;<br>
- return MatchAndExplain(x, &dummy);<br>
- }<br>
-<br>
- // Describes this matcher to an ostream.<br>
- void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); }<br>
-<br>
- // Describes the negation of this matcher to an ostream.<br>
- void DescribeNegationTo(::std::ostream* os) const {<br>
- impl_->DescribeNegationTo(os);<br>
- }<br>
-<br>
- // Explains why x matches, or doesn't match, the matcher.<br>
- void ExplainMatchResultTo(GTEST_REFERENCE_TO_CONST_(T) x,<br>
- ::std::ostream* os) const {<br>
- StreamMatchResultListener listener(os);<br>
- MatchAndExplain(x, &listener);<br>
- }<br>
-<br>
- // Returns the describer for this matcher object; retains ownership<br>
- // of the describer, which is only guaranteed to be alive when<br>
- // this matcher object is alive.<br>
- const MatcherDescriberInterface* GetDescriber() const {<br>
- return impl_.get();<br>
- }<br>
-<br>
- protected:<br>
- MatcherBase() {}<br>
-<br>
- // Constructs a matcher from its implementation.<br>
- explicit MatcherBase(<br>
- const MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)>* impl)<br>
- : impl_(impl) {}<br>
-<br>
- template <typename U><br>
- explicit MatcherBase(<br>
- const MatcherInterface<U>* impl,<br>
- typename internal::EnableIf<<br>
- !internal::IsSame<U, GTEST_REFERENCE_TO_CONST_(U)>::value>::type* =<br>
- NULL)<br>
- : impl_(new internal::MatcherInterfaceAdapter<U>(impl)) {}<br>
-<br>
- virtual ~MatcherBase() {}<br>
-<br>
- private:<br>
- // shared_ptr (util/gtl/shared_ptr.h) and linked_ptr have similar<br>
- // interfaces. The former dynamically allocates a chunk of memory<br>
- // to hold the reference count, while the latter tracks all<br>
- // references using a circular linked list without allocating<br>
- // memory. It has been observed that linked_ptr performs better in<br>
- // typical scenarios. However, shared_ptr can out-perform<br>
- // linked_ptr when there are many more uses of the copy constructor<br>
- // than the default constructor.<br>
- //<br>
- // If performance becomes a problem, we should see if using<br>
- // shared_ptr helps.<br>
- ::testing::internal::linked_ptr<<br>
- const MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> ><br>
- impl_;<br>
-};<br>
-<br>
-} // namespace internal<br>
-<br>
-// A Matcher<T> is a copyable and IMMUTABLE (except by assignment)<br>
-// object that can check whether a value of type T matches. The<br>
-// implementation of Matcher<T> is just a linked_ptr to const<br>
-// MatcherInterface<T>, so copying is fairly cheap. Don't inherit<br>
-// from Matcher!<br>
-template <typename T><br>
-class Matcher : public internal::MatcherBase<T> {<br>
- public:<br>
- // Constructs a null matcher. Needed for storing Matcher objects in STL<br>
- // containers. A default-constructed matcher is not yet initialized. You<br>
- // cannot use it until a valid value has been assigned to it.<br>
- explicit Matcher() {} // NOLINT<br>
-<br>
- // Constructs a matcher from its implementation.<br>
- explicit Matcher(const MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)>* impl)<br>
- : internal::MatcherBase<T>(impl) {}<br>
-<br>
- template <typename U><br>
- explicit Matcher(const MatcherInterface<U>* impl,<br>
- typename internal::EnableIf<!internal::IsSame<<br>
- U, GTEST_REFERENCE_TO_CONST_(U)>::value>::type* = NULL)<br>
- : internal::MatcherBase<T>(impl) {}<br>
-<br>
- // Implicit constructor here allows people to write<br>
- // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes<br>
- Matcher(T value); // NOLINT<br>
-};<br>
-<br>
-// The following two specializations allow the user to write str<br>
-// instead of Eq(str) and "foo" instead of Eq("foo") when a std::string<br>
-// matcher is expected.<br>
-template <><br>
-class GTEST_API_ Matcher<const std::string&><br>
- : public internal::MatcherBase<const std::string&> {<br>
- public:<br>
- Matcher() {}<br>
-<br>
- explicit Matcher(const MatcherInterface<const std::string&>* impl)<br>
- : internal::MatcherBase<const std::string&>(impl) {}<br>
-<br>
- // Allows the user to write str instead of Eq(str) sometimes, where<br>
- // str is a std::string object.<br>
- Matcher(const std::string& s); // NOLINT<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
- // Allows the user to write str instead of Eq(str) sometimes, where<br>
- // str is a ::string object.<br>
- Matcher(const ::string& s); // NOLINT<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
- // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
- Matcher(const char* s); // NOLINT<br>
-};<br>
-<br>
-template <><br>
-class GTEST_API_ Matcher<std::string><br>
- : public internal::MatcherBase<std::string> {<br>
- public:<br>
- Matcher() {}<br>
-<br>
- explicit Matcher(const MatcherInterface<const std::string&>* impl)<br>
- : internal::MatcherBase<std::string>(impl) {}<br>
- explicit Matcher(const MatcherInterface<std::string>* impl)<br>
- : internal::MatcherBase<std::string>(impl) {}<br>
-<br>
- // Allows the user to write str instead of Eq(str) sometimes, where<br>
- // str is a string object.<br>
- Matcher(const std::string& s); // NOLINT<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
- // Allows the user to write str instead of Eq(str) sometimes, where<br>
- // str is a ::string object.<br>
- Matcher(const ::string& s); // NOLINT<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
- // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
- Matcher(const char* s); // NOLINT<br>
-};<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-// The following two specializations allow the user to write str<br>
-// instead of Eq(str) and "foo" instead of Eq("foo") when a ::string<br>
-// matcher is expected.<br>
-template <><br>
-class GTEST_API_ Matcher<const ::string&><br>
- : public internal::MatcherBase<const ::string&> {<br>
- public:<br>
- Matcher() {}<br>
-<br>
- explicit Matcher(const MatcherInterface<const ::string&>* impl)<br>
- : internal::MatcherBase<const ::string&>(impl) {}<br>
-<br>
- // Allows the user to write str instead of Eq(str) sometimes, where<br>
- // str is a std::string object.<br>
- Matcher(const std::string& s); // NOLINT<br>
-<br>
- // Allows the user to write str instead of Eq(str) sometimes, where<br>
- // str is a ::string object.<br>
- Matcher(const ::string& s); // NOLINT<br>
-<br>
- // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
- Matcher(const char* s); // NOLINT<br>
-};<br>
-<br>
-template <><br>
-class GTEST_API_ Matcher< ::string><br>
- : public internal::MatcherBase< ::string> {<br>
- public:<br>
- Matcher() {}<br>
-<br>
- explicit Matcher(const MatcherInterface<const ::string&>* impl)<br>
- : internal::MatcherBase< ::string>(impl) {}<br>
- explicit Matcher(const MatcherInterface< ::string>* impl)<br>
- : internal::MatcherBase< ::string>(impl) {}<br>
-<br>
- // Allows the user to write str instead of Eq(str) sometimes, where<br>
- // str is a std::string object.<br>
- Matcher(const std::string& s); // NOLINT<br>
-<br>
- // Allows the user to write str instead of Eq(str) sometimes, where<br>
- // str is a ::string object.<br>
- Matcher(const ::string& s); // NOLINT<br>
-<br>
- // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
- Matcher(const char* s); // NOLINT<br>
-};<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-#if GTEST_HAS_ABSL<br>
-// The following two specializations allow the user to write str<br>
-// instead of Eq(str) and "foo" instead of Eq("foo") when a absl::string_view<br>
-// matcher is expected.<br>
-template <><br>
-class GTEST_API_ Matcher<const absl::string_view&><br>
- : public internal::MatcherBase<const absl::string_view&> {<br>
- public:<br>
- Matcher() {}<br>
-<br>
- explicit Matcher(const MatcherInterface<const absl::string_view&>* impl)<br>
- : internal::MatcherBase<const absl::string_view&>(impl) {}<br>
-<br>
- // Allows the user to write str instead of Eq(str) sometimes, where<br>
- // str is a std::string object.<br>
- Matcher(const std::string& s); // NOLINT<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
- // Allows the user to write str instead of Eq(str) sometimes, where<br>
- // str is a ::string object.<br>
- Matcher(const ::string& s); // NOLINT<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
- // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
- Matcher(const char* s); // NOLINT<br>
-<br>
- // Allows the user to pass absl::string_views directly.<br>
- Matcher(absl::string_view s); // NOLINT<br>
-};<br>
-<br>
-template <><br>
-class GTEST_API_ Matcher<absl::string_view><br>
- : public internal::MatcherBase<absl::string_view> {<br>
- public:<br>
- Matcher() {}<br>
-<br>
- explicit Matcher(const MatcherInterface<const absl::string_view&>* impl)<br>
- : internal::MatcherBase<absl::string_view>(impl) {}<br>
- explicit Matcher(const MatcherInterface<absl::string_view>* impl)<br>
- : internal::MatcherBase<absl::string_view>(impl) {}<br>
-<br>
- // Allows the user to write str instead of Eq(str) sometimes, where<br>
- // str is a std::string object.<br>
- Matcher(const std::string& s); // NOLINT<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
- // Allows the user to write str instead of Eq(str) sometimes, where<br>
- // str is a ::string object.<br>
- Matcher(const ::string& s); // NOLINT<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
- // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
- Matcher(const char* s); // NOLINT<br>
-<br>
- // Allows the user to pass absl::string_views directly.<br>
- Matcher(absl::string_view s); // NOLINT<br>
-};<br>
-#endif // GTEST_HAS_ABSL<br>
-<br>
-// Prints a matcher in a human-readable format.<br>
-template <typename T><br>
-std::ostream& operator<<(std::ostream& os, const Matcher<T>& matcher) {<br>
- matcher.DescribeTo(&os);<br>
- return os;<br>
-}<br>
-<br>
-// The PolymorphicMatcher class template makes it easy to implement a<br>
-// polymorphic matcher (i.e. a matcher that can match values of more<br>
-// than one type, e.g. Eq(n) and NotNull()).<br>
-//<br>
-// To define a polymorphic matcher, a user should provide an Impl<br>
-// class that has a DescribeTo() method and a DescribeNegationTo()<br>
-// method, and define a member function (or member function template)<br>
-//<br>
-// bool MatchAndExplain(const Value& value,<br>
-// MatchResultListener* listener) const;<br>
-//<br>
-// See the definition of NotNull() for a complete example.<br>
-template <class Impl><br>
-class PolymorphicMatcher {<br>
- public:<br>
- explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {}<br>
-<br>
- // Returns a mutable reference to the underlying matcher<br>
- // implementation object.<br>
- Impl& mutable_impl() { return impl_; }<br>
-<br>
- // Returns an immutable reference to the underlying matcher<br>
- // implementation object.<br>
- const Impl& impl() const { return impl_; }<br>
-<br>
- template <typename T><br>
- operator Matcher<T>() const {<br>
- return Matcher<T>(new MonomorphicImpl<GTEST_REFERENCE_TO_CONST_(T)>(impl_));<br>
- }<br>
-<br>
- private:<br>
- template <typename T><br>
- class MonomorphicImpl : public MatcherInterface<T> {<br>
- public:<br>
- explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}<br>
-<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
- impl_.DescribeTo(os);<br>
- }<br>
-<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
- impl_.DescribeNegationTo(os);<br>
- }<br>
-<br>
- virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {<br>
- return impl_.MatchAndExplain(x, listener);<br>
- }<br>
-<br>
- private:<br>
- const Impl impl_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(MonomorphicImpl);<br>
- };<br>
-<br>
- Impl impl_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(PolymorphicMatcher);<br>
-};<br>
-<br>
-// Creates a matcher from its implementation. This is easier to use<br>
-// than the Matcher<T> constructor as it doesn't require you to<br>
-// explicitly write the template argument, e.g.<br>
-//<br>
-// MakeMatcher(foo);<br>
-// vs<br>
-// Matcher<const string&>(foo);<br>
-template <typename T><br>
-inline Matcher<T> MakeMatcher(const MatcherInterface<T>* impl) {<br>
- return Matcher<T>(impl);<br>
-}<br>
-<br>
-// Creates a polymorphic matcher from its implementation. This is<br>
-// easier to use than the PolymorphicMatcher<Impl> constructor as it<br>
-// doesn't require you to explicitly write the template argument, e.g.<br>
-//<br>
-// MakePolymorphicMatcher(foo);<br>
-// vs<br>
-// PolymorphicMatcher<TypeOfFoo>(foo);<br>
-template <class Impl><br>
-inline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) {<br>
- return PolymorphicMatcher<Impl>(impl);<br>
-}<br>
-<br>
// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION<br>
// and MUST NOT BE USED IN USER CODE!!!<br>
namespace internal {<br>
@@ -674,19 +141,16 @@ class MatcherCastImpl {<br>
// polymorphic_matcher_or_value to Matcher<T> because it won't trigger<br>
// a user-defined conversion from M to T if one exists (assuming M is<br>
// a value).<br>
- return CastImpl(<br>
- polymorphic_matcher_or_value,<br>
- BooleanConstant<<br>
- internal::ImplicitlyConvertible<M, Matcher<T> >::value>(),<br>
- BooleanConstant<<br>
- internal::ImplicitlyConvertible<M, T>::value>());<br>
+ return CastImpl(polymorphic_matcher_or_value,<br>
+ std::is_convertible<M, Matcher<T>>{},<br>
+ std::is_convertible<M, T>{});<br>
}<br>
<br>
private:<br>
template <bool Ignore><br>
static Matcher<T> CastImpl(const M& polymorphic_matcher_or_value,<br>
- BooleanConstant<true> /* convertible_to_matcher */,<br>
- BooleanConstant<Ignore>) {<br>
+ std::true_type /* convertible_to_matcher */,<br>
+ bool_constant<Ignore>) {<br>
// M is implicitly convertible to Matcher<T>, which means that either<br>
// M is a polymorphic matcher or Matcher<T> has an implicit constructor<br>
// from M. In both cases using the implicit conversion will produce a<br>
@@ -701,9 +165,9 @@ class MatcherCastImpl {<br>
// M can't be implicitly converted to Matcher<T>, so M isn't a polymorphic<br>
// matcher. It's a value of a type implicitly convertible to T. Use direct<br>
// initialization to create a matcher.<br>
- static Matcher<T> CastImpl(<br>
- const M& value, BooleanConstant<false> /* convertible_to_matcher */,<br>
- BooleanConstant<true> /* convertible_to_T */) {<br>
+ static Matcher<T> CastImpl(const M& value,<br>
+ std::false_type /* convertible_to_matcher */,<br>
+ std::true_type /* convertible_to_T */) {<br>
return Matcher<T>(ImplicitCast_<T>(value));<br>
}<br>
<br>
@@ -717,9 +181,9 @@ class MatcherCastImpl {<br>
// (e.g. std::pair<const int, int> vs. std::pair<int, int>).<br>
//<br>
// We don't define this method inline as we need the declaration of Eq().<br>
- static Matcher<T> CastImpl(<br>
- const M& value, BooleanConstant<false> /* convertible_to_matcher */,<br>
- BooleanConstant<false> /* convertible_to_T */);<br>
+ static Matcher<T> CastImpl(const M& value,<br>
+ std::false_type /* convertible_to_matcher */,<br>
+ std::false_type /* convertible_to_T */);<br>
};<br>
<br>
// This more specialized version is used when MatcherCast()'s argument<br>
@@ -739,8 +203,7 @@ class MatcherCastImpl<T, Matcher<U> > {<br>
: source_matcher_(source_matcher) {}<br>
<br>
// We delegate the matching logic to the source matcher.<br>
- virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {<br>
-#if GTEST_LANG_CXX11<br>
+ bool MatchAndExplain(T x, MatchResultListener* listener) const override {<br>
using FromType = typename std::remove_cv<typename std::remove_pointer<<br>
typename std::remove_reference<T>::type>::type>::type;<br>
using ToType = typename std::remove_cv<typename std::remove_pointer<<br>
@@ -754,16 +217,15 @@ class MatcherCastImpl<T, Matcher<U> > {<br>
std::is_same<FromType, ToType>::value ||<br>
!std::is_base_of<FromType, ToType>::value,<br>
"Can't implicitly convert from <base> to <derived>");<br>
-#endif // GTEST_LANG_CXX11<br>
<br>
return source_matcher_.MatchAndExplain(static_cast<U>(x), listener);<br>
}<br>
<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
source_matcher_.DescribeTo(os);<br>
}<br>
<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
source_matcher_.DescribeNegationTo(os);<br>
}<br>
<br>
@@ -795,11 +257,8 @@ inline Matcher<T> MatcherCast(const M& matcher) {<br>
<br>
// Implements SafeMatcherCast().<br>
//<br>
-// We use an intermediate class to do the actual safe casting as Nokia's<br>
-// Symbian compiler cannot decide between<br>
-// template <T, M> ... (M) and<br>
-// template <T, U> ... (const Matcher<U>&)<br>
-// for function templates but can for member function templates.<br>
+// FIXME: The intermediate SafeMatcherCastImpl class was introduced as a<br>
+// workaround for a compiler bug, and can now be removed.<br>
template <typename T><br>
class SafeMatcherCastImpl {<br>
public:<br>
@@ -822,12 +281,12 @@ class SafeMatcherCastImpl {<br>
template <typename U><br>
static inline Matcher<T> Cast(const Matcher<U>& matcher) {<br>
// Enforce that T can be implicitly converted to U.<br>
- GTEST_COMPILE_ASSERT_((internal::ImplicitlyConvertible<T, U>::value),<br>
- T_must_be_implicitly_convertible_to_U);<br>
+ GTEST_COMPILE_ASSERT_((std::is_convertible<T, U>::value),<br>
+ "T must be implicitly convertible to U");<br>
// Enforce that we are not converting a non-reference type T to a reference<br>
// type U.<br>
GTEST_COMPILE_ASSERT_(<br>
- internal::is_reference<T>::value || !internal::is_reference<U>::value,<br>
+ std::is_reference<T>::value || !std::is_reference<U>::value,<br>
cannot_convert_non_reference_arg_to_reference);<br>
// In case both T and U are arithmetic types, enforce that the<br>
// conversion is not lossy.<br>
@@ -859,7 +318,7 @@ namespace internal {<br>
// If the explanation is not empty, prints it to the ostream.<br>
inline void PrintIfNotEmpty(const std::string& explanation,<br>
::std::ostream* os) {<br>
- if (explanation != "" && os != NULL) {<br>
+ if (explanation != "" && os != nullptr) {<br>
*os << ", " << explanation;<br>
}<br>
}<br>
@@ -908,13 +367,13 @@ template <size_t N><br>
class TuplePrefix {<br>
public:<br>
// TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true<br>
- // iff the first N fields of matcher_tuple matches the first N<br>
- // fields of value_tuple, respectively.<br>
+ // if and only if the first N fields of matcher_tuple matches<br>
+ // the first N fields of value_tuple, respectively.<br>
template <typename MatcherTuple, typename ValueTuple><br>
static bool Matches(const MatcherTuple& matcher_tuple,<br>
const ValueTuple& value_tuple) {<br>
- return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple)<br>
- && get<N - 1>(matcher_tuple).Matches(get<N - 1>(value_tuple));<br>
+ return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple) &&<br>
+ std::get<N - 1>(matcher_tuple).Matches(std::get<N - 1>(value_tuple));<br>
}<br>
<br>
// TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os)<br>
@@ -930,16 +389,14 @@ class TuplePrefix {<br>
<br>
// Then describes the failure (if any) in the (N - 1)-th (0-based)<br>
// field.<br>
- typename tuple_element<N - 1, MatcherTuple>::type matcher =<br>
- get<N - 1>(matchers);<br>
- typedef typename tuple_element<N - 1, ValueTuple>::type Value;<br>
- GTEST_REFERENCE_TO_CONST_(Value) value = get<N - 1>(values);<br>
+ typename std::tuple_element<N - 1, MatcherTuple>::type matcher =<br>
+ std::get<N - 1>(matchers);<br>
+ typedef typename std::tuple_element<N - 1, ValueTuple>::type Value;<br>
+ const Value& value = std::get<N - 1>(values);<br>
StringMatchResultListener listener;<br>
if (!matcher.MatchAndExplain(value, &listener)) {<br>
- // FIXME: include in the message the name of the parameter<br>
- // as used in MOCK_METHOD*() when possible.<br>
*os << " Expected arg #" << N - 1 << ": ";<br>
- get<N - 1>(matchers).DescribeTo(os);<br>
+ std::get<N - 1>(matchers).DescribeTo(os);<br>
*os << "\n Actual: ";<br>
// We remove the reference in type Value to prevent the<br>
// universal printer from printing the address of value, which<br>
@@ -969,8 +426,8 @@ class TuplePrefix<0> {<br>
::std::ostream* /* os */) {}<br>
};<br>
<br>
-// TupleMatches(matcher_tuple, value_tuple) returns true iff all<br>
-// matchers in matcher_tuple match the corresponding fields in<br>
+// TupleMatches(matcher_tuple, value_tuple) returns true if and only if<br>
+// all matchers in matcher_tuple match the corresponding fields in<br>
// value_tuple. It is a compiler error if matcher_tuple and<br>
// value_tuple have <br>
diff erent number of fields or incompatible field<br>
// types.<br>
@@ -979,11 +436,11 @@ bool TupleMatches(const MatcherTuple& matcher_tuple,<br>
const ValueTuple& value_tuple) {<br>
// Makes sure that matcher_tuple and value_tuple have the same<br>
// number of fields.<br>
- GTEST_COMPILE_ASSERT_(tuple_size<MatcherTuple>::value ==<br>
- tuple_size<ValueTuple>::value,<br>
+ GTEST_COMPILE_ASSERT_(std::tuple_size<MatcherTuple>::value ==<br>
+ std::tuple_size<ValueTuple>::value,<br>
matcher_and_value_have_<br>
diff erent_numbers_of_fields);<br>
- return TuplePrefix<tuple_size<ValueTuple>::value>::<br>
- Matches(matcher_tuple, value_tuple);<br>
+ return TuplePrefix<std::tuple_size<ValueTuple>::value>::Matches(matcher_tuple,<br>
+ value_tuple);<br>
}<br>
<br>
// Describes failures in matching matchers against values. If there<br>
@@ -992,7 +449,7 @@ template <typename MatcherTuple, typename ValueTuple><br>
void ExplainMatchFailureTupleTo(const MatcherTuple& matchers,<br>
const ValueTuple& values,<br>
::std::ostream* os) {<br>
- TuplePrefix<tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo(<br>
+ TuplePrefix<std::tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo(<br>
matchers, values, os);<br>
}<br>
<br>
@@ -1003,7 +460,7 @@ void ExplainMatchFailureTupleTo(const MatcherTuple& matchers,<br>
template <typename Tuple, typename Func, typename OutIter><br>
class TransformTupleValuesHelper {<br>
private:<br>
- typedef ::testing::tuple_size<Tuple> TupleSize;<br>
+ typedef ::std::tuple_size<Tuple> TupleSize;<br>
<br>
public:<br>
// For each member of tuple 't', taken in order, evaluates '*out++ = f(t)'.<br>
@@ -1016,7 +473,7 @@ class TransformTupleValuesHelper {<br>
template <typename Tup, size_t kRemainingSize><br>
struct IterateOverTuple {<br>
OutIter operator() (Func f, const Tup& t, OutIter out) const {<br>
- *out++ = f(::testing::get<TupleSize::value - kRemainingSize>(t));<br>
+ *out++ = f(::std::get<TupleSize::value - kRemainingSize>(t));<br>
return IterateOverTuple<Tup, kRemainingSize - 1>()(f, t, out);<br>
}<br>
};<br>
@@ -1038,14 +495,14 @@ OutIter TransformTupleValues(Func f, const Tuple& t, OutIter out) {<br>
<br>
// Implements A<T>().<br>
template <typename T><br>
-class AnyMatcherImpl : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {<br>
+class AnyMatcherImpl : public MatcherInterface<const T&> {<br>
public:<br>
- virtual bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) /* x */,<br>
- MatchResultListener* /* listener */) const {<br>
+ bool MatchAndExplain(const T& /* x */,<br>
+ MatchResultListener* /* listener */) const override {<br>
return true;<br>
}<br>
- virtual void DescribeTo(::std::ostream* os) const { *os << "is anything"; }<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override { *os << "is anything"; }<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
// This is mostly for completeness' safe, as it's not very useful<br>
// to write Not(A<bool>()). However we cannot completely rule out<br>
// such a possibility, and it doesn't hurt to be prepared.<br>
@@ -1063,99 +520,6 @@ class AnythingMatcher {<br>
operator Matcher<T>() const { return A<T>(); }<br>
};<br>
<br>
-// Implements a matcher that compares a given value with a<br>
-// pre-supplied value using one of the ==, <=, <, etc, operators. The<br>
-// two values being compared don't have to have the same type.<br>
-//<br>
-// The matcher defined here is polymorphic (for example, Eq(5) can be<br>
-// used to match an int, a short, a double, etc). Therefore we use<br>
-// a template type conversion operator in the implementation.<br>
-//<br>
-// The following template definition assumes that the Rhs parameter is<br>
-// a "bare" type (i.e. neither 'const T' nor 'T&').<br>
-template <typename D, typename Rhs, typename Op><br>
-class ComparisonBase {<br>
- public:<br>
- explicit ComparisonBase(const Rhs& rhs) : rhs_(rhs) {}<br>
- template <typename Lhs><br>
- operator Matcher<Lhs>() const {<br>
- return MakeMatcher(new Impl<Lhs>(rhs_));<br>
- }<br>
-<br>
- private:<br>
- template <typename Lhs><br>
- class Impl : public MatcherInterface<Lhs> {<br>
- public:<br>
- explicit Impl(const Rhs& rhs) : rhs_(rhs) {}<br>
- virtual bool MatchAndExplain(<br>
- Lhs lhs, MatchResultListener* /* listener */) const {<br>
- return Op()(lhs, rhs_);<br>
- }<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
- *os << D::Desc() << " ";<br>
- UniversalPrint(rhs_, os);<br>
- }<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
- *os << D::NegatedDesc() << " ";<br>
- UniversalPrint(rhs_, os);<br>
- }<br>
- private:<br>
- Rhs rhs_;<br>
- GTEST_DISALLOW_ASSIGN_(Impl);<br>
- };<br>
- Rhs rhs_;<br>
- GTEST_DISALLOW_ASSIGN_(ComparisonBase);<br>
-};<br>
-<br>
-template <typename Rhs><br>
-class EqMatcher : public ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq> {<br>
- public:<br>
- explicit EqMatcher(const Rhs& rhs)<br>
- : ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq>(rhs) { }<br>
- static const char* Desc() { return "is equal to"; }<br>
- static const char* NegatedDesc() { return "isn't equal to"; }<br>
-};<br>
-template <typename Rhs><br>
-class NeMatcher : public ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe> {<br>
- public:<br>
- explicit NeMatcher(const Rhs& rhs)<br>
- : ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe>(rhs) { }<br>
- static const char* Desc() { return "isn't equal to"; }<br>
- static const char* NegatedDesc() { return "is equal to"; }<br>
-};<br>
-template <typename Rhs><br>
-class LtMatcher : public ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt> {<br>
- public:<br>
- explicit LtMatcher(const Rhs& rhs)<br>
- : ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt>(rhs) { }<br>
- static const char* Desc() { return "is <"; }<br>
- static const char* NegatedDesc() { return "isn't <"; }<br>
-};<br>
-template <typename Rhs><br>
-class GtMatcher : public ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt> {<br>
- public:<br>
- explicit GtMatcher(const Rhs& rhs)<br>
- : ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt>(rhs) { }<br>
- static const char* Desc() { return "is >"; }<br>
- static const char* NegatedDesc() { return "isn't >"; }<br>
-};<br>
-template <typename Rhs><br>
-class LeMatcher : public ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe> {<br>
- public:<br>
- explicit LeMatcher(const Rhs& rhs)<br>
- : ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe>(rhs) { }<br>
- static const char* Desc() { return "is <="; }<br>
- static const char* NegatedDesc() { return "isn't <="; }<br>
-};<br>
-template <typename Rhs><br>
-class GeMatcher : public ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe> {<br>
- public:<br>
- explicit GeMatcher(const Rhs& rhs)<br>
- : ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe>(rhs) { }<br>
- static const char* Desc() { return "is >="; }<br>
- static const char* NegatedDesc() { return "isn't >="; }<br>
-};<br>
-<br>
// Implements the polymorphic IsNull() matcher, which matches any raw or smart<br>
// pointer that is NULL.<br>
class IsNullMatcher {<br>
@@ -1163,11 +527,7 @@ class IsNullMatcher {<br>
template <typename Pointer><br>
bool MatchAndExplain(const Pointer& p,<br>
MatchResultListener* /* listener */) const {<br>
-#if GTEST_LANG_CXX11<br>
return p == nullptr;<br>
-#else // GTEST_LANG_CXX11<br>
- return GetRawPointer(p) == NULL;<br>
-#endif // GTEST_LANG_CXX11<br>
}<br>
<br>
void DescribeTo(::std::ostream* os) const { *os << "is NULL"; }<br>
@@ -1183,11 +543,7 @@ class NotNullMatcher {<br>
template <typename Pointer><br>
bool MatchAndExplain(const Pointer& p,<br>
MatchResultListener* /* listener */) const {<br>
-#if GTEST_LANG_CXX11<br>
return p != nullptr;<br>
-#else // GTEST_LANG_CXX11<br>
- return GetRawPointer(p) != NULL;<br>
-#endif // GTEST_LANG_CXX11<br>
}<br>
<br>
void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; }<br>
@@ -1243,18 +599,18 @@ class RefMatcher<T&> {<br>
<br>
// MatchAndExplain() takes a Super& (as opposed to const Super&)<br>
// in order to match the interface MatcherInterface<Super&>.<br>
- virtual bool MatchAndExplain(<br>
- Super& x, MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(Super& x,<br>
+ MatchResultListener* listener) const override {<br>
*listener << "which is located @" << static_cast<const void*>(&x);<br>
return &x == &object_;<br>
}<br>
<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "references the variable ";<br>
UniversalPrinter<Super&>::Print(object_, os);<br>
}<br>
<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "does not reference the variable ";<br>
UniversalPrinter<Super&>::Print(object_, os);<br>
}<br>
@@ -1316,12 +672,9 @@ class StrEqualityMatcher {<br>
#if GTEST_HAS_ABSL<br>
bool MatchAndExplain(const absl::string_view& s,<br>
MatchResultListener* listener) const {<br>
- if (s.data() == NULL) {<br>
- return !expect_eq_;<br>
- }<br>
// This should fail to compile if absl::string_view is used with wide<br>
// strings.<br>
- const StringType& str = string(s);<br>
+ const StringType& str = std::string(s);<br>
return MatchAndExplain(str, listener);<br>
}<br>
#endif // GTEST_HAS_ABSL<br>
@@ -1333,7 +686,7 @@ class StrEqualityMatcher {<br>
// wchar_t*<br>
template <typename CharType><br>
bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {<br>
- if (s == NULL) {<br>
+ if (s == nullptr) {<br>
return !expect_eq_;<br>
}<br>
return MatchAndExplain(StringType(s), listener);<br>
@@ -1389,12 +742,9 @@ class HasSubstrMatcher {<br>
#if GTEST_HAS_ABSL<br>
bool MatchAndExplain(const absl::string_view& s,<br>
MatchResultListener* listener) const {<br>
- if (s.data() == NULL) {<br>
- return false;<br>
- }<br>
// This should fail to compile if absl::string_view is used with wide<br>
// strings.<br>
- const StringType& str = string(s);<br>
+ const StringType& str = std::string(s);<br>
return MatchAndExplain(str, listener);<br>
}<br>
#endif // GTEST_HAS_ABSL<br>
@@ -1406,7 +756,7 @@ class HasSubstrMatcher {<br>
// wchar_t*<br>
template <typename CharType><br>
bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {<br>
- return s != NULL && MatchAndExplain(StringType(s), listener);<br>
+ return s != nullptr && MatchAndExplain(StringType(s), listener);<br>
}<br>
<br>
// Matches anything that can convert to StringType.<br>
@@ -1449,12 +799,9 @@ class StartsWithMatcher {<br>
#if GTEST_HAS_ABSL<br>
bool MatchAndExplain(const absl::string_view& s,<br>
MatchResultListener* listener) const {<br>
- if (s.data() == NULL) {<br>
- return false;<br>
- }<br>
// This should fail to compile if absl::string_view is used with wide<br>
// strings.<br>
- const StringType& str = string(s);<br>
+ const StringType& str = std::string(s);<br>
return MatchAndExplain(str, listener);<br>
}<br>
#endif // GTEST_HAS_ABSL<br>
@@ -1466,7 +813,7 @@ class StartsWithMatcher {<br>
// wchar_t*<br>
template <typename CharType><br>
bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {<br>
- return s != NULL && MatchAndExplain(StringType(s), listener);<br>
+ return s != nullptr && MatchAndExplain(StringType(s), listener);<br>
}<br>
<br>
// Matches anything that can convert to StringType.<br>
@@ -1508,12 +855,9 @@ class EndsWithMatcher {<br>
#if GTEST_HAS_ABSL<br>
bool MatchAndExplain(const absl::string_view& s,<br>
MatchResultListener* listener) const {<br>
- if (s.data() == NULL) {<br>
- return false;<br>
- }<br>
// This should fail to compile if absl::string_view is used with wide<br>
// strings.<br>
- const StringType& str = string(s);<br>
+ const StringType& str = std::string(s);<br>
return MatchAndExplain(str, listener);<br>
}<br>
#endif // GTEST_HAS_ABSL<br>
@@ -1525,7 +869,7 @@ class EndsWithMatcher {<br>
// wchar_t*<br>
template <typename CharType><br>
bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {<br>
- return s != NULL && MatchAndExplain(StringType(s), listener);<br>
+ return s != nullptr && MatchAndExplain(StringType(s), listener);<br>
}<br>
<br>
// Matches anything that can convert to StringType.<br>
@@ -1556,80 +900,24 @@ class EndsWithMatcher {<br>
GTEST_DISALLOW_ASSIGN_(EndsWithMatcher);<br>
};<br>
<br>
-// Implements polymorphic matchers MatchesRegex(regex) and<br>
-// ContainsRegex(regex), which can be used as a Matcher<T> as long as<br>
-// T can be converted to a string.<br>
-class MatchesRegexMatcher {<br>
- public:<br>
- MatchesRegexMatcher(const RE* regex, bool full_match)<br>
- : regex_(regex), full_match_(full_match) {}<br>
-<br>
-#if GTEST_HAS_ABSL<br>
- bool MatchAndExplain(const absl::string_view& s,<br>
- MatchResultListener* listener) const {<br>
- return s.data() && MatchAndExplain(string(s), listener);<br>
- }<br>
-#endif // GTEST_HAS_ABSL<br>
-<br>
- // Accepts pointer types, particularly:<br>
- // const char*<br>
- // char*<br>
- // const wchar_t*<br>
- // wchar_t*<br>
- template <typename CharType><br>
- bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {<br>
- return s != NULL && MatchAndExplain(std::string(s), listener);<br>
- }<br>
-<br>
- // Matches anything that can convert to std::string.<br>
- //<br>
- // This is a template, not just a plain function with const std::string&,<br>
- // because absl::string_view has some interfering non-explicit constructors.<br>
- template <class MatcheeStringType><br>
- bool MatchAndExplain(const MatcheeStringType& s,<br>
- MatchResultListener* /* listener */) const {<br>
- const std::string& s2(s);<br>
- return full_match_ ? RE::FullMatch(s2, *regex_) :<br>
- RE::PartialMatch(s2, *regex_);<br>
- }<br>
-<br>
- void DescribeTo(::std::ostream* os) const {<br>
- *os << (full_match_ ? "matches" : "contains")<br>
- << " regular expression ";<br>
- UniversalPrinter<std::string>::Print(regex_->pattern(), os);<br>
- }<br>
-<br>
- void DescribeNegationTo(::std::ostream* os) const {<br>
- *os << "doesn't " << (full_match_ ? "match" : "contain")<br>
- << " regular expression ";<br>
- UniversalPrinter<std::string>::Print(regex_->pattern(), os);<br>
- }<br>
-<br>
- private:<br>
- const internal::linked_ptr<const RE> regex_;<br>
- const bool full_match_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher);<br>
-};<br>
-<br>
// Implements a matcher that compares the two fields of a 2-tuple<br>
// using one of the ==, <=, <, etc, operators. The two fields being<br>
// compared don't have to have the same type.<br>
//<br>
// The matcher defined here is polymorphic (for example, Eq() can be<br>
-// used to match a tuple<int, short>, a tuple<const long&, double>,<br>
+// used to match a std::tuple<int, short>, a std::tuple<const long&, double>,<br>
// etc). Therefore we use a template type conversion operator in the<br>
// implementation.<br>
template <typename D, typename Op><br>
class PairMatchBase {<br>
public:<br>
template <typename T1, typename T2><br>
- operator Matcher< ::testing::tuple<T1, T2> >() const {<br>
- return MakeMatcher(new Impl< ::testing::tuple<T1, T2> >);<br>
+ operator Matcher<::std::tuple<T1, T2>>() const {<br>
+ return Matcher<::std::tuple<T1, T2>>(new Impl<const ::std::tuple<T1, T2>&>);<br>
}<br>
template <typename T1, typename T2><br>
- operator Matcher<const ::testing::tuple<T1, T2>&>() const {<br>
- return MakeMatcher(new Impl<const ::testing::tuple<T1, T2>&>);<br>
+ operator Matcher<const ::std::tuple<T1, T2>&>() const {<br>
+ return MakeMatcher(new Impl<const ::std::tuple<T1, T2>&>);<br>
}<br>
<br>
private:<br>
@@ -1640,15 +928,14 @@ class PairMatchBase {<br>
template <typename Tuple><br>
class Impl : public MatcherInterface<Tuple> {<br>
public:<br>
- virtual bool MatchAndExplain(<br>
- Tuple args,<br>
- MatchResultListener* /* listener */) const {<br>
- return Op()(::testing::get<0>(args), ::testing::get<1>(args));<br>
+ bool MatchAndExplain(Tuple args,<br>
+ MatchResultListener* /* listener */) const override {<br>
+ return Op()(::std::get<0>(args), ::std::get<1>(args));<br>
}<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "are " << GetDesc;<br>
}<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "aren't " << GetDesc;<br>
}<br>
};<br>
@@ -1684,21 +971,21 @@ class Ge2Matcher : public PairMatchBase<Ge2Matcher, AnyGe> {<br>
// will prevent <br>
diff erent instantiations of NotMatcher from sharing<br>
// the same NotMatcherImpl<T> class.<br>
template <typename T><br>
-class NotMatcherImpl : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {<br>
+class NotMatcherImpl : public MatcherInterface<const T&> {<br>
public:<br>
explicit NotMatcherImpl(const Matcher<T>& matcher)<br>
: matcher_(matcher) {}<br>
<br>
- virtual bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x,<br>
- MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(const T& x,<br>
+ MatchResultListener* listener) const override {<br>
return !matcher_.MatchAndExplain(x, listener);<br>
}<br>
<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
matcher_.DescribeNegationTo(os);<br>
}<br>
<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
matcher_.DescribeTo(os);<br>
}<br>
<br>
@@ -1733,13 +1020,12 @@ class NotMatcher {<br>
// that will prevent <br>
diff erent instantiations of BothOfMatcher from<br>
// sharing the same BothOfMatcherImpl<T> class.<br>
template <typename T><br>
-class AllOfMatcherImpl<br>
- : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {<br>
+class AllOfMatcherImpl : public MatcherInterface<const T&> {<br>
public:<br>
explicit AllOfMatcherImpl(std::vector<Matcher<T> > matchers)<br>
- : matchers_(internal::move(matchers)) {}<br>
+ : matchers_(std::move(matchers)) {}<br>
<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "(";<br>
for (size_t i = 0; i < matchers_.size(); ++i) {<br>
if (i != 0) *os << ") and (";<br>
@@ -1748,7 +1034,7 @@ class AllOfMatcherImpl<br>
*os << ")";<br>
}<br>
<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "(";<br>
for (size_t i = 0; i < matchers_.size(); ++i) {<br>
if (i != 0) *os << ") or (";<br>
@@ -1757,8 +1043,8 @@ class AllOfMatcherImpl<br>
*os << ")";<br>
}<br>
<br>
- virtual bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x,<br>
- MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(const T& x,<br>
+ MatchResultListener* listener) const override {<br>
// If either matcher1_ or matcher2_ doesn't match x, we only need<br>
// to explain why one of them fails.<br>
std::string all_match_result;<br>
@@ -1792,7 +1078,6 @@ class AllOfMatcherImpl<br>
GTEST_DISALLOW_ASSIGN_(AllOfMatcherImpl);<br>
};<br>
<br>
-#if GTEST_LANG_CXX11<br>
// VariadicMatcher is used for the variadic implementation of<br>
// AllOf(m_1, m_2, ...) and AnyOf(m_1, m_2, ...).<br>
// CombiningMatcher<T> is used to recursively combine the provided matchers<br>
@@ -1812,7 +1097,7 @@ class VariadicMatcher {<br>
operator Matcher<T>() const {<br>
std::vector<Matcher<T> > values;<br>
CreateVariadicMatcher<T>(&values, std::integral_constant<size_t, 0>());<br>
- return Matcher<T>(new CombiningMatcher<T>(internal::move(values)));<br>
+ return Matcher<T>(new CombiningMatcher<T>(std::move(values)));<br>
}<br>
<br>
private:<br>
@@ -1828,7 +1113,7 @@ class VariadicMatcher {<br>
std::vector<Matcher<T> >*,<br>
std::integral_constant<size_t, sizeof...(Args)>) const {}<br>
<br>
- tuple<Args...> matchers_;<br>
+ std::tuple<Args...> matchers_;<br>
<br>
GTEST_DISALLOW_ASSIGN_(VariadicMatcher);<br>
};<br>
@@ -1836,46 +1121,17 @@ class VariadicMatcher {<br>
template <typename... Args><br>
using AllOfMatcher = VariadicMatcher<AllOfMatcherImpl, Args...>;<br>
<br>
-#endif // GTEST_LANG_CXX11<br>
-<br>
-// Used for implementing the AllOf(m_1, ..., m_n) matcher, which<br>
-// matches a value that matches all of the matchers m_1, ..., and m_n.<br>
-template <typename Matcher1, typename Matcher2><br>
-class BothOfMatcher {<br>
- public:<br>
- BothOfMatcher(Matcher1 matcher1, Matcher2 matcher2)<br>
- : matcher1_(matcher1), matcher2_(matcher2) {}<br>
-<br>
- // This template type conversion operator allows a<br>
- // BothOfMatcher<Matcher1, Matcher2> object to match any type that<br>
- // both Matcher1 and Matcher2 can match.<br>
- template <typename T><br>
- operator Matcher<T>() const {<br>
- std::vector<Matcher<T> > values;<br>
- values.push_back(SafeMatcherCast<T>(matcher1_));<br>
- values.push_back(SafeMatcherCast<T>(matcher2_));<br>
- return Matcher<T>(new AllOfMatcherImpl<T>(internal::move(values)));<br>
- }<br>
-<br>
- private:<br>
- Matcher1 matcher1_;<br>
- Matcher2 matcher2_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(BothOfMatcher);<br>
-};<br>
-<br>
// Implements the AnyOf(m1, m2) matcher for a particular argument type<br>
// T. We do not nest it inside the AnyOfMatcher class template, as<br>
// that will prevent <br>
diff erent instantiations of AnyOfMatcher from<br>
// sharing the same EitherOfMatcherImpl<T> class.<br>
template <typename T><br>
-class AnyOfMatcherImpl<br>
- : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {<br>
+class AnyOfMatcherImpl : public MatcherInterface<const T&> {<br>
public:<br>
explicit AnyOfMatcherImpl(std::vector<Matcher<T> > matchers)<br>
- : matchers_(internal::move(matchers)) {}<br>
+ : matchers_(std::move(matchers)) {}<br>
<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "(";<br>
for (size_t i = 0; i < matchers_.size(); ++i) {<br>
if (i != 0) *os << ") or (";<br>
@@ -1884,7 +1140,7 @@ class AnyOfMatcherImpl<br>
*os << ")";<br>
}<br>
<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "(";<br>
for (size_t i = 0; i < matchers_.size(); ++i) {<br>
if (i != 0) *os << ") and (";<br>
@@ -1893,8 +1149,8 @@ class AnyOfMatcherImpl<br>
*os << ")";<br>
}<br>
<br>
- virtual bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x,<br>
- MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(const T& x,<br>
+ MatchResultListener* listener) const override {<br>
std::string no_match_result;<br>
<br>
// If either matcher1_ or matcher2_ matches x, we just need to<br>
@@ -1928,40 +1184,41 @@ class AnyOfMatcherImpl<br>
GTEST_DISALLOW_ASSIGN_(AnyOfMatcherImpl);<br>
};<br>
<br>
-#if GTEST_LANG_CXX11<br>
// AnyOfMatcher is used for the variadic implementation of AnyOf(m_1, m_2, ...).<br>
template <typename... Args><br>
using AnyOfMatcher = VariadicMatcher<AnyOfMatcherImpl, Args...>;<br>
<br>
-#endif // GTEST_LANG_CXX11<br>
-<br>
-// Used for implementing the AnyOf(m_1, ..., m_n) matcher, which<br>
-// matches a value that matches at least one of the matchers m_1, ...,<br>
-// and m_n.<br>
-template <typename Matcher1, typename Matcher2><br>
-class EitherOfMatcher {<br>
+// Wrapper for implementation of Any/AllOfArray().<br>
+template <template <class> class MatcherImpl, typename T><br>
+class SomeOfArrayMatcher {<br>
public:<br>
- EitherOfMatcher(Matcher1 matcher1, Matcher2 matcher2)<br>
- : matcher1_(matcher1), matcher2_(matcher2) {}<br>
+ // Constructs the matcher from a sequence of element values or<br>
+ // element matchers.<br>
+ template <typename Iter><br>
+ SomeOfArrayMatcher(Iter first, Iter last) : matchers_(first, last) {}<br>
<br>
- // This template type conversion operator allows a<br>
- // EitherOfMatcher<Matcher1, Matcher2> object to match any type that<br>
- // both Matcher1 and Matcher2 can match.<br>
- template <typename T><br>
- operator Matcher<T>() const {<br>
- std::vector<Matcher<T> > values;<br>
- values.push_back(SafeMatcherCast<T>(matcher1_));<br>
- values.push_back(SafeMatcherCast<T>(matcher2_));<br>
- return Matcher<T>(new AnyOfMatcherImpl<T>(internal::move(values)));<br>
+ template <typename U><br>
+ operator Matcher<U>() const { // NOLINT<br>
+ using RawU = typename std::decay<U>::type;<br>
+ std::vector<Matcher<RawU>> matchers;<br>
+ for (const auto& matcher : matchers_) {<br>
+ matchers.push_back(MatcherCast<RawU>(matcher));<br>
+ }<br>
+ return Matcher<U>(new MatcherImpl<RawU>(std::move(matchers)));<br>
}<br>
<br>
private:<br>
- Matcher1 matcher1_;<br>
- Matcher2 matcher2_;<br>
+ const ::std::vector<T> matchers_;<br>
<br>
- GTEST_DISALLOW_ASSIGN_(EitherOfMatcher);<br>
+ GTEST_DISALLOW_ASSIGN_(SomeOfArrayMatcher);<br>
};<br>
<br>
+template <typename T><br>
+using AllOfArrayMatcher = SomeOfArrayMatcher<AllOfMatcherImpl, T>;<br>
+<br>
+template <typename T><br>
+using AnyOfArrayMatcher = SomeOfArrayMatcher<AnyOfMatcherImpl, T>;<br>
+<br>
// Used for implementing Truly(pred), which turns a predicate into a<br>
// matcher.<br>
template <typename Predicate><br>
@@ -2044,7 +1301,7 @@ class MatcherAsPredicate {<br>
template <typename M><br>
class PredicateFormatterFromMatcher {<br>
public:<br>
- explicit PredicateFormatterFromMatcher(M m) : matcher_(internal::move(m)) {}<br>
+ explicit PredicateFormatterFromMatcher(M m) : matcher_(std::move(m)) {}<br>
<br>
// This template () operator allows a PredicateFormatterFromMatcher<br>
// object to act as a predicate-formatter suitable for using with<br>
@@ -2063,14 +1320,24 @@ class PredicateFormatterFromMatcher {<br>
// We don't write MatcherCast<const T&> either, as that allows<br>
// potentially unsafe downcasting of the matcher argument.<br>
const Matcher<const T&> matcher = SafeMatcherCast<const T&>(matcher_);<br>
- StringMatchResultListener listener;<br>
- if (MatchPrintAndExplain(x, matcher, &listener))<br>
+<br>
+ // The expected path here is that the matcher should match (i.e. that most<br>
+ // tests pass) so optimize for this case.<br>
+ if (matcher.Matches(x)) {<br>
return AssertionSuccess();<br>
+ }<br>
<br>
::std::stringstream ss;<br>
ss << "Value of: " << value_text << "\n"<br>
<< "Expected: ";<br>
matcher.DescribeTo(&ss);<br>
+<br>
+ // Rerun the matcher to "PrintAndExain" the failure.<br>
+ StringMatchResultListener listener;<br>
+ if (MatchPrintAndExplain(x, matcher, &listener)) {<br>
+ ss << "\n The matcher failed on the initial attempt; but passed when "<br>
+ "rerun to generate the explanation.";<br>
+ }<br>
ss << "\n Actual: " << listener.str();<br>
return AssertionFailure() << ss.str();<br>
}<br>
@@ -2088,7 +1355,7 @@ class PredicateFormatterFromMatcher {<br>
template <typename M><br>
inline PredicateFormatterFromMatcher<M><br>
MakePredicateFormatterFromMatcher(M matcher) {<br>
- return PredicateFormatterFromMatcher<M>(internal::move(matcher));<br>
+ return PredicateFormatterFromMatcher<M>(std::move(matcher));<br>
}<br>
<br>
// Implements the polymorphic floating point equality matcher, which matches<br>
@@ -2129,8 +1396,8 @@ class FloatingEqMatcher {<br>
nan_eq_nan_(nan_eq_nan),<br>
max_abs_error_(max_abs_error) {}<br>
<br>
- virtual bool MatchAndExplain(T value,<br>
- MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(T value,<br>
+ MatchResultListener* listener) const override {<br>
const FloatingPoint<FloatType> actual(value), expected(expected_);<br>
<br>
// Compares NaNs first, if nan_eq_nan_ is true.<br>
@@ -2164,7 +1431,7 @@ class FloatingEqMatcher {<br>
}<br>
}<br>
<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
// os->precision() returns the previously set precision, which we<br>
// store to restore the ostream to its original configuration<br>
// after outputting.<br>
@@ -2185,7 +1452,7 @@ class FloatingEqMatcher {<br>
os->precision(old_precision);<br>
}<br>
<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
// As before, get original precision.<br>
const ::std::streamsize old_precision = os->precision(<br>
::std::numeric_limits<FloatType>::digits10 + 2);<br>
@@ -2269,14 +1536,14 @@ class FloatingEq2Matcher {<br>
}<br>
<br>
template <typename T1, typename T2><br>
- operator Matcher< ::testing::tuple<T1, T2> >() const {<br>
+ operator Matcher<::std::tuple<T1, T2>>() const {<br>
return MakeMatcher(<br>
- new Impl< ::testing::tuple<T1, T2> >(max_abs_error_, nan_eq_nan_));<br>
+ new Impl<::std::tuple<T1, T2>>(max_abs_error_, nan_eq_nan_));<br>
}<br>
template <typename T1, typename T2><br>
- operator Matcher<const ::testing::tuple<T1, T2>&>() const {<br>
+ operator Matcher<const ::std::tuple<T1, T2>&>() const {<br>
return MakeMatcher(<br>
- new Impl<const ::testing::tuple<T1, T2>&>(max_abs_error_, nan_eq_nan_));<br>
+ new Impl<const ::std::tuple<T1, T2>&>(max_abs_error_, nan_eq_nan_));<br>
}<br>
<br>
private:<br>
@@ -2291,23 +1558,23 @@ class FloatingEq2Matcher {<br>
max_abs_error_(max_abs_error),<br>
nan_eq_nan_(nan_eq_nan) {}<br>
<br>
- virtual bool MatchAndExplain(Tuple args,<br>
- MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(Tuple args,<br>
+ MatchResultListener* listener) const override {<br>
if (max_abs_error_ == -1) {<br>
- FloatingEqMatcher<FloatType> fm(::testing::get<0>(args), nan_eq_nan_);<br>
- return static_cast<Matcher<FloatType> >(fm).MatchAndExplain(<br>
- ::testing::get<1>(args), listener);<br>
+ FloatingEqMatcher<FloatType> fm(::std::get<0>(args), nan_eq_nan_);<br>
+ return static_cast<Matcher<FloatType>>(fm).MatchAndExplain(<br>
+ ::std::get<1>(args), listener);<br>
} else {<br>
- FloatingEqMatcher<FloatType> fm(::testing::get<0>(args), nan_eq_nan_,<br>
+ FloatingEqMatcher<FloatType> fm(::std::get<0>(args), nan_eq_nan_,<br>
max_abs_error_);<br>
- return static_cast<Matcher<FloatType> >(fm).MatchAndExplain(<br>
- ::testing::get<1>(args), listener);<br>
+ return static_cast<Matcher<FloatType>>(fm).MatchAndExplain(<br>
+ ::std::get<1>(args), listener);<br>
}<br>
}<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "are " << GetDesc;<br>
}<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "aren't " << GetDesc;<br>
}<br>
<br>
@@ -2341,8 +1608,7 @@ class PointeeMatcher {<br>
// enough for implementing the DescribeTo() method of Pointee().<br>
template <typename Pointer><br>
operator Matcher<Pointer>() const {<br>
- return Matcher<Pointer>(<br>
- new Impl<GTEST_REFERENCE_TO_CONST_(Pointer)>(matcher_));<br>
+ return Matcher<Pointer>(new Impl<const Pointer&>(matcher_));<br>
}<br>
<br>
private:<br>
@@ -2350,26 +1616,25 @@ class PointeeMatcher {<br>
template <typename Pointer><br>
class Impl : public MatcherInterface<Pointer> {<br>
public:<br>
- typedef typename PointeeOf<GTEST_REMOVE_CONST_( // NOLINT<br>
- GTEST_REMOVE_REFERENCE_(Pointer))>::type Pointee;<br>
+ typedef typename PointeeOf<typename std::remove_const<<br>
+ typename std::remove_reference<Pointer>::type>::type>::type Pointee;<br>
<br>
explicit Impl(const InnerMatcher& matcher)<br>
: matcher_(MatcherCast<const Pointee&>(matcher)) {}<br>
<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "points to a value that ";<br>
matcher_.DescribeTo(os);<br>
}<br>
<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "does not point to a value that ";<br>
matcher_.DescribeTo(os);<br>
}<br>
<br>
- virtual bool MatchAndExplain(Pointer pointer,<br>
- MatchResultListener* listener) const {<br>
- if (GetRawPointer(pointer) == NULL)<br>
- return false;<br>
+ bool MatchAndExplain(Pointer pointer,<br>
+ MatchResultListener* listener) const override {<br>
+ if (GetRawPointer(pointer) == nullptr) return false;<br>
<br>
*listener << "which points to ";<br>
return MatchPrintAndExplain(*pointer, matcher_, listener);<br>
@@ -2434,7 +1699,6 @@ class WhenDynamicCastToMatcher : public WhenDynamicCastToMatcherBase<To> {<br>
<br>
template <typename From><br>
bool MatchAndExplain(From from, MatchResultListener* listener) const {<br>
- // FIXME: Add more detail on failures. ie did the dyn_cast fail?<br>
To to = dynamic_cast<To>(from);<br>
return MatchPrintAndExplain(to, this->matcher_, listener);<br>
}<br>
@@ -2452,7 +1716,7 @@ class WhenDynamicCastToMatcher<To&> : public WhenDynamicCastToMatcherBase<To&> {<br>
bool MatchAndExplain(From& from, MatchResultListener* listener) const {<br>
// We don't want an std::bad_cast here, so do the cast with pointers.<br>
To* to = dynamic_cast<To*>(&from);<br>
- if (to == NULL) {<br>
+ if (to == nullptr) {<br>
*listener << "which cannot be dynamic_cast to " << this->GetToName();<br>
return false;<br>
}<br>
@@ -2488,32 +1752,30 @@ class FieldMatcher {<br>
<br>
template <typename T><br>
bool MatchAndExplain(const T& value, MatchResultListener* listener) const {<br>
+ // FIXME: The dispatch on std::is_pointer was introduced as a workaround for<br>
+ // a compiler bug, and can now be removed.<br>
return MatchAndExplainImpl(<br>
- typename ::testing::internal::<br>
- is_pointer<GTEST_REMOVE_CONST_(T)>::type(),<br>
+ typename std::is_pointer<typename std::remove_const<T>::type>::type(),<br>
value, listener);<br>
}<br>
<br>
private:<br>
- // The first argument of MatchAndExplainImpl() is needed to help<br>
- // Symbian's C++ compiler choose which overload to use. Its type is<br>
- // true_type iff the Field() matcher is used to match a pointer.<br>
- bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj,<br>
+ bool MatchAndExplainImpl(std::false_type /* is_not_pointer */,<br>
+ const Class& obj,<br>
MatchResultListener* listener) const {<br>
*listener << whose_field_ << "is ";<br>
return MatchPrintAndExplain(obj.*field_, matcher_, listener);<br>
}<br>
<br>
- bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p,<br>
+ bool MatchAndExplainImpl(std::true_type /* is_pointer */, const Class* p,<br>
MatchResultListener* listener) const {<br>
- if (p == NULL)<br>
- return false;<br>
+ if (p == nullptr) return false;<br>
<br>
*listener << "which points to an object ";<br>
// Since *p has a field, it must be a class/struct/union type and<br>
// thus cannot be a pointer. Therefore we pass false_type() as<br>
// the first argument.<br>
- return MatchAndExplainImpl(false_type(), *p, listener);<br>
+ return MatchAndExplainImpl(std::false_type(), *p, listener);<br>
}<br>
<br>
const FieldType Class::*field_;<br>
@@ -2534,11 +1796,7 @@ class FieldMatcher {<br>
template <typename Class, typename PropertyType, typename Property><br>
class PropertyMatcher {<br>
public:<br>
- // The property may have a reference type, so 'const PropertyType&'<br>
- // may cause double references and fail to compile. That's why we<br>
- // need GTEST_REFERENCE_TO_CONST, which works regardless of<br>
- // PropertyType being a reference or not.<br>
- typedef GTEST_REFERENCE_TO_CONST_(PropertyType) RefToConstProperty;<br>
+ typedef const PropertyType& RefToConstProperty;<br>
<br>
PropertyMatcher(Property property, const Matcher<RefToConstProperty>& matcher)<br>
: property_(property),<br>
@@ -2564,41 +1822,30 @@ class PropertyMatcher {<br>
template <typename T><br>
bool MatchAndExplain(const T&value, MatchResultListener* listener) const {<br>
return MatchAndExplainImpl(<br>
- typename ::testing::internal::<br>
- is_pointer<GTEST_REMOVE_CONST_(T)>::type(),<br>
+ typename std::is_pointer<typename std::remove_const<T>::type>::type(),<br>
value, listener);<br>
}<br>
<br>
private:<br>
- // The first argument of MatchAndExplainImpl() is needed to help<br>
- // Symbian's C++ compiler choose which overload to use. Its type is<br>
- // true_type iff the Property() matcher is used to match a pointer.<br>
- bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj,<br>
+ bool MatchAndExplainImpl(std::false_type /* is_not_pointer */,<br>
+ const Class& obj,<br>
MatchResultListener* listener) const {<br>
*listener << whose_property_ << "is ";<br>
// Cannot pass the return value (for example, int) to MatchPrintAndExplain,<br>
// which takes a non-const reference as argument.<br>
-#if defined(_PREFAST_ ) && _MSC_VER == 1800<br>
- // Workaround bug in VC++ 2013's /analyze parser.<br>
- // <a href="https://connect.microsoft.com/VisualStudio/feedback/details/1106363/internal-compiler-error-with-analyze-due-to-failure-to-infer-move" rel="noreferrer" target="_blank">https://connect.microsoft.com/VisualStudio/feedback/details/1106363/internal-compiler-error-with-analyze-due-to-failure-to-infer-move</a><br>
- posix::Abort(); // To make sure it is never run.<br>
- return false;<br>
-#else<br>
RefToConstProperty result = (obj.*property_)();<br>
return MatchPrintAndExplain(result, matcher_, listener);<br>
-#endif<br>
}<br>
<br>
- bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p,<br>
+ bool MatchAndExplainImpl(std::true_type /* is_pointer */, const Class* p,<br>
MatchResultListener* listener) const {<br>
- if (p == NULL)<br>
- return false;<br>
+ if (p == nullptr) return false;<br>
<br>
*listener << "which points to an object ";<br>
// Since *p has a property method, it must be a class/struct/union<br>
// type and thus cannot be a pointer. Therefore we pass<br>
// false_type() as the first argument.<br>
- return MatchAndExplainImpl(false_type(), *p, listener);<br>
+ return MatchAndExplainImpl(std::false_type(), *p, listener);<br>
}<br>
<br>
Property property_;<br>
@@ -2619,14 +1866,10 @@ struct CallableTraits {<br>
<br>
static void CheckIsValid(Functor /* functor */) {}<br>
<br>
-#if GTEST_LANG_CXX11<br>
template <typename T><br>
- static auto Invoke(Functor f, T arg) -> decltype(f(arg)) { return f(arg); }<br>
-#else<br>
- typedef typename Functor::result_type ResultType;<br>
- template <typename T><br>
- static ResultType Invoke(Functor f, T arg) { return f(arg); }<br>
-#endif<br>
+ static auto Invoke(Functor f, const T& arg) -> decltype(f(arg)) {<br>
+ return f(arg);<br>
+ }<br>
};<br>
<br>
// Specialization for function pointers.<br>
@@ -2636,7 +1879,7 @@ struct CallableTraits<ResType(*)(ArgType)> {<br>
typedef ResType(*StorageType)(ArgType);<br>
<br>
static void CheckIsValid(ResType(*f)(ArgType)) {<br>
- GTEST_CHECK_(f != NULL)<br>
+ GTEST_CHECK_(f != nullptr)<br>
<< "NULL function pointer is passed into ResultOf().";<br>
}<br>
template <typename T><br>
@@ -2651,13 +1894,13 @@ template <typename Callable, typename InnerMatcher><br>
class ResultOfMatcher {<br>
public:<br>
ResultOfMatcher(Callable callable, InnerMatcher matcher)<br>
- : callable_(internal::move(callable)), matcher_(internal::move(matcher)) {<br>
+ : callable_(std::move(callable)), matcher_(std::move(matcher)) {<br>
CallableTraits<Callable>::CheckIsValid(callable_);<br>
}<br>
<br>
template <typename T><br>
operator Matcher<T>() const {<br>
- return Matcher<T>(new Impl<T>(callable_, matcher_));<br>
+ return Matcher<T>(new Impl<const T&>(callable_, matcher_));<br>
}<br>
<br>
private:<br>
@@ -2665,29 +1908,25 @@ class ResultOfMatcher {<br>
<br>
template <typename T><br>
class Impl : public MatcherInterface<T> {<br>
-#if GTEST_LANG_CXX11<br>
using ResultType = decltype(CallableTraits<Callable>::template Invoke<T>(<br>
std::declval<CallableStorageType>(), std::declval<T>()));<br>
-#else<br>
- typedef typename CallableTraits<Callable>::ResultType ResultType;<br>
-#endif<br>
<br>
public:<br>
template <typename M><br>
Impl(const CallableStorageType& callable, const M& matcher)<br>
: callable_(callable), matcher_(MatcherCast<ResultType>(matcher)) {}<br>
<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "is mapped by the given callable to a value that ";<br>
matcher_.DescribeTo(os);<br>
}<br>
<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "is mapped by the given callable to a value that ";<br>
matcher_.DescribeNegationTo(os);<br>
}<br>
<br>
- virtual bool MatchAndExplain(T obj, MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(T obj, MatchResultListener* listener) const override {<br>
*listener << "which is mapped by the given callable to ";<br>
// Cannot pass the return value directly to MatchPrintAndExplain, which<br>
// takes a non-const reference as argument.<br>
@@ -2726,29 +1965,27 @@ class SizeIsMatcher {<br>
<br>
template <typename Container><br>
operator Matcher<Container>() const {<br>
- return MakeMatcher(new Impl<Container>(size_matcher_));<br>
+ return Matcher<Container>(new Impl<const Container&>(size_matcher_));<br>
}<br>
<br>
template <typename Container><br>
class Impl : public MatcherInterface<Container> {<br>
public:<br>
- typedef internal::StlContainerView<<br>
- GTEST_REMOVE_REFERENCE_AND_CONST_(Container)> ContainerView;<br>
- typedef typename ContainerView::type::size_type SizeType;<br>
+ using SizeType = decltype(std::declval<Container>().size());<br>
explicit Impl(const SizeMatcher& size_matcher)<br>
: size_matcher_(MatcherCast<SizeType>(size_matcher)) {}<br>
<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "size ";<br>
size_matcher_.DescribeTo(os);<br>
}<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "size ";<br>
size_matcher_.DescribeNegationTo(os);<br>
}<br>
<br>
- virtual bool MatchAndExplain(Container container,<br>
- MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(Container container,<br>
+ MatchResultListener* listener) const override {<br>
SizeType size = container.size();<br>
StringMatchResultListener size_listener;<br>
const bool result = size_matcher_.MatchAndExplain(size, &size_listener);<br>
@@ -2778,42 +2015,37 @@ class BeginEndDistanceIsMatcher {<br>
<br>
template <typename Container><br>
operator Matcher<Container>() const {<br>
- return MakeMatcher(new Impl<Container>(distance_matcher_));<br>
+ return Matcher<Container>(new Impl<const Container&>(distance_matcher_));<br>
}<br>
<br>
template <typename Container><br>
class Impl : public MatcherInterface<Container> {<br>
- public:<br>
- typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;<br>
- typedef internal::StlContainerView<RawContainer> View;<br>
- typedef typename View::type StlContainer;<br>
- typedef typename View::const_reference StlContainerReference;<br>
- typedef decltype(std::begin(<br>
- std::declval<StlContainerReference>())) StlContainerConstIterator;<br>
- typedef typename std::iterator_traits<<br>
- StlContainerConstIterator>::<br>
diff erence_type DistanceType;<br>
-<br>
- explicit Impl(const DistanceMatcher &distance_matcher)<br>
- : distance_matcher_(MatcherCast<DistanceType>(distance_matcher)) {}<br>
-<br>
- virtual void DescribeTo(::std::ostream *os) const {<br>
- *os << "distance between begin() and end() ";<br>
- distance_matcher_.DescribeTo(os);<br>
+ public:<br>
+ typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;<br>
+ typedef internal::StlContainerView<RawContainer> View;<br>
+ typedef typename View::type StlContainer;<br>
+ typedef typename View::const_reference StlContainerReference;<br>
+ typedef decltype(std::begin(<br>
+ std::declval<StlContainerReference>())) StlContainerConstIterator;<br>
+ typedef typename std::iterator_traits<<br>
+ StlContainerConstIterator>::<br>
diff erence_type DistanceType;<br>
+ explicit Impl(const DistanceMatcher& distance_matcher)<br>
+ : distance_matcher_(MatcherCast<DistanceType>(distance_matcher)) {}<br>
+<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
+ *os << "distance between begin() and end() ";<br>
+ distance_matcher_.DescribeTo(os);<br>
}<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "distance between begin() and end() ";<br>
distance_matcher_.DescribeNegationTo(os);<br>
}<br>
<br>
- virtual bool MatchAndExplain(Container container,<br>
- MatchResultListener* listener) const {<br>
-#if GTEST_HAS_STD_BEGIN_AND_END_<br>
+ bool MatchAndExplain(Container container,<br>
+ MatchResultListener* listener) const override {<br>
using std::begin;<br>
using std::end;<br>
DistanceType distance = std::distance(begin(container), end(container));<br>
-#else<br>
- DistanceType distance = std::distance(container.begin(), container.end());<br>
-#endif<br>
StringMatchResultListener distance_listener;<br>
const bool result =<br>
distance_matcher_.MatchAndExplain(distance, &distance_listener);<br>
@@ -2850,15 +2082,15 @@ class ContainerEqMatcher {<br>
typedef typename View::type StlContainer;<br>
typedef typename View::const_reference StlContainerReference;<br>
<br>
+ static_assert(!std::is_const<Container>::value,<br>
+ "Container type must not be const");<br>
+ static_assert(!std::is_reference<Container>::value,<br>
+ "Container type must not be a reference");<br>
+<br>
// We make a copy of expected in case the elements in it are modified<br>
// after this matcher is created.<br>
explicit ContainerEqMatcher(const Container& expected)<br>
- : expected_(View::Copy(expected)) {<br>
- // Makes sure the user doesn't instantiate this class template<br>
- // with a const or reference type.<br>
- (void)testing::StaticAssertTypeEq<Container,<br>
- GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>();<br>
- }<br>
+ : expected_(View::Copy(expected)) {}<br>
<br>
void DescribeTo(::std::ostream* os) const {<br>
*os << "equals ";<br>
@@ -2872,9 +2104,8 @@ class ContainerEqMatcher {<br>
template <typename LhsContainer><br>
bool MatchAndExplain(const LhsContainer& lhs,<br>
MatchResultListener* listener) const {<br>
- // GTEST_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug<br>
- // that causes LhsContainer to be a const type sometimes.<br>
- typedef internal::StlContainerView<GTEST_REMOVE_CONST_(LhsContainer)><br>
+ typedef internal::StlContainerView<<br>
+ typename std::remove_const<LhsContainer>::type><br>
LhsView;<br>
typedef typename LhsView::type LhsStlContainer;<br>
StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);<br>
@@ -2882,7 +2113,7 @@ class ContainerEqMatcher {<br>
return true;<br>
<br>
::std::ostream* const os = listener->stream();<br>
- if (os != NULL) {<br>
+ if (os != nullptr) {<br>
// Something is <br>
diff erent. Check for extra values first.<br>
bool printed_header = false;<br>
for (typename LhsStlContainer::const_iterator it =<br>
@@ -2962,18 +2193,18 @@ class WhenSortedByMatcher {<br>
Impl(const Comparator& comparator, const ContainerMatcher& matcher)<br>
: comparator_(comparator), matcher_(matcher) {}<br>
<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "(when sorted) ";<br>
matcher_.DescribeTo(os);<br>
}<br>
<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "(when sorted) ";<br>
matcher_.DescribeNegationTo(os);<br>
}<br>
<br>
- virtual bool MatchAndExplain(LhsContainer lhs,<br>
- MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(LhsContainer lhs,<br>
+ MatchResultListener* listener) const override {<br>
LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);<br>
::std::vector<LhsValue> sorted_container(lhs_stl_container.begin(),<br>
lhs_stl_container.end());<br>
@@ -3012,7 +2243,7 @@ class WhenSortedByMatcher {<br>
};<br>
<br>
// Implements Pointwise(tuple_matcher, rhs_container). tuple_matcher<br>
-// must be able to be safely cast to Matcher<tuple<const T1&, const<br>
+// must be able to be safely cast to Matcher<std::tuple<const T1&, const<br>
// T2&> >, where T1 and T2 are the types of elements in the LHS<br>
// container and the RHS container respectively.<br>
template <typename TupleMatcher, typename RhsContainer><br>
@@ -3026,15 +2257,15 @@ class PointwiseMatcher {<br>
typedef typename RhsView::type RhsStlContainer;<br>
typedef typename RhsStlContainer::value_type RhsValue;<br>
<br>
+ static_assert(!std::is_const<RhsContainer>::value,<br>
+ "RhsContainer type must not be const");<br>
+ static_assert(!std::is_reference<RhsContainer>::value,<br>
+ "RhsContainer type must not be a reference");<br>
+<br>
// Like ContainerEq, we make a copy of rhs in case the elements in<br>
// it are modified after this matcher is created.<br>
PointwiseMatcher(const TupleMatcher& tuple_matcher, const RhsContainer& rhs)<br>
- : tuple_matcher_(tuple_matcher), rhs_(RhsView::Copy(rhs)) {<br>
- // Makes sure the user doesn't instantiate this class template<br>
- // with a const or reference type.<br>
- (void)testing::StaticAssertTypeEq<RhsContainer,<br>
- GTEST_REMOVE_REFERENCE_AND_CONST_(RhsContainer)>();<br>
- }<br>
+ : tuple_matcher_(tuple_matcher), rhs_(RhsView::Copy(rhs)) {}<br>
<br>
template <typename LhsContainer><br>
operator Matcher<LhsContainer>() const {<br>
@@ -3042,7 +2273,8 @@ class PointwiseMatcher {<br>
!IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)>::value,<br>
use_UnorderedPointwise_with_hash_tables);<br>
<br>
- return MakeMatcher(new Impl<LhsContainer>(tuple_matcher_, rhs_));<br>
+ return Matcher<LhsContainer>(<br>
+ new Impl<const LhsContainer&>(tuple_matcher_, rhs_));<br>
}<br>
<br>
template <typename LhsContainer><br>
@@ -3057,21 +2289,21 @@ class PointwiseMatcher {<br>
// reference, as they may be expensive to copy. We must use tuple<br>
// instead of pair here, as a pair cannot hold references (C++ 98,<br>
// 20.2.2 [lib.pairs]).<br>
- typedef ::testing::tuple<const LhsValue&, const RhsValue&> InnerMatcherArg;<br>
+ typedef ::std::tuple<const LhsValue&, const RhsValue&> InnerMatcherArg;<br>
<br>
Impl(const TupleMatcher& tuple_matcher, const RhsStlContainer& rhs)<br>
// mono_tuple_matcher_ holds a monomorphic version of the tuple matcher.<br>
: mono_tuple_matcher_(SafeMatcherCast<InnerMatcherArg>(tuple_matcher)),<br>
rhs_(rhs) {}<br>
<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "contains " << rhs_.size()<br>
<< " values, where each value and its corresponding value in ";<br>
UniversalPrinter<RhsStlContainer>::Print(rhs_, os);<br>
*os << " ";<br>
mono_tuple_matcher_.DescribeTo(os);<br>
}<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "doesn't contain exactly " << rhs_.size()<br>
<< " values, or contains a value x at some index i"<br>
<< " where x and the i-th value of ";<br>
@@ -3080,8 +2312,8 @@ class PointwiseMatcher {<br>
mono_tuple_matcher_.DescribeNegationTo(os);<br>
}<br>
<br>
- virtual bool MatchAndExplain(LhsContainer lhs,<br>
- MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(LhsContainer lhs,<br>
+ MatchResultListener* listener) const override {<br>
LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);<br>
const size_t actual_size = lhs_stl_container.size();<br>
if (actual_size != rhs_.size()) {<br>
@@ -3188,18 +2420,18 @@ class ContainsMatcherImpl : public QuantifierMatcherImpl<Container> {<br>
: QuantifierMatcherImpl<Container>(inner_matcher) {}<br>
<br>
// Describes what this matcher does.<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "contains at least one element that ";<br>
this->inner_matcher_.DescribeTo(os);<br>
}<br>
<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "doesn't contain any element that ";<br>
this->inner_matcher_.DescribeTo(os);<br>
}<br>
<br>
- virtual bool MatchAndExplain(Container container,<br>
- MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(Container container,<br>
+ MatchResultListener* listener) const override {<br>
return this->MatchAndExplainImpl(false, container, listener);<br>
}<br>
<br>
@@ -3217,18 +2449,18 @@ class EachMatcherImpl : public QuantifierMatcherImpl<Container> {<br>
: QuantifierMatcherImpl<Container>(inner_matcher) {}<br>
<br>
// Describes what this matcher does.<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "only contains elements that ";<br>
this->inner_matcher_.DescribeTo(os);<br>
}<br>
<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "contains some element that ";<br>
this->inner_matcher_.DescribeNegationTo(os);<br>
}<br>
<br>
- virtual bool MatchAndExplain(Container container,<br>
- MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(Container container,<br>
+ MatchResultListener* listener) const override {<br>
return this->MatchAndExplainImpl(true, container, listener);<br>
}<br>
<br>
@@ -3244,7 +2476,8 @@ class ContainsMatcher {<br>
<br>
template <typename Container><br>
operator Matcher<Container>() const {<br>
- return MakeMatcher(new ContainsMatcherImpl<Container>(inner_matcher_));<br>
+ return Matcher<Container>(<br>
+ new ContainsMatcherImpl<const Container&>(inner_matcher_));<br>
}<br>
<br>
private:<br>
@@ -3261,7 +2494,8 @@ class EachMatcher {<br>
<br>
template <typename Container><br>
operator Matcher<Container>() const {<br>
- return MakeMatcher(new EachMatcherImpl<Container>(inner_matcher_));<br>
+ return Matcher<Container>(<br>
+ new EachMatcherImpl<const Container&>(inner_matcher_));<br>
}<br>
<br>
private:<br>
@@ -3274,7 +2508,6 @@ struct Rank1 {};<br>
struct Rank0 : Rank1 {};<br>
<br>
namespace pair_getters {<br>
-#if GTEST_LANG_CXX11<br>
using std::get;<br>
template <typename T><br>
auto First(T& x, Rank1) -> decltype(get<0>(x)) { // NOLINT<br>
@@ -3293,25 +2526,6 @@ template <typename T><br>
auto Second(T& x, Rank0) -> decltype((x.second)) { // NOLINT<br>
return x.second;<br>
}<br>
-#else<br>
-template <typename T><br>
-typename T::first_type& First(T& x, Rank0) { // NOLINT<br>
- return x.first;<br>
-}<br>
-template <typename T><br>
-const typename T::first_type& First(const T& x, Rank0) {<br>
- return x.first;<br>
-}<br>
-<br>
-template <typename T><br>
-typename T::second_type& Second(T& x, Rank0) { // NOLINT<br>
- return x.second;<br>
-}<br>
-template <typename T><br>
-const typename T::second_type& Second(const T& x, Rank0) {<br>
- return x.second;<br>
-}<br>
-#endif // GTEST_LANG_CXX11<br>
} // namespace pair_getters<br>
<br>
// Implements Key(inner_matcher) for the given argument pair type.<br>
@@ -3330,9 +2544,10 @@ class KeyMatcherImpl : public MatcherInterface<PairType> {<br>
testing::SafeMatcherCast<const KeyType&>(inner_matcher)) {<br>
}<br>
<br>
- // Returns true iff 'key_value.first' (the key) matches the inner matcher.<br>
- virtual bool MatchAndExplain(PairType key_value,<br>
- MatchResultListener* listener) const {<br>
+ // Returns true if and only if 'key_value.first' (the key) matches the inner<br>
+ // matcher.<br>
+ bool MatchAndExplain(PairType key_value,<br>
+ MatchResultListener* listener) const override {<br>
StringMatchResultListener inner_listener;<br>
const bool match = inner_matcher_.MatchAndExplain(<br>
pair_getters::First(key_value, Rank0()), &inner_listener);<br>
@@ -3344,13 +2559,13 @@ class KeyMatcherImpl : public MatcherInterface<PairType> {<br>
}<br>
<br>
// Describes what this matcher does.<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "has a key that ";<br>
inner_matcher_.DescribeTo(os);<br>
}<br>
<br>
// Describes what the negation of this matcher does.<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "doesn't have a key that ";<br>
inner_matcher_.DescribeTo(os);<br>
}<br>
@@ -3369,7 +2584,8 @@ class KeyMatcher {<br>
<br>
template <typename PairType><br>
operator Matcher<PairType>() const {<br>
- return MakeMatcher(new KeyMatcherImpl<PairType>(matcher_for_key_));<br>
+ return Matcher<PairType>(<br>
+ new KeyMatcherImpl<const PairType&>(matcher_for_key_));<br>
}<br>
<br>
private:<br>
@@ -3396,7 +2612,7 @@ class PairMatcherImpl : public MatcherInterface<PairType> {<br>
}<br>
<br>
// Describes what this matcher does.<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "has a first field that ";<br>
first_matcher_.DescribeTo(os);<br>
*os << ", and has a second field that ";<br>
@@ -3404,17 +2620,17 @@ class PairMatcherImpl : public MatcherInterface<PairType> {<br>
}<br>
<br>
// Describes what the negation of this matcher does.<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "has a first field that ";<br>
first_matcher_.DescribeNegationTo(os);<br>
*os << ", or has a second field that ";<br>
second_matcher_.DescribeNegationTo(os);<br>
}<br>
<br>
- // Returns true iff 'a_pair.first' matches first_matcher and 'a_pair.second'<br>
- // matches second_matcher.<br>
- virtual bool MatchAndExplain(PairType a_pair,<br>
- MatchResultListener* listener) const {<br>
+ // Returns true if and only if 'a_pair.first' matches first_matcher and<br>
+ // 'a_pair.second' matches second_matcher.<br>
+ bool MatchAndExplain(PairType a_pair,<br>
+ MatchResultListener* listener) const override {<br>
if (!listener->IsInterested()) {<br>
// If the listener is not interested, we don't need to construct the<br>
// explanation.<br>
@@ -3474,9 +2690,8 @@ class PairMatcher {<br>
<br>
template <typename PairType><br>
operator Matcher<PairType> () const {<br>
- return MakeMatcher(<br>
- new PairMatcherImpl<PairType>(<br>
- first_matcher_, second_matcher_));<br>
+ return Matcher<PairType>(<br>
+ new PairMatcherImpl<const PairType&>(first_matcher_, second_matcher_));<br>
}<br>
<br>
private:<br>
@@ -3509,7 +2724,7 @@ class ElementsAreMatcherImpl : public MatcherInterface<Container> {<br>
}<br>
<br>
// Describes what this matcher does.<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
if (count() == 0) {<br>
*os << "is empty";<br>
} else if (count() == 1) {<br>
@@ -3528,7 +2743,7 @@ class ElementsAreMatcherImpl : public MatcherInterface<Container> {<br>
}<br>
<br>
// Describes what the negation of this matcher does.<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
if (count() == 0) {<br>
*os << "isn't empty";<br>
return;<br>
@@ -3544,8 +2759,8 @@ class ElementsAreMatcherImpl : public MatcherInterface<Container> {<br>
}<br>
}<br>
<br>
- virtual bool MatchAndExplain(Container container,<br>
- MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(Container container,<br>
+ MatchResultListener* listener) const override {<br>
// To work with stream-like "containers", we must only walk<br>
// through the elements in one pass.<br>
<br>
@@ -3749,6 +2964,7 @@ class UnorderedElementsAreMatcherImpl<br>
public:<br>
typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;<br>
typedef internal::StlContainerView<RawContainer> View;<br>
+ typedef typename View::type StlContainer;<br>
typedef typename View::const_reference StlContainerReference;<br>
typedef decltype(std::begin(<br>
std::declval<StlContainerReference>())) StlContainerConstIterator;<br>
@@ -3766,17 +2982,17 @@ class UnorderedElementsAreMatcherImpl<br>
}<br>
<br>
// Describes what this matcher does.<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
return UnorderedElementsAreMatcherImplBase::DescribeToImpl(os);<br>
}<br>
<br>
// Describes what the negation of this matcher does.<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
return UnorderedElementsAreMatcherImplBase::DescribeNegationToImpl(os);<br>
}<br>
<br>
- virtual bool MatchAndExplain(Container container,<br>
- MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(Container container,<br>
+ MatchResultListener* listener) const override {<br>
StlContainerReference stl_container = View::ConstReference(container);<br>
::std::vector<std::string> element_printouts;<br>
MatchMatrix matrix =<br>
@@ -3864,11 +3080,13 @@ class UnorderedElementsAreMatcher {<br>
decltype(*std::declval<StlContainerConstIterator &>())>::type Element;<br>
typedef ::std::vector<Matcher<const Element&> > MatcherVec;<br>
MatcherVec matchers;<br>
- matchers.reserve(::testing::tuple_size<MatcherTuple>::value);<br>
+ matchers.reserve(::std::tuple_size<MatcherTuple>::value);<br>
TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,<br>
::std::back_inserter(matchers));<br>
- return MakeMatcher(new UnorderedElementsAreMatcherImpl<Container>(<br>
- UnorderedMatcherRequire::ExactMatch, matchers.begin(), matchers.end()));<br>
+ return Matcher<Container>(<br>
+ new UnorderedElementsAreMatcherImpl<const Container&>(<br>
+ UnorderedMatcherRequire::ExactMatch, matchers.begin(),<br>
+ matchers.end()));<br>
}<br>
<br>
private:<br>
@@ -3886,7 +3104,7 @@ class ElementsAreMatcher {<br>
operator Matcher<Container>() const {<br>
GTEST_COMPILE_ASSERT_(<br>
!IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>::value ||<br>
- ::testing::tuple_size<MatcherTuple>::value < 2,<br>
+ ::std::tuple_size<MatcherTuple>::value < 2,<br>
use_UnorderedElementsAre_with_hash_tables);<br>
<br>
typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;<br>
@@ -3898,11 +3116,11 @@ class ElementsAreMatcher {<br>
decltype(*std::declval<StlContainerConstIterator &>())>::type Element;<br>
typedef ::std::vector<Matcher<const Element&> > MatcherVec;<br>
MatcherVec matchers;<br>
- matchers.reserve(::testing::tuple_size<MatcherTuple>::value);<br>
+ matchers.reserve(::std::tuple_size<MatcherTuple>::value);<br>
TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,<br>
::std::back_inserter(matchers));<br>
- return MakeMatcher(new ElementsAreMatcherImpl<Container>(<br>
- matchers.begin(), matchers.end()));<br>
+ return Matcher<Container>(new ElementsAreMatcherImpl<const Container&>(<br>
+ matchers.begin(), matchers.end()));<br>
}<br>
<br>
private:<br>
@@ -3921,8 +3139,9 @@ class UnorderedElementsAreArrayMatcher {<br>
<br>
template <typename Container><br>
operator Matcher<Container>() const {<br>
- return MakeMatcher(new UnorderedElementsAreMatcherImpl<Container>(<br>
- match_flags_, matchers_.begin(), matchers_.end()));<br>
+ return Matcher<Container>(<br>
+ new UnorderedElementsAreMatcherImpl<const Container&>(<br>
+ match_flags_, matchers_.begin(), matchers_.end()));<br>
}<br>
<br>
private:<br>
@@ -3945,7 +3164,7 @@ class ElementsAreArrayMatcher {<br>
!IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>::value,<br>
use_UnorderedElementsAreArray_with_hash_tables);<br>
<br>
- return MakeMatcher(new ElementsAreMatcherImpl<Container>(<br>
+ return Matcher<Container>(new ElementsAreMatcherImpl<const Container&>(<br>
matchers_.begin(), matchers_.end()));<br>
}<br>
<br>
@@ -3957,8 +3176,8 @@ class ElementsAreArrayMatcher {<br>
<br>
// Given a 2-tuple matcher tm of type Tuple2Matcher and a value second<br>
// of type Second, BoundSecondMatcher<Tuple2Matcher, Second>(tm,<br>
-// second) is a polymorphic matcher that matches a value x iff tm<br>
-// matches tuple (x, second). Useful for implementing<br>
+// second) is a polymorphic matcher that matches a value x if and only if<br>
+// tm matches tuple (x, second). Useful for implementing<br>
// UnorderedPointwise() in terms of UnorderedElementsAreArray().<br>
//<br>
// BoundSecondMatcher is copyable and assignable, as we need to put<br>
@@ -3991,20 +3210,20 @@ class BoundSecondMatcher {<br>
template <typename T><br>
class Impl : public MatcherInterface<T> {<br>
public:<br>
- typedef ::testing::tuple<T, Second> ArgTuple;<br>
+ typedef ::std::tuple<T, Second> ArgTuple;<br>
<br>
Impl(const Tuple2Matcher& tm, const Second& second)<br>
: mono_tuple2_matcher_(SafeMatcherCast<const ArgTuple&>(tm)),<br>
second_value_(second) {}<br>
<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "and ";<br>
UniversalPrint(second_value_, os);<br>
*os << " ";<br>
mono_tuple2_matcher_.DescribeTo(os);<br>
}<br>
<br>
- virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(T x, MatchResultListener* listener) const override {<br>
return mono_tuple2_matcher_.MatchAndExplain(ArgTuple(x, second_value_),<br>
listener);<br>
}<br>
@@ -4022,8 +3241,8 @@ class BoundSecondMatcher {<br>
<br>
// Given a 2-tuple matcher tm and a value second,<br>
// MatcherBindSecond(tm, second) returns a matcher that matches a<br>
-// value x iff tm matches tuple (x, second). Useful for implementing<br>
-// UnorderedPointwise() in terms of UnorderedElementsAreArray().<br>
+// value x if and only if tm matches tuple (x, second). Useful for<br>
+// implementing UnorderedPointwise() in terms of UnorderedElementsAreArray().<br>
template <typename Tuple2Matcher, typename Second><br>
BoundSecondMatcher<Tuple2Matcher, Second> MatcherBindSecond(<br>
const Tuple2Matcher& tm, const Second& second) {<br>
@@ -4048,7 +3267,7 @@ class OptionalMatcher {<br>
<br>
template <typename Optional><br>
operator Matcher<Optional>() const {<br>
- return MakeMatcher(new Impl<Optional>(value_matcher_));<br>
+ return Matcher<Optional>(new Impl<const Optional&>(value_matcher_));<br>
}<br>
<br>
template <typename Optional><br>
@@ -4059,18 +3278,18 @@ class OptionalMatcher {<br>
explicit Impl(const ValueMatcher& value_matcher)<br>
: value_matcher_(MatcherCast<ValueType>(value_matcher)) {}<br>
<br>
- virtual void DescribeTo(::std::ostream* os) const {<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
*os << "value ";<br>
value_matcher_.DescribeTo(os);<br>
}<br>
<br>
- virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
*os << "value ";<br>
value_matcher_.DescribeNegationTo(os);<br>
}<br>
<br>
- virtual bool MatchAndExplain(Optional optional,<br>
- MatchResultListener* listener) const {<br>
+ bool MatchAndExplain(Optional optional,<br>
+ MatchResultListener* listener) const override {<br>
if (!optional) {<br>
*listener << "which is not engaged";<br>
return false;<br>
@@ -4106,11 +3325,12 @@ template <typename T><br>
class VariantMatcher {<br>
public:<br>
explicit VariantMatcher(::testing::Matcher<const T&> matcher)<br>
- : matcher_(internal::move(matcher)) {}<br>
+ : matcher_(std::move(matcher)) {}<br>
<br>
template <typename Variant><br>
bool MatchAndExplain(const Variant& value,<br>
::testing::MatchResultListener* listener) const {<br>
+ using std::get;<br>
if (!listener->IsInterested()) {<br>
return holds_alternative<T>(value) && matcher_.Matches(get<T>(value));<br>
}<br>
@@ -4173,11 +3393,11 @@ class AnyCastMatcher {<br>
::testing::MatchResultListener* listener) const {<br>
if (!listener->IsInterested()) {<br>
const T* ptr = any_cast<T>(&value);<br>
- return ptr != NULL && matcher_.Matches(*ptr);<br>
+ return ptr != nullptr && matcher_.Matches(*ptr);<br>
}<br>
<br>
const T* elem = any_cast<T>(&value);<br>
- if (elem == NULL) {<br>
+ if (elem == nullptr) {<br>
*listener << "whose value is not of type '" << GetTypeName() << "'";<br>
return false;<br>
}<br>
@@ -4215,6 +3435,80 @@ class AnyCastMatcher {<br>
};<br>
<br>
} // namespace any_cast_matcher<br>
+<br>
+// Implements the Args() matcher.<br>
+template <class ArgsTuple, size_t... k><br>
+class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {<br>
+ public:<br>
+ using RawArgsTuple = typename std::decay<ArgsTuple>::type;<br>
+ using SelectedArgs =<br>
+ std::tuple<typename std::tuple_element<k, RawArgsTuple>::type...>;<br>
+ using MonomorphicInnerMatcher = Matcher<const SelectedArgs&>;<br>
+<br>
+ template <typename InnerMatcher><br>
+ explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher)<br>
+ : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}<br>
+<br>
+ bool MatchAndExplain(ArgsTuple args,<br>
+ MatchResultListener* listener) const override {<br>
+ // Workaround spurious C4100 on MSVC<=15.7 when k is empty.<br>
+ (void)args;<br>
+ const SelectedArgs& selected_args =<br>
+ std::forward_as_tuple(std::get<k>(args)...);<br>
+ if (!listener->IsInterested()) return inner_matcher_.Matches(selected_args);<br>
+<br>
+ PrintIndices(listener->stream());<br>
+ *listener << "are " << PrintToString(selected_args);<br>
+<br>
+ StringMatchResultListener inner_listener;<br>
+ const bool match =<br>
+ inner_matcher_.MatchAndExplain(selected_args, &inner_listener);<br>
+ PrintIfNotEmpty(inner_listener.str(), listener->stream());<br>
+ return match;<br>
+ }<br>
+<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
+ *os << "are a tuple ";<br>
+ PrintIndices(os);<br>
+ inner_matcher_.DescribeTo(os);<br>
+ }<br>
+<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
+ *os << "are a tuple ";<br>
+ PrintIndices(os);<br>
+ inner_matcher_.DescribeNegationTo(os);<br>
+ }<br>
+<br>
+ private:<br>
+ // Prints the indices of the selected fields.<br>
+ static void PrintIndices(::std::ostream* os) {<br>
+ *os << "whose fields (";<br>
+ const char* sep = "";<br>
+ // Workaround spurious C4189 on MSVC<=15.7 when k is empty.<br>
+ (void)sep;<br>
+ const char* dummy[] = {"", (*os << sep << "#" << k, sep = ", ")...};<br>
+ (void)dummy;<br>
+ *os << ") ";<br>
+ }<br>
+<br>
+ MonomorphicInnerMatcher inner_matcher_;<br>
+};<br>
+<br>
+template <class InnerMatcher, size_t... k><br>
+class ArgsMatcher {<br>
+ public:<br>
+ explicit ArgsMatcher(InnerMatcher inner_matcher)<br>
+ : inner_matcher_(std::move(inner_matcher)) {}<br>
+<br>
+ template <typename ArgsTuple><br>
+ operator Matcher<ArgsTuple>() const { // NOLINT<br>
+ return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k...>(inner_matcher_));<br>
+ }<br>
+<br>
+ private:<br>
+ InnerMatcher inner_matcher_;<br>
+};<br>
+<br>
} // namespace internal<br>
<br>
// ElementsAreArray(iterator_first, iterator_last)<br>
@@ -4258,13 +3552,11 @@ ElementsAreArray(const Container& container) {<br>
return ElementsAreArray(container.begin(), container.end());<br>
}<br>
<br>
-#if GTEST_HAS_STD_INITIALIZER_LIST_<br>
template <typename T><br>
inline internal::ElementsAreArrayMatcher<T><br>
ElementsAreArray(::std::initializer_list<T> xs) {<br>
return ElementsAreArray(xs.begin(), xs.end());<br>
}<br>
-#endif<br>
<br>
// UnorderedElementsAreArray(iterator_first, iterator_last)<br>
// UnorderedElementsAreArray(pointer, count)<br>
@@ -4307,13 +3599,11 @@ UnorderedElementsAreArray(const Container& container) {<br>
return UnorderedElementsAreArray(container.begin(), container.end());<br>
}<br>
<br>
-#if GTEST_HAS_STD_INITIALIZER_LIST_<br>
template <typename T><br>
inline internal::UnorderedElementsAreArrayMatcher<T><br>
UnorderedElementsAreArray(::std::initializer_list<T> xs) {<br>
return UnorderedElementsAreArray(xs.begin(), xs.end());<br>
}<br>
-#endif<br>
<br>
// _ is a matcher that matches anything of any type.<br>
//<br>
@@ -4335,70 +3625,13 @@ inline Matcher<T> A() {<br>
template <typename T><br>
inline Matcher<T> An() { return A<T>(); }<br>
<br>
-// Creates a polymorphic matcher that matches anything equal to x.<br>
-// Note: if the parameter of Eq() were declared as const T&, Eq("foo")<br>
-// wouldn't compile.<br>
-template <typename T><br>
-inline internal::EqMatcher<T> Eq(T x) { return internal::EqMatcher<T>(x); }<br>
-<br>
-// Constructs a Matcher<T> from a 'value' of type T. The constructed<br>
-// matcher matches any value that's equal to 'value'.<br>
-template <typename T><br>
-Matcher<T>::Matcher(T value) { *this = Eq(value); }<br>
-<br>
template <typename T, typename M><br>
Matcher<T> internal::MatcherCastImpl<T, M>::CastImpl(<br>
- const M& value,<br>
- internal::BooleanConstant<false> /* convertible_to_matcher */,<br>
- internal::BooleanConstant<false> /* convertible_to_T */) {<br>
+ const M& value, std::false_type /* convertible_to_matcher */,<br>
+ std::false_type /* convertible_to_T */) {<br>
return Eq(value);<br>
}<br>
<br>
-// Creates a monomorphic matcher that matches anything with type Lhs<br>
-// and equal to rhs. A user may need to use this instead of Eq(...)<br>
-// in order to resolve an overloading ambiguity.<br>
-//<br>
-// TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x))<br>
-// or Matcher<T>(x), but more readable than the latter.<br>
-//<br>
-// We could define similar monomorphic matchers for other comparison<br>
-// operations (e.g. TypedLt, TypedGe, and etc), but decided not to do<br>
-// it yet as those are used much less than Eq() in practice. A user<br>
-// can always write Matcher<T>(Lt(5)) to be explicit about the type,<br>
-// for example.<br>
-template <typename Lhs, typename Rhs><br>
-inline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); }<br>
-<br>
-// Creates a polymorphic matcher that matches anything >= x.<br>
-template <typename Rhs><br>
-inline internal::GeMatcher<Rhs> Ge(Rhs x) {<br>
- return internal::GeMatcher<Rhs>(x);<br>
-}<br>
-<br>
-// Creates a polymorphic matcher that matches anything > x.<br>
-template <typename Rhs><br>
-inline internal::GtMatcher<Rhs> Gt(Rhs x) {<br>
- return internal::GtMatcher<Rhs>(x);<br>
-}<br>
-<br>
-// Creates a polymorphic matcher that matches anything <= x.<br>
-template <typename Rhs><br>
-inline internal::LeMatcher<Rhs> Le(Rhs x) {<br>
- return internal::LeMatcher<Rhs>(x);<br>
-}<br>
-<br>
-// Creates a polymorphic matcher that matches anything < x.<br>
-template <typename Rhs><br>
-inline internal::LtMatcher<Rhs> Lt(Rhs x) {<br>
- return internal::LtMatcher<Rhs>(x);<br>
-}<br>
-<br>
-// Creates a polymorphic matcher that matches anything != x.<br>
-template <typename Rhs><br>
-inline internal::NeMatcher<Rhs> Ne(Rhs x) {<br>
- return internal::NeMatcher<Rhs>(x);<br>
-}<br>
-<br>
// Creates a polymorphic matcher that matches any NULL pointer.<br>
inline PolymorphicMatcher<internal::IsNullMatcher > IsNull() {<br>
return MakePolymorphicMatcher(internal::IsNullMatcher());<br>
@@ -4500,7 +3733,7 @@ WhenDynamicCastTo(const Matcher<To>& inner_matcher) {<br>
// Creates a matcher that matches an object whose given field matches<br>
// 'matcher'. For example,<br>
// Field(&Foo::number, Ge(5))<br>
-// matches a Foo object x iff x.number >= 5.<br>
+// matches a Foo object x if and only if x.number >= 5.<br>
template <typename Class, typename FieldType, typename FieldMatcher><br>
inline PolymorphicMatcher<<br>
internal::FieldMatcher<Class, FieldType> > Field(<br>
@@ -4527,7 +3760,7 @@ inline PolymorphicMatcher<internal::FieldMatcher<Class, FieldType> > Field(<br>
// Creates a matcher that matches an object whose given property<br>
// matches 'matcher'. For example,<br>
// Property(&Foo::str, StartsWith("hi"))<br>
-// matches a Foo object x iff x.str() starts with "hi".<br>
+// matches a Foo object x if and only if x.str() starts with "hi".<br>
template <typename Class, typename PropertyType, typename PropertyMatcher><br>
inline PolymorphicMatcher<internal::PropertyMatcher<<br>
Class, PropertyType, PropertyType (Class::*)() const> ><br>
@@ -4536,8 +3769,7 @@ Property(PropertyType (Class::*property)() const,<br>
return MakePolymorphicMatcher(<br>
internal::PropertyMatcher<Class, PropertyType,<br>
PropertyType (Class::*)() const>(<br>
- property,<br>
- MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher)));<br>
+ property, MatcherCast<const PropertyType&>(matcher)));<br>
// The call to MatcherCast() is required for supporting inner<br>
// matchers of compatible types. For example, it allows<br>
// Property(&Foo::bar, m)<br>
@@ -4555,11 +3787,9 @@ Property(const std::string& property_name,<br>
return MakePolymorphicMatcher(<br>
internal::PropertyMatcher<Class, PropertyType,<br>
PropertyType (Class::*)() const>(<br>
- property_name, property,<br>
- MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher)));<br>
+ property_name, property, MatcherCast<const PropertyType&>(matcher)));<br>
}<br>
<br>
-#if GTEST_LANG_CXX11<br>
// The same as above but for reference-qualified member functions.<br>
template <typename Class, typename PropertyType, typename PropertyMatcher><br>
inline PolymorphicMatcher<internal::PropertyMatcher<<br>
@@ -4568,9 +3798,8 @@ Property(PropertyType (Class::*property)() const &,<br>
const PropertyMatcher& matcher) {<br>
return MakePolymorphicMatcher(<br>
internal::PropertyMatcher<Class, PropertyType,<br>
- PropertyType (Class::*)() const &>(<br>
- property,<br>
- MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher)));<br>
+ PropertyType (Class::*)() const&>(<br>
+ property, MatcherCast<const PropertyType&>(matcher)));<br>
}<br>
<br>
// Three-argument form for reference-qualified member functions.<br>
@@ -4582,17 +3811,14 @@ Property(const std::string& property_name,<br>
const PropertyMatcher& matcher) {<br>
return MakePolymorphicMatcher(<br>
internal::PropertyMatcher<Class, PropertyType,<br>
- PropertyType (Class::*)() const &>(<br>
- property_name, property,<br>
- MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher)));<br>
+ PropertyType (Class::*)() const&>(<br>
+ property_name, property, MatcherCast<const PropertyType&>(matcher)));<br>
}<br>
-#endif<br>
<br>
-// Creates a matcher that matches an object iff the result of applying<br>
-// a callable to x matches 'matcher'.<br>
-// For example,<br>
+// Creates a matcher that matches an object if and only if the result of<br>
+// applying a callable to x matches 'matcher'. For example,<br>
// ResultOf(f, StartsWith("hi"))<br>
-// matches a Foo object x iff f(x) starts with "hi".<br>
+// matches a Foo object x if and only if f(x) starts with "hi".<br>
// `callable` parameter can be a function, function pointer, or a functor. It is<br>
// required to keep no state affecting the results of the calls on it and make<br>
// no assumptions about how many calls will be made. Any state it keeps must be<br>
@@ -4601,7 +3827,7 @@ template <typename Callable, typename InnerMatcher><br>
internal::ResultOfMatcher<Callable, InnerMatcher> ResultOf(<br>
Callable callable, InnerMatcher matcher) {<br>
return internal::ResultOfMatcher<Callable, InnerMatcher>(<br>
- internal::move(callable), internal::move(matcher));<br>
+ std::move(callable), std::move(matcher));<br>
}<br>
<br>
// String matchers.<br>
@@ -4655,29 +3881,7 @@ inline PolymorphicMatcher<internal::EndsWithMatcher<std::string> > EndsWith(<br>
return MakePolymorphicMatcher(internal::EndsWithMatcher<std::string>(suffix));<br>
}<br>
<br>
-// Matches a string that fully matches regular expression 'regex'.<br>
-// The matcher takes ownership of 'regex'.<br>
-inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(<br>
- const internal::RE* regex) {<br>
- return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true));<br>
-}<br>
-inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(<br>
- const std::string& regex) {<br>
- return MatchesRegex(new internal::RE(regex));<br>
-}<br>
-<br>
-// Matches a string that contains regular expression 'regex'.<br>
-// The matcher takes ownership of 'regex'.<br>
-inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(<br>
- const internal::RE* regex) {<br>
- return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false));<br>
-}<br>
-inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(<br>
- const std::string& regex) {<br>
- return ContainsRegex(new internal::RE(regex));<br>
-}<br>
-<br>
-#if GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING<br>
+#if GTEST_HAS_STD_WSTRING<br>
// Wide string matchers.<br>
<br>
// Matches a string equal to str.<br>
@@ -4730,7 +3934,7 @@ inline PolymorphicMatcher<internal::EndsWithMatcher<std::wstring> > EndsWith(<br>
internal::EndsWithMatcher<std::wstring>(suffix));<br>
}<br>
<br>
-#endif // GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING<br>
+#endif // GTEST_HAS_STD_WSTRING<br>
<br>
// Creates a polymorphic matcher that matches a 2-tuple where the<br>
// first field == the second field.<br>
@@ -4852,12 +4056,12 @@ BeginEndDistanceIs(const DistanceMatcher& distance_matcher) {<br>
// values that are included in one container but not the other. (Duplicate<br>
// values and order <br>
diff erences are not explained.)<br>
template <typename Container><br>
-inline PolymorphicMatcher<internal::ContainerEqMatcher< // NOLINT<br>
- GTEST_REMOVE_CONST_(Container)> ><br>
- ContainerEq(const Container& rhs) {<br>
+inline PolymorphicMatcher<internal::ContainerEqMatcher<<br>
+ typename std::remove_const<Container>::type>><br>
+ContainerEq(const Container& rhs) {<br>
// This following line is for working around a bug in MSVC 8.0,<br>
// which causes Container to be a const type sometimes.<br>
- typedef GTEST_REMOVE_CONST_(Container) RawContainer;<br>
+ typedef typename std::remove_const<Container>::type RawContainer;<br>
return MakePolymorphicMatcher(<br>
internal::ContainerEqMatcher<RawContainer>(rhs));<br>
}<br>
@@ -4885,22 +4089,21 @@ WhenSorted(const ContainerMatcher& container_matcher) {<br>
// Matches an STL-style container or a native array that contains the<br>
// same number of elements as in rhs, where its i-th element and rhs's<br>
// i-th element (as a pair) satisfy the given pair matcher, for all i.<br>
-// TupleMatcher must be able to be safely cast to Matcher<tuple<const<br>
+// TupleMatcher must be able to be safely cast to Matcher<std::tuple<const<br>
// T1&, const T2&> >, where T1 and T2 are the types of elements in the<br>
// LHS container and the RHS container respectively.<br>
template <typename TupleMatcher, typename Container><br>
inline internal::PointwiseMatcher<TupleMatcher,<br>
- GTEST_REMOVE_CONST_(Container)><br>
+ typename std::remove_const<Container>::type><br>
Pointwise(const TupleMatcher& tuple_matcher, const Container& rhs) {<br>
// This following line is for working around a bug in MSVC 8.0,<br>
// which causes Container to be a const type sometimes (e.g. when<br>
// rhs is a const int[])..<br>
- typedef GTEST_REMOVE_CONST_(Container) RawContainer;<br>
+ typedef typename std::remove_const<Container>::type RawContainer;<br>
return internal::PointwiseMatcher<TupleMatcher, RawContainer>(<br>
tuple_matcher, rhs);<br>
}<br>
<br>
-#if GTEST_HAS_STD_INITIALIZER_LIST_<br>
<br>
// Supports the Pointwise(m, {a, b, c}) syntax.<br>
template <typename TupleMatcher, typename T><br>
@@ -4909,14 +4112,13 @@ inline internal::PointwiseMatcher<TupleMatcher, std::vector<T> > Pointwise(<br>
return Pointwise(tuple_matcher, std::vector<T>(rhs));<br>
}<br>
<br>
-#endif // GTEST_HAS_STD_INITIALIZER_LIST_<br>
<br>
// UnorderedPointwise(pair_matcher, rhs) matches an STL-style<br>
// container or a native array that contains the same number of<br>
// elements as in rhs, where in some permutation of the container, its<br>
// i-th element and rhs's i-th element (as a pair) satisfy the given<br>
// pair matcher, for all i. Tuple2Matcher must be able to be safely<br>
-// cast to Matcher<tuple<const T1&, const T2&> >, where T1 and T2 are<br>
+// cast to Matcher<std::tuple<const T1&, const T2&> >, where T1 and T2 are<br>
// the types of elements in the LHS container and the RHS container<br>
// respectively.<br>
//<br>
@@ -4925,14 +4127,15 @@ inline internal::PointwiseMatcher<TupleMatcher, std::vector<T> > Pointwise(<br>
template <typename Tuple2Matcher, typename RhsContainer><br>
inline internal::UnorderedElementsAreArrayMatcher<<br>
typename internal::BoundSecondMatcher<<br>
- Tuple2Matcher, typename internal::StlContainerView<GTEST_REMOVE_CONST_(<br>
- RhsContainer)>::type::value_type> ><br>
+ Tuple2Matcher,<br>
+ typename internal::StlContainerView<<br>
+ typename std::remove_const<RhsContainer>::type>::type::value_type>><br>
UnorderedPointwise(const Tuple2Matcher& tuple2_matcher,<br>
const RhsContainer& rhs_container) {<br>
// This following line is for working around a bug in MSVC 8.0,<br>
// which causes RhsContainer to be a const type sometimes (e.g. when<br>
// rhs_container is a const int[]).<br>
- typedef GTEST_REMOVE_CONST_(RhsContainer) RawRhsContainer;<br>
+ typedef typename std::remove_const<RhsContainer>::type RawRhsContainer;<br>
<br>
// RhsView allows the same code to handle RhsContainer being a<br>
// STL-style container and it being a native C-style array.<br>
@@ -4954,7 +4157,6 @@ UnorderedPointwise(const Tuple2Matcher& tuple2_matcher,<br>
return UnorderedElementsAreArray(matchers);<br>
}<br>
<br>
-#if GTEST_HAS_STD_INITIALIZER_LIST_<br>
<br>
// Supports the UnorderedPointwise(m, {a, b, c}) syntax.<br>
template <typename Tuple2Matcher, typename T><br>
@@ -4965,7 +4167,6 @@ UnorderedPointwise(const Tuple2Matcher& tuple2_matcher,<br>
return UnorderedPointwise(tuple2_matcher, std::vector<T>(rhs));<br>
}<br>
<br>
-#endif // GTEST_HAS_STD_INITIALIZER_LIST_<br>
<br>
// Matches an STL-style container or a native array that contains at<br>
// least one element matching the given value or matcher.<br>
@@ -5045,13 +4246,11 @@ IsSupersetOf(const Container& container) {<br>
return IsSupersetOf(container.begin(), container.end());<br>
}<br>
<br>
-#if GTEST_HAS_STD_INITIALIZER_LIST_<br>
template <typename T><br>
inline internal::UnorderedElementsAreArrayMatcher<T> IsSupersetOf(<br>
::std::initializer_list<T> xs) {<br>
return IsSupersetOf(xs.begin(), xs.end());<br>
}<br>
-#endif<br>
<br>
// IsSubsetOf(iterator_first, iterator_last)<br>
// IsSubsetOf(pointer, count)<br>
@@ -5104,13 +4303,11 @@ IsSubsetOf(const Container& container) {<br>
return IsSubsetOf(container.begin(), container.end());<br>
}<br>
<br>
-#if GTEST_HAS_STD_INITIALIZER_LIST_<br>
template <typename T><br>
inline internal::UnorderedElementsAreArrayMatcher<T> IsSubsetOf(<br>
::std::initializer_list<T> xs) {<br>
return IsSubsetOf(xs.begin(), xs.end());<br>
}<br>
-#endif<br>
<br>
// Matches an STL-style container or a native array that contains only<br>
// elements matching the given value or matcher.<br>
@@ -5171,7 +4368,7 @@ inline internal::MatcherAsPredicate<M> Matches(M matcher) {<br>
return internal::MatcherAsPredicate<M>(matcher);<br>
}<br>
<br>
-// Returns true iff the value matches the matcher.<br>
+// Returns true if and only if the value matches the matcher.<br>
template <typename T, typename M><br>
inline bool Value(const T& value, M matcher) {<br>
return testing::Matches(matcher)(value);<br>
@@ -5207,9 +4404,25 @@ std::string DescribeMatcher(const M& matcher, bool negation = false) {<br>
return ss.str();<br>
}<br>
<br>
-#if GTEST_LANG_CXX11<br>
-// Define variadic matcher versions. They are overloaded in<br>
-// gmock-generated-matchers.h for the cases supported by pre C++11 compilers.<br>
+template <typename... Args><br>
+internal::ElementsAreMatcher<<br>
+ std::tuple<typename std::decay<const Args&>::type...>><br>
+ElementsAre(const Args&... matchers) {<br>
+ return internal::ElementsAreMatcher<<br>
+ std::tuple<typename std::decay<const Args&>::type...>>(<br>
+ std::make_tuple(matchers...));<br>
+}<br>
+<br>
+template <typename... Args><br>
+internal::UnorderedElementsAreMatcher<<br>
+ std::tuple<typename std::decay<const Args&>::type...>><br>
+UnorderedElementsAre(const Args&... matchers) {<br>
+ return internal::UnorderedElementsAreMatcher<<br>
+ std::tuple<typename std::decay<const Args&>::type...>>(<br>
+ std::make_tuple(matchers...));<br>
+}<br>
+<br>
+// Define variadic matcher versions.<br>
template <typename... Args><br>
internal::AllOfMatcher<typename std::decay<const Args&>::type...> AllOf(<br>
const Args&... matchers) {<br>
@@ -5224,24 +4437,97 @@ internal::AnyOfMatcher<typename std::decay<const Args&>::type...> AnyOf(<br>
matchers...);<br>
}<br>
<br>
-template <typename... Args><br>
-internal::ElementsAreMatcher<tuple<typename std::decay<const Args&>::type...>><br>
-ElementsAre(const Args&... matchers) {<br>
- return internal::ElementsAreMatcher<<br>
- tuple<typename std::decay<const Args&>::type...>>(<br>
- make_tuple(matchers...));<br>
+// AnyOfArray(array)<br>
+// AnyOfArray(pointer, count)<br>
+// AnyOfArray(container)<br>
+// AnyOfArray({ e1, e2, ..., en })<br>
+// AnyOfArray(iterator_first, iterator_last)<br>
+//<br>
+// AnyOfArray() verifies whether a given value matches any member of a<br>
+// collection of matchers.<br>
+//<br>
+// AllOfArray(array)<br>
+// AllOfArray(pointer, count)<br>
+// AllOfArray(container)<br>
+// AllOfArray({ e1, e2, ..., en })<br>
+// AllOfArray(iterator_first, iterator_last)<br>
+//<br>
+// AllOfArray() verifies whether a given value matches all members of a<br>
+// collection of matchers.<br>
+//<br>
+// The matchers can be specified as an array, a pointer and count, a container,<br>
+// an initializer list, or an STL iterator range. In each of these cases, the<br>
+// underlying matchers can be either values or matchers.<br>
+<br>
+template <typename Iter><br>
+inline internal::AnyOfArrayMatcher<<br>
+ typename ::std::iterator_traits<Iter>::value_type><br>
+AnyOfArray(Iter first, Iter last) {<br>
+ return internal::AnyOfArrayMatcher<<br>
+ typename ::std::iterator_traits<Iter>::value_type>(first, last);<br>
}<br>
<br>
-template <typename... Args><br>
-internal::UnorderedElementsAreMatcher<<br>
- tuple<typename std::decay<const Args&>::type...>><br>
-UnorderedElementsAre(const Args&... matchers) {<br>
- return internal::UnorderedElementsAreMatcher<<br>
- tuple<typename std::decay<const Args&>::type...>>(<br>
- make_tuple(matchers...));<br>
+template <typename Iter><br>
+inline internal::AllOfArrayMatcher<<br>
+ typename ::std::iterator_traits<Iter>::value_type><br>
+AllOfArray(Iter first, Iter last) {<br>
+ return internal::AllOfArrayMatcher<<br>
+ typename ::std::iterator_traits<Iter>::value_type>(first, last);<br>
}<br>
<br>
-#endif // GTEST_LANG_CXX11<br>
+template <typename T><br>
+inline internal::AnyOfArrayMatcher<T> AnyOfArray(const T* ptr, size_t count) {<br>
+ return AnyOfArray(ptr, ptr + count);<br>
+}<br>
+<br>
+template <typename T><br>
+inline internal::AllOfArrayMatcher<T> AllOfArray(const T* ptr, size_t count) {<br>
+ return AllOfArray(ptr, ptr + count);<br>
+}<br>
+<br>
+template <typename T, size_t N><br>
+inline internal::AnyOfArrayMatcher<T> AnyOfArray(const T (&array)[N]) {<br>
+ return AnyOfArray(array, N);<br>
+}<br>
+<br>
+template <typename T, size_t N><br>
+inline internal::AllOfArrayMatcher<T> AllOfArray(const T (&array)[N]) {<br>
+ return AllOfArray(array, N);<br>
+}<br>
+<br>
+template <typename Container><br>
+inline internal::AnyOfArrayMatcher<typename Container::value_type> AnyOfArray(<br>
+ const Container& container) {<br>
+ return AnyOfArray(container.begin(), container.end());<br>
+}<br>
+<br>
+template <typename Container><br>
+inline internal::AllOfArrayMatcher<typename Container::value_type> AllOfArray(<br>
+ const Container& container) {<br>
+ return AllOfArray(container.begin(), container.end());<br>
+}<br>
+<br>
+template <typename T><br>
+inline internal::AnyOfArrayMatcher<T> AnyOfArray(<br>
+ ::std::initializer_list<T> xs) {<br>
+ return AnyOfArray(xs.begin(), xs.end());<br>
+}<br>
+<br>
+template <typename T><br>
+inline internal::AllOfArrayMatcher<T> AllOfArray(<br>
+ ::std::initializer_list<T> xs) {<br>
+ return AllOfArray(xs.begin(), xs.end());<br>
+}<br>
+<br>
+// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected<br>
+// fields of it matches a_matcher. C++ doesn't support default<br>
+// arguments for function templates, so we have to overload it.<br>
+template <size_t... k, typename InnerMatcher><br>
+internal::ArgsMatcher<typename std::decay<InnerMatcher>::type, k...> Args(<br>
+ InnerMatcher&& matcher) {<br>
+ return internal::ArgsMatcher<typename std::decay<InnerMatcher>::type, k...>(<br>
+ std::forward<InnerMatcher>(matcher));<br>
+}<br>
<br>
// AllArgs(m) is a synonym of m. This is useful in<br>
//<br>
@@ -5288,8 +4574,8 @@ PolymorphicMatcher<internal::variant_matcher::VariantMatcher<T> > VariantWith(<br>
<br>
// These macros allow using matchers to check values in Google Test<br>
// tests. ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher)<br>
-// succeed iff the value matches the matcher. If the assertion fails,<br>
-// the value and the description of the matcher will be printed.<br>
+// succeed if and only if the value matches the matcher. If the assertion<br>
+// fails, the value and the description of the matcher will be printed.<br>
#define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\<br>
::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)<br>
#define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\<br>
@@ -5297,14 +4583,14 @@ PolymorphicMatcher<internal::variant_matcher::VariantMatcher<T> > VariantWith(<br>
<br>
} // namespace testing<br>
<br>
-GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 5046<br>
-<br>
#ifdef __clang__<br>
#if __has_warning("-Wdeprecated-copy")<br>
#pragma clang diagnostic pop<br>
#endif<br>
#endif<br>
<br>
+GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 5046<br>
+<br>
// Include any custom callback matchers added by the local installation.<br>
// We must include this header at the end to make sure it can use the<br>
// declarations from this file.<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-more-actions.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-more-actions.h<br>
index 632a54cb8ab1b..56de2d10681a0 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-more-actions.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-more-actions.h<br>
@@ -40,59 +40,13 @@<br>
#define GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_<br>
<br>
#include <algorithm><br>
+#include <type_traits><br>
<br>
#include "gmock/gmock-generated-actions.h"<br>
<br>
namespace testing {<br>
namespace internal {<br>
<br>
-// Implements the Invoke(f) action. The template argument<br>
-// FunctionImpl is the implementation type of f, which can be either a<br>
-// function pointer or a functor. Invoke(f) can be used as an<br>
-// Action<F> as long as f's type is compatible with F (i.e. f can be<br>
-// assigned to a tr1::function<F>).<br>
-template <typename FunctionImpl><br>
-class InvokeAction {<br>
- public:<br>
- // The c'tor makes a copy of function_impl (either a function<br>
- // pointer or a functor).<br>
- explicit InvokeAction(FunctionImpl function_impl)<br>
- : function_impl_(function_impl) {}<br>
-<br>
- template <typename Result, typename ArgumentTuple><br>
- Result Perform(const ArgumentTuple& args) {<br>
- return InvokeHelper<Result, ArgumentTuple>::Invoke(function_impl_, args);<br>
- }<br>
-<br>
- private:<br>
- FunctionImpl function_impl_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(InvokeAction);<br>
-};<br>
-<br>
-// Implements the Invoke(object_ptr, &Class::Method) action.<br>
-template <class Class, typename MethodPtr><br>
-class InvokeMethodAction {<br>
- public:<br>
- InvokeMethodAction(Class* obj_ptr, MethodPtr method_ptr)<br>
- : method_ptr_(method_ptr), obj_ptr_(obj_ptr) {}<br>
-<br>
- template <typename Result, typename ArgumentTuple><br>
- Result Perform(const ArgumentTuple& args) const {<br>
- return InvokeHelper<Result, ArgumentTuple>::InvokeMethod(<br>
- obj_ptr_, method_ptr_, args);<br>
- }<br>
-<br>
- private:<br>
- // The order of these members matters. Reversing the order can trigger<br>
- // warning C4121 in MSVC (see<br>
- // <a href="http://computer-programming-forum.com/7-vc.net/6fbc30265f860ad1.htm" rel="noreferrer" target="_blank">http://computer-programming-forum.com/7-vc.net/6fbc30265f860ad1.htm</a> ).<br>
- const MethodPtr method_ptr_;<br>
- Class* const obj_ptr_;<br>
-<br>
- GTEST_DISALLOW_ASSIGN_(InvokeMethodAction);<br>
-};<br>
-<br>
// An internal replacement for std::copy which mimics its behavior. This is<br>
// necessary because Visual Studio deprecates ::std::copy, issuing warning 4996.<br>
// However Visual Studio 2010 and later do not honor #pragmas which disable that<br>
@@ -111,45 +65,6 @@ inline OutputIterator CopyElements(InputIterator first,<br>
<br>
// Various overloads for Invoke().<br>
<br>
-// Creates an action that invokes 'function_impl' with the mock<br>
-// function's arguments.<br>
-template <typename FunctionImpl><br>
-PolymorphicAction<internal::InvokeAction<FunctionImpl> > Invoke(<br>
- FunctionImpl function_impl) {<br>
- return MakePolymorphicAction(<br>
- internal::InvokeAction<FunctionImpl>(function_impl));<br>
-}<br>
-<br>
-// Creates an action that invokes the given method on the given object<br>
-// with the mock function's arguments.<br>
-template <class Class, typename MethodPtr><br>
-PolymorphicAction<internal::InvokeMethodAction<Class, MethodPtr> > Invoke(<br>
- Class* obj_ptr, MethodPtr method_ptr) {<br>
- return MakePolymorphicAction(<br>
- internal::InvokeMethodAction<Class, MethodPtr>(obj_ptr, method_ptr));<br>
-}<br>
-<br>
-// WithoutArgs(inner_action) can be used in a mock function with a<br>
-// non-empty argument list to perform inner_action, which takes no<br>
-// argument. In other words, it adapts an action accepting no<br>
-// argument to one that accepts (and ignores) arguments.<br>
-template <typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction><br>
-WithoutArgs(const InnerAction& action) {<br>
- return internal::WithArgsAction<InnerAction>(action);<br>
-}<br>
-<br>
-// WithArg<k>(an_action) creates an action that passes the k-th<br>
-// (0-based) argument of the mock function to an_action and performs<br>
-// it. It adapts an action accepting one argument to one that accepts<br>
-// multiple arguments. For convenience, we also provide<br>
-// WithArgs<k>(an_action) (defined below) as a synonym.<br>
-template <int k, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k><br>
-WithArg(const InnerAction& action) {<br>
- return internal::WithArgsAction<InnerAction, k>(action);<br>
-}<br>
-<br>
// The ACTION*() macros trigger warning C4100 (unreferenced formal<br>
// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in<br>
// the macro definition, as the warnings are generated when the macro<br>
@@ -164,7 +79,7 @@ WithArg(const InnerAction& action) {<br>
ACTION_TEMPLATE(ReturnArg,<br>
HAS_1_TEMPLATE_PARAMS(int, k),<br>
AND_0_VALUE_PARAMS()) {<br>
- return ::testing::get<k>(args);<br>
+ return ::std::get<k>(args);<br>
}<br>
<br>
// Action SaveArg<k>(pointer) saves the k-th (0-based) argument of the<br>
@@ -172,7 +87,7 @@ ACTION_TEMPLATE(ReturnArg,<br>
ACTION_TEMPLATE(SaveArg,<br>
HAS_1_TEMPLATE_PARAMS(int, k),<br>
AND_1_VALUE_PARAMS(pointer)) {<br>
- *pointer = ::testing::get<k>(args);<br>
+ *pointer = ::std::get<k>(args);<br>
}<br>
<br>
// Action SaveArgPointee<k>(pointer) saves the value pointed to<br>
@@ -180,7 +95,7 @@ ACTION_TEMPLATE(SaveArg,<br>
ACTION_TEMPLATE(SaveArgPointee,<br>
HAS_1_TEMPLATE_PARAMS(int, k),<br>
AND_1_VALUE_PARAMS(pointer)) {<br>
- *pointer = *::testing::get<k>(args);<br>
+ *pointer = *::std::get<k>(args);<br>
}<br>
<br>
// Action SetArgReferee<k>(value) assigns 'value' to the variable<br>
@@ -188,13 +103,13 @@ ACTION_TEMPLATE(SaveArgPointee,<br>
ACTION_TEMPLATE(SetArgReferee,<br>
HAS_1_TEMPLATE_PARAMS(int, k),<br>
AND_1_VALUE_PARAMS(value)) {<br>
- typedef typename ::testing::tuple_element<k, args_type>::type argk_type;<br>
+ typedef typename ::std::tuple_element<k, args_type>::type argk_type;<br>
// Ensures that argument #k is a reference. If you get a compiler<br>
// error on the next line, you are using SetArgReferee<k>(value) in<br>
// a mock function whose k-th (0-based) argument is not a reference.<br>
- GTEST_COMPILE_ASSERT_(internal::is_reference<argk_type>::value,<br>
+ GTEST_COMPILE_ASSERT_(std::is_reference<argk_type>::value,<br>
SetArgReferee_must_be_used_with_a_reference_argument);<br>
- ::testing::get<k>(args) = value;<br>
+ ::std::get<k>(args) = value;<br>
}<br>
<br>
// Action SetArrayArgument<k>(first, last) copies the elements in<br>
@@ -207,9 +122,9 @@ ACTION_TEMPLATE(SetArrayArgument,<br>
AND_2_VALUE_PARAMS(first, last)) {<br>
// Visual Studio deprecates ::std::copy, so we use our own copy in that case.<br>
#ifdef _MSC_VER<br>
- internal::CopyElements(first, last, ::testing::get<k>(args));<br>
+ internal::CopyElements(first, last, ::std::get<k>(args));<br>
#else<br>
- ::std::copy(first, last, ::testing::get<k>(args));<br>
+ ::std::copy(first, last, ::std::get<k>(args));<br>
#endif<br>
}<br>
<br>
@@ -218,7 +133,7 @@ ACTION_TEMPLATE(SetArrayArgument,<br>
ACTION_TEMPLATE(DeleteArg,<br>
HAS_1_TEMPLATE_PARAMS(int, k),<br>
AND_0_VALUE_PARAMS()) {<br>
- delete ::testing::get<k>(args);<br>
+ delete ::std::get<k>(args);<br>
}<br>
<br>
// This action returns the value pointed to by 'pointer'.<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-nice-strict.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-nice-strict.h<br>
new file mode 100644<br>
index 0000000000000..5495a9805b5fa<br>
--- /dev/null<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-nice-strict.h<br>
@@ -0,0 +1,215 @@<br>
+// Copyright 2008, Google Inc.<br>
+// All rights reserved.<br>
+//<br>
+// Redistribution and use in source and binary forms, with or without<br>
+// modification, are permitted provided that the following conditions are<br>
+// met:<br>
+//<br>
+// * Redistributions of source code must retain the above copyright<br>
+// notice, this list of conditions and the following disclaimer.<br>
+// * Redistributions in binary form must reproduce the above<br>
+// copyright notice, this list of conditions and the following disclaimer<br>
+// in the documentation and/or other materials provided with the<br>
+// distribution.<br>
+// * Neither the name of Google Inc. nor the names of its<br>
+// contributors may be used to endorse or promote products derived from<br>
+// this software without specific prior written permission.<br>
+//<br>
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
+<br>
+<br>
+// Implements class templates NiceMock, NaggyMock, and StrictMock.<br>
+//<br>
+// Given a mock class MockFoo that is created using Google Mock,<br>
+// NiceMock<MockFoo> is a subclass of MockFoo that allows<br>
+// uninteresting calls (i.e. calls to mock methods that have no<br>
+// EXPECT_CALL specs), NaggyMock<MockFoo> is a subclass of MockFoo<br>
+// that prints a warning when an uninteresting call occurs, and<br>
+// StrictMock<MockFoo> is a subclass of MockFoo that treats all<br>
+// uninteresting calls as errors.<br>
+//<br>
+// Currently a mock is naggy by default, so MockFoo and<br>
+// NaggyMock<MockFoo> behave like the same. However, we will soon<br>
+// switch the default behavior of mocks to be nice, as that in general<br>
+// leads to more maintainable tests. When that happens, MockFoo will<br>
+// stop behaving like NaggyMock<MockFoo> and start behaving like<br>
+// NiceMock<MockFoo>.<br>
+//<br>
+// NiceMock, NaggyMock, and StrictMock "inherit" the constructors of<br>
+// their respective base class. Therefore you can write<br>
+// NiceMock<MockFoo>(5, "a") to construct a nice mock where MockFoo<br>
+// has a constructor that accepts (int, const char*), for example.<br>
+//<br>
+// A known limitation is that NiceMock<MockFoo>, NaggyMock<MockFoo>,<br>
+// and StrictMock<MockFoo> only works for mock methods defined using<br>
+// the MOCK_METHOD* family of macros DIRECTLY in the MockFoo class.<br>
+// If a mock method is defined in a base class of MockFoo, the "nice"<br>
+// or "strict" modifier may not affect it, depending on the compiler.<br>
+// In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT<br>
+// supported.<br>
+<br>
+// GOOGLETEST_CM0002 DO NOT DELETE<br>
+<br>
+#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_NICE_STRICT_H_<br>
+#define GMOCK_INCLUDE_GMOCK_GMOCK_NICE_STRICT_H_<br>
+<br>
+#include "gmock/gmock-spec-builders.h"<br>
+#include "gmock/internal/gmock-port.h"<br>
+<br>
+namespace testing {<br>
+<br>
+template <class MockClass><br>
+class NiceMock : public MockClass {<br>
+ public:<br>
+ NiceMock() : MockClass() {<br>
+ ::testing::Mock::AllowUninterestingCalls(<br>
+ internal::ImplicitCast_<MockClass*>(this));<br>
+ }<br>
+<br>
+ // Ideally, we would inherit base class's constructors through a using<br>
+ // declaration, which would preserve their visibility. However, many existing<br>
+ // tests rely on the fact that current implementation reexports protected<br>
+ // constructors as public. These tests would need to be cleaned up first.<br>
+<br>
+ // Single argument constructor is special-cased so that it can be<br>
+ // made explicit.<br>
+ template <typename A><br>
+ explicit NiceMock(A&& arg) : MockClass(std::forward<A>(arg)) {<br>
+ ::testing::Mock::AllowUninterestingCalls(<br>
+ internal::ImplicitCast_<MockClass*>(this));<br>
+ }<br>
+<br>
+ template <typename A1, typename A2, typename... An><br>
+ NiceMock(A1&& arg1, A2&& arg2, An&&... args)<br>
+ : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),<br>
+ std::forward<An>(args)...) {<br>
+ ::testing::Mock::AllowUninterestingCalls(<br>
+ internal::ImplicitCast_<MockClass*>(this));<br>
+ }<br>
+<br>
+ ~NiceMock() { // NOLINT<br>
+ ::testing::Mock::UnregisterCallReaction(<br>
+ internal::ImplicitCast_<MockClass*>(this));<br>
+ }<br>
+<br>
+ private:<br>
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(NiceMock);<br>
+};<br>
+<br>
+template <class MockClass><br>
+class NaggyMock : public MockClass {<br>
+ public:<br>
+ NaggyMock() : MockClass() {<br>
+ ::testing::Mock::WarnUninterestingCalls(<br>
+ internal::ImplicitCast_<MockClass*>(this));<br>
+ }<br>
+<br>
+ // Ideally, we would inherit base class's constructors through a using<br>
+ // declaration, which would preserve their visibility. However, many existing<br>
+ // tests rely on the fact that current implementation reexports protected<br>
+ // constructors as public. These tests would need to be cleaned up first.<br>
+<br>
+ // Single argument constructor is special-cased so that it can be<br>
+ // made explicit.<br>
+ template <typename A><br>
+ explicit NaggyMock(A&& arg) : MockClass(std::forward<A>(arg)) {<br>
+ ::testing::Mock::WarnUninterestingCalls(<br>
+ internal::ImplicitCast_<MockClass*>(this));<br>
+ }<br>
+<br>
+ template <typename A1, typename A2, typename... An><br>
+ NaggyMock(A1&& arg1, A2&& arg2, An&&... args)<br>
+ : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),<br>
+ std::forward<An>(args)...) {<br>
+ ::testing::Mock::WarnUninterestingCalls(<br>
+ internal::ImplicitCast_<MockClass*>(this));<br>
+ }<br>
+<br>
+ ~NaggyMock() { // NOLINT<br>
+ ::testing::Mock::UnregisterCallReaction(<br>
+ internal::ImplicitCast_<MockClass*>(this));<br>
+ }<br>
+<br>
+ private:<br>
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(NaggyMock);<br>
+};<br>
+<br>
+template <class MockClass><br>
+class StrictMock : public MockClass {<br>
+ public:<br>
+ StrictMock() : MockClass() {<br>
+ ::testing::Mock::FailUninterestingCalls(<br>
+ internal::ImplicitCast_<MockClass*>(this));<br>
+ }<br>
+<br>
+ // Ideally, we would inherit base class's constructors through a using<br>
+ // declaration, which would preserve their visibility. However, many existing<br>
+ // tests rely on the fact that current implementation reexports protected<br>
+ // constructors as public. These tests would need to be cleaned up first.<br>
+<br>
+ // Single argument constructor is special-cased so that it can be<br>
+ // made explicit.<br>
+ template <typename A><br>
+ explicit StrictMock(A&& arg) : MockClass(std::forward<A>(arg)) {<br>
+ ::testing::Mock::FailUninterestingCalls(<br>
+ internal::ImplicitCast_<MockClass*>(this));<br>
+ }<br>
+<br>
+ template <typename A1, typename A2, typename... An><br>
+ StrictMock(A1&& arg1, A2&& arg2, An&&... args)<br>
+ : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),<br>
+ std::forward<An>(args)...) {<br>
+ ::testing::Mock::FailUninterestingCalls(<br>
+ internal::ImplicitCast_<MockClass*>(this));<br>
+ }<br>
+<br>
+ ~StrictMock() { // NOLINT<br>
+ ::testing::Mock::UnregisterCallReaction(<br>
+ internal::ImplicitCast_<MockClass*>(this));<br>
+ }<br>
+<br>
+ private:<br>
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(StrictMock);<br>
+};<br>
+<br>
+// The following specializations catch some (relatively more common)<br>
+// user errors of nesting nice and strict mocks. They do NOT catch<br>
+// all possible errors.<br>
+<br>
+// These specializations are declared but not defined, as NiceMock,<br>
+// NaggyMock, and StrictMock cannot be nested.<br>
+<br>
+template <typename MockClass><br>
+class NiceMock<NiceMock<MockClass> >;<br>
+template <typename MockClass><br>
+class NiceMock<NaggyMock<MockClass> >;<br>
+template <typename MockClass><br>
+class NiceMock<StrictMock<MockClass> >;<br>
+<br>
+template <typename MockClass><br>
+class NaggyMock<NiceMock<MockClass> >;<br>
+template <typename MockClass><br>
+class NaggyMock<NaggyMock<MockClass> >;<br>
+template <typename MockClass><br>
+class NaggyMock<StrictMock<MockClass> >;<br>
+<br>
+template <typename MockClass><br>
+class StrictMock<NiceMock<MockClass> >;<br>
+template <typename MockClass><br>
+class StrictMock<NaggyMock<MockClass> >;<br>
+template <typename MockClass><br>
+class StrictMock<StrictMock<MockClass> >;<br>
+<br>
+} // namespace testing<br>
+<br>
+#endif // GMOCK_INCLUDE_GMOCK_GMOCK_NICE_STRICT_H_<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-spec-builders.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-spec-builders.h<br>
index 61e7134230aa3..7df6c87a4c307 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-spec-builders.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-spec-builders.h<br>
@@ -63,10 +63,14 @@<br>
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_<br>
#define GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_<br>
<br>
+#include <functional><br>
#include <map><br>
+#include <memory><br>
#include <set><br>
#include <sstream><br>
#include <string><br>
+#include <type_traits><br>
+#include <utility><br>
#include <vector><br>
#include "gmock/gmock-actions.h"<br>
#include "gmock/gmock-cardinalities.h"<br>
@@ -106,9 +110,6 @@ template <typename F> class TypedExpectation;<br>
// Helper class for testing the Expectation class template.<br>
class ExpectationTester;<br>
<br>
-// Base class for function mockers.<br>
-template <typename F> class FunctionMockerBase;<br>
-<br>
// Protects the mock object registry (in class Mock), all function<br>
// mockers, and all expectations.<br>
//<br>
@@ -125,9 +126,9 @@ GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_gmock_mutex);<br>
// Untyped base class for ActionResultHolder<R>.<br>
class UntypedActionResultHolderBase;<br>
<br>
-// Abstract base class of FunctionMockerBase. This is the<br>
+// Abstract base class of FunctionMocker. This is the<br>
// type-agnostic part of the function mocker interface. Its pure<br>
-// virtual methods are implemented by FunctionMockerBase.<br>
+// virtual methods are implemented by FunctionMocker.<br>
class GTEST_API_ UntypedFunctionMockerBase {<br>
public:<br>
UntypedFunctionMockerBase();<br>
@@ -189,7 +190,6 @@ class GTEST_API_ UntypedFunctionMockerBase {<br>
// this information in the global mock registry. Will be called<br>
// whenever an EXPECT_CALL() or ON_CALL() is executed on this mock<br>
// method.<br>
- // FIXME: rename to SetAndRegisterOwner().<br>
void RegisterOwner(const void* mock_obj)<br>
GTEST_LOCK_EXCLUDED_(g_gmock_mutex);<br>
<br>
@@ -220,8 +220,7 @@ class GTEST_API_ UntypedFunctionMockerBase {<br>
protected:<br>
typedef std::vector<const void*> UntypedOnCallSpecs;<br>
<br>
- typedef std::vector<internal::linked_ptr<ExpectationBase> ><br>
- UntypedExpectations;<br>
+ using UntypedExpectations = std::vector<std::shared_ptr<ExpectationBase>>;<br>
<br>
// Returns an Expectation object that references and co-owns exp,<br>
// which must be an expectation on this mock function.<br>
@@ -306,11 +305,9 @@ class OnCallSpec : public UntypedOnCallSpecBase {<br>
: UntypedOnCallSpecBase(a_file, a_line),<br>
matchers_(matchers),<br>
// By default, extra_matcher_ should match anything. However,<br>
- // we cannot initialize it with _ as that triggers a compiler<br>
- // bug in Symbian's C++ compiler (cannot decide between two<br>
- // overloaded constructors of Matcher<const ArgumentTuple&>).<br>
- extra_matcher_(A<const ArgumentTuple&>()) {<br>
- }<br>
+ // we cannot initialize it with _ as that causes ambiguity between<br>
+ // Matcher's copy and move constructor for some argument types.<br>
+ extra_matcher_(A<const ArgumentTuple&>()) {}<br>
<br>
// Implements the .With() clause.<br>
OnCallSpec& With(const Matcher<const ArgumentTuple&>& m) {<br>
@@ -337,7 +334,7 @@ class OnCallSpec : public UntypedOnCallSpecBase {<br>
return *this;<br>
}<br>
<br>
- // Returns true iff the given arguments match the matchers.<br>
+ // Returns true if and only if the given arguments match the matchers.<br>
bool Matches(const ArgumentTuple& args) const {<br>
return TupleMatches(matchers_, args) && extra_matcher_.Matches(args);<br>
}<br>
@@ -395,18 +392,28 @@ class GTEST_API_ Mock {<br>
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);<br>
<br>
// Verifies all expectations on the given mock object and clears its<br>
- // default actions and expectations. Returns true iff the<br>
+ // default actions and expectations. Returns true if and only if the<br>
// verification was successful.<br>
static bool VerifyAndClear(void* mock_obj)<br>
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);<br>
<br>
+ // Returns whether the mock was created as a naggy mock (default)<br>
+ static bool IsNaggy(void* mock_obj)<br>
+ GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);<br>
+ // Returns whether the mock was created as a nice mock<br>
+ static bool IsNice(void* mock_obj)<br>
+ GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);<br>
+ // Returns whether the mock was created as a strict mock<br>
+ static bool IsStrict(void* mock_obj)<br>
+ GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);<br>
+<br>
private:<br>
friend class internal::UntypedFunctionMockerBase;<br>
<br>
// Needed for a function mocker to register itself (so that we know<br>
// how to clear a mock object).<br>
template <typename F><br>
- friend class internal::FunctionMockerBase;<br>
+ friend class internal::FunctionMocker;<br>
<br>
template <typename M><br>
friend class NiceMock;<br>
@@ -469,7 +476,7 @@ class GTEST_API_ Mock {<br>
// Unregisters a mock method; removes the owning mock object from<br>
// the registry when the last mock method associated with it has<br>
// been unregistered. This is called only in the destructor of<br>
- // FunctionMockerBase.<br>
+ // FunctionMocker.<br>
static void UnregisterLocked(internal::UntypedFunctionMockerBase* mocker)<br>
GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);<br>
}; // class Mock<br>
@@ -489,12 +496,7 @@ class GTEST_API_ Mock {<br>
// - Constness is shallow: a const Expectation object itself cannot<br>
// be modified, but the mutable methods of the ExpectationBase<br>
// object it references can be called via expectation_base().<br>
-// - The constructors and destructor are defined out-of-line because<br>
-// the Symbian WINSCW compiler wants to otherwise instantiate them<br>
-// when it sees this class definition, at which point it doesn't have<br>
-// ExpectationBase available yet, leading to incorrect destruction<br>
-// in the linked_ptr (or compilation errors if using a checking<br>
-// linked_ptr).<br>
+<br>
class GTEST_API_ Expectation {<br>
public:<br>
// Constructs a null object that doesn't reference any expectation.<br>
@@ -516,7 +518,8 @@ class GTEST_API_ Expectation {<br>
// The compiler-generated copy ctor and operator= work exactly as<br>
// intended, so we don't need to define our own.<br>
<br>
- // Returns true iff rhs references the same expectation as this object does.<br>
+ // Returns true if and only if rhs references the same expectation as this<br>
+ // object does.<br>
bool operator==(const Expectation& rhs) const {<br>
return expectation_base_ == rhs.expectation_base_;<br>
}<br>
@@ -530,7 +533,7 @@ class GTEST_API_ Expectation {<br>
friend class ::testing::internal::UntypedFunctionMockerBase;<br>
<br>
template <typename F><br>
- friend class ::testing::internal::FunctionMockerBase;<br>
+ friend class ::testing::internal::FunctionMocker;<br>
<br>
template <typename F><br>
friend class ::testing::internal::TypedExpectation;<br>
@@ -546,16 +549,15 @@ class GTEST_API_ Expectation {<br>
typedef ::std::set<Expectation, Less> Set;<br>
<br>
Expectation(<br>
- const internal::linked_ptr<internal::ExpectationBase>& expectation_base);<br>
+ const std::shared_ptr<internal::ExpectationBase>& expectation_base);<br>
<br>
// Returns the expectation this object references.<br>
- const internal::linked_ptr<internal::ExpectationBase>&<br>
- expectation_base() const {<br>
+ const std::shared_ptr<internal::ExpectationBase>& expectation_base() const {<br>
return expectation_base_;<br>
}<br>
<br>
- // A linked_ptr that co-owns the expectation this handle references.<br>
- internal::linked_ptr<internal::ExpectationBase> expectation_base_;<br>
+ // A shared_ptr that co-owns the expectation this handle references.<br>
+ std::shared_ptr<internal::ExpectationBase> expectation_base_;<br>
};<br>
<br>
// A set of expectation handles. Useful in the .After() clause of<br>
@@ -599,8 +601,8 @@ class ExpectationSet {<br>
// The compiler-generator ctor and operator= works exactly as<br>
// intended, so we don't need to define our own.<br>
<br>
- // Returns true iff rhs contains the same set of Expectation objects<br>
- // as this does.<br>
+ // Returns true if and only if rhs contains the same set of Expectation<br>
+ // objects as this does.<br>
bool operator==(const ExpectationSet& rhs) const {<br>
return expectations_ == rhs.expectations_;<br>
}<br>
@@ -637,11 +639,8 @@ class GTEST_API_ Sequence {<br>
void AddExpectation(const Expectation& expectation) const;<br>
<br>
private:<br>
- // The last expectation in this sequence. We use a linked_ptr here<br>
- // because Sequence objects are copyable and we want the copies to<br>
- // be aliases. The linked_ptr allows the copies to co-own and share<br>
- // the same Expectation object.<br>
- internal::linked_ptr<Expectation> last_expectation_;<br>
+ // The last expectation in this sequence.<br>
+ std::shared_ptr<Expectation> last_expectation_;<br>
}; // class Sequence<br>
<br>
// An object of this type causes all EXPECT_CALL() statements<br>
@@ -764,8 +763,8 @@ class GTEST_API_ ExpectationBase {<br>
// by the subclasses to implement the .Times() clause.<br>
void SpecifyCardinality(const Cardinality& cardinality);<br>
<br>
- // Returns true iff the user specified the cardinality explicitly<br>
- // using a .Times().<br>
+ // Returns true if and only if the user specified the cardinality<br>
+ // explicitly using a .Times().<br>
bool cardinality_specified() const { return cardinality_specified_; }<br>
<br>
// Sets the cardinality of this expectation spec.<br>
@@ -781,7 +780,7 @@ class GTEST_API_ ExpectationBase {<br>
void RetireAllPreRequisites()<br>
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);<br>
<br>
- // Returns true iff this expectation is retired.<br>
+ // Returns true if and only if this expectation is retired.<br>
bool is_retired() const<br>
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
g_gmock_mutex.AssertHeld();<br>
@@ -795,28 +794,29 @@ class GTEST_API_ ExpectationBase {<br>
retired_ = true;<br>
}<br>
<br>
- // Returns true iff this expectation is satisfied.<br>
+ // Returns true if and only if this expectation is satisfied.<br>
bool IsSatisfied() const<br>
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
g_gmock_mutex.AssertHeld();<br>
return cardinality().IsSatisfiedByCallCount(call_count_);<br>
}<br>
<br>
- // Returns true iff this expectation is saturated.<br>
+ // Returns true if and only if this expectation is saturated.<br>
bool IsSaturated() const<br>
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
g_gmock_mutex.AssertHeld();<br>
return cardinality().IsSaturatedByCallCount(call_count_);<br>
}<br>
<br>
- // Returns true iff this expectation is over-saturated.<br>
+ // Returns true if and only if this expectation is over-saturated.<br>
bool IsOverSaturated() const<br>
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
g_gmock_mutex.AssertHeld();<br>
return cardinality().IsOverSaturatedByCallCount(call_count_);<br>
}<br>
<br>
- // Returns true iff all pre-requisites of this expectation are satisfied.<br>
+ // Returns true if and only if all pre-requisites of this expectation are<br>
+ // satisfied.<br>
bool AllPrerequisitesAreSatisfied() const<br>
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);<br>
<br>
@@ -859,12 +859,12 @@ class GTEST_API_ ExpectationBase {<br>
const char* file_; // The file that contains the expectation.<br>
int line_; // The line number of the expectation.<br>
const std::string source_text_; // The EXPECT_CALL(...) source text.<br>
- // True iff the cardinality is specified explicitly.<br>
+ // True if and only if the cardinality is specified explicitly.<br>
bool cardinality_specified_;<br>
Cardinality cardinality_; // The cardinality of the expectation.<br>
// The immediate pre-requisites (i.e. expectations that must be<br>
// satisfied before this expectation can be matched) of this<br>
- // expectation. We use linked_ptr in the set because we want an<br>
+ // expectation. We use std::shared_ptr in the set because we want an<br>
// Expectation object to be co-owned by its FunctionMocker and its<br>
// successors. This allows multiple mock objects to be deleted at<br>
// <br>
diff erent times.<br>
@@ -873,7 +873,7 @@ class GTEST_API_ ExpectationBase {<br>
// This group of fields are the current state of the expectation,<br>
// and can change as the mock function is called.<br>
int call_count_; // How many times this expectation has been invoked.<br>
- bool retired_; // True iff this expectation has retired.<br>
+ bool retired_; // True if and only if this expectation has retired.<br>
UntypedActions untyped_actions_;<br>
bool extra_matcher_specified_;<br>
bool repeated_action_specified_; // True if a WillRepeatedly() was specified.<br>
@@ -893,20 +893,19 @@ class TypedExpectation : public ExpectationBase {<br>
typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple;<br>
typedef typename Function<F>::Result Result;<br>
<br>
- TypedExpectation(FunctionMockerBase<F>* owner, const char* a_file, int a_line,<br>
+ TypedExpectation(FunctionMocker<F>* owner, const char* a_file, int a_line,<br>
const std::string& a_source_text,<br>
const ArgumentMatcherTuple& m)<br>
: ExpectationBase(a_file, a_line, a_source_text),<br>
owner_(owner),<br>
matchers_(m),<br>
// By default, extra_matcher_ should match anything. However,<br>
- // we cannot initialize it with _ as that triggers a compiler<br>
- // bug in Symbian's C++ compiler (cannot decide between two<br>
- // overloaded constructors of Matcher<const ArgumentTuple&>).<br>
+ // we cannot initialize it with _ as that causes ambiguity between<br>
+ // Matcher's copy and move constructor for some argument types.<br>
extra_matcher_(A<const ArgumentTuple&>()),<br>
repeated_action_(DoDefault()) {}<br>
<br>
- virtual ~TypedExpectation() {<br>
+ ~TypedExpectation() override {<br>
// Check the validity of the action count if it hasn't been done<br>
// yet (for example, if the expectation was never used).<br>
CheckActionCountIfNotDone();<br>
@@ -1072,7 +1071,7 @@ class TypedExpectation : public ExpectationBase {<br>
<br>
// If this mock method has an extra matcher (i.e. .With(matcher)),<br>
// describes it to the ostream.<br>
- virtual void MaybeDescribeExtraMatcherTo(::std::ostream* os) {<br>
+ void MaybeDescribeExtraMatcherTo(::std::ostream* os) override {<br>
if (extra_matcher_specified_) {<br>
*os << " Expected args: ";<br>
extra_matcher_.DescribeTo(os);<br>
@@ -1082,26 +1081,25 @@ class TypedExpectation : public ExpectationBase {<br>
<br>
private:<br>
template <typename Function><br>
- friend class FunctionMockerBase;<br>
+ friend class FunctionMocker;<br>
<br>
// Returns an Expectation object that references and co-owns this<br>
// expectation.<br>
- virtual Expectation GetHandle() {<br>
- return owner_->GetHandleOf(this);<br>
- }<br>
+ Expectation GetHandle() override { return owner_->GetHandleOf(this); }<br>
<br>
// The following methods will be called only after the EXPECT_CALL()<br>
// statement finishes and when the current thread holds<br>
// g_gmock_mutex.<br>
<br>
- // Returns true iff this expectation matches the given arguments.<br>
+ // Returns true if and only if this expectation matches the given arguments.<br>
bool Matches(const ArgumentTuple& args) const<br>
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
g_gmock_mutex.AssertHeld();<br>
return TupleMatches(matchers_, args) && extra_matcher_.Matches(args);<br>
}<br>
<br>
- // Returns true iff this expectation should handle the given arguments.<br>
+ // Returns true if and only if this expectation should handle the given<br>
+ // arguments.<br>
bool ShouldHandleArguments(const ArgumentTuple& args) const<br>
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
g_gmock_mutex.AssertHeld();<br>
@@ -1161,10 +1159,9 @@ class TypedExpectation : public ExpectationBase {<br>
}<br>
<br>
// Returns the action that should be taken for the current invocation.<br>
- const Action<F>& GetCurrentAction(<br>
- const FunctionMockerBase<F>* mocker,<br>
- const ArgumentTuple& args) const<br>
- GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
+ const Action<F>& GetCurrentAction(const FunctionMocker<F>* mocker,<br>
+ const ArgumentTuple& args) const<br>
+ GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
g_gmock_mutex.AssertHeld();<br>
const int count = call_count();<br>
Assert(count >= 1, __FILE__, __LINE__,<br>
@@ -1186,9 +1183,10 @@ class TypedExpectation : public ExpectationBase {<br>
Log(kWarning, ss.str(), 1);<br>
}<br>
<br>
- return count <= action_count ?<br>
- *static_cast<const Action<F>*>(untyped_actions_[count - 1]) :<br>
- repeated_action();<br>
+ return count <= action_count<br>
+ ? *static_cast<const Action<F>*>(<br>
+ untyped_actions_[static_cast<size_t>(count - 1)])<br>
+ : repeated_action();<br>
}<br>
<br>
// Given the arguments of a mock function call, if the call will<br>
@@ -1198,12 +1196,11 @@ class TypedExpectation : public ExpectationBase {<br>
// Mock does it to 'why'. This method is not const as it calls<br>
// IncrementCallCount(). A return value of NULL means the default<br>
// action.<br>
- const Action<F>* GetActionForArguments(<br>
- const FunctionMockerBase<F>* mocker,<br>
- const ArgumentTuple& args,<br>
- ::std::ostream* what,<br>
- ::std::ostream* why)<br>
- GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
+ const Action<F>* GetActionForArguments(const FunctionMocker<F>* mocker,<br>
+ const ArgumentTuple& args,<br>
+ ::std::ostream* what,<br>
+ ::std::ostream* why)<br>
+ GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
g_gmock_mutex.AssertHeld();<br>
if (IsSaturated()) {<br>
// We have an excessive call.<br>
@@ -1212,10 +1209,7 @@ class TypedExpectation : public ExpectationBase {<br>
mocker->DescribeDefaultActionTo(args, what);<br>
DescribeCallCountTo(why);<br>
<br>
- // FIXME: allow the user to control whether<br>
- // unexpected calls should fail immediately or continue using a<br>
- // flag --gmock_unexpected_calls_are_fatal.<br>
- return NULL;<br>
+ return nullptr;<br>
}<br>
<br>
IncrementCallCount();<br>
@@ -1232,7 +1226,7 @@ class TypedExpectation : public ExpectationBase {<br>
<br>
// All the fields below won't change once the EXPECT_CALL()<br>
// statement finishes.<br>
- FunctionMockerBase<F>* const owner_;<br>
+ FunctionMocker<F>* const owner_;<br>
ArgumentMatcherTuple matchers_;<br>
Matcher<const ArgumentTuple&> extra_matcher_;<br>
Action<F> repeated_action_;<br>
@@ -1264,7 +1258,7 @@ class MockSpec {<br>
<br>
// Constructs a MockSpec object, given the function mocker object<br>
// that the spec is associated with.<br>
- MockSpec(internal::FunctionMockerBase<F>* function_mocker,<br>
+ MockSpec(internal::FunctionMocker<F>* function_mocker,<br>
const ArgumentMatcherTuple& matchers)<br>
: function_mocker_(function_mocker), matchers_(matchers) {}<br>
<br>
@@ -1300,7 +1294,7 @@ class MockSpec {<br>
friend class internal::FunctionMocker;<br>
<br>
// The function mocker that owns this spec.<br>
- internal::FunctionMockerBase<F>* const function_mocker_;<br>
+ internal::FunctionMocker<F>* const function_mocker_;<br>
// The argument matchers specified in the spec.<br>
ArgumentMatcherTuple matchers_;<br>
<br>
@@ -1321,18 +1315,18 @@ class ReferenceOrValueWrapper {<br>
public:<br>
// Constructs a wrapper from the given value/reference.<br>
explicit ReferenceOrValueWrapper(T value)<br>
- : value_(::testing::internal::move(value)) {<br>
+ : value_(std::move(value)) {<br>
}<br>
<br>
// Unwraps and returns the underlying value/reference, exactly as<br>
// originally passed. The behavior of calling this more than once on<br>
// the same object is unspecified.<br>
- T Unwrap() { return ::testing::internal::move(value_); }<br>
+ T Unwrap() { return std::move(value_); }<br>
<br>
// Provides nondestructive access to the underlying value/reference.<br>
// Always returns a const reference (more precisely,<br>
- // const RemoveReference<T>&). The behavior of calling this after<br>
- // calling Unwrap on the same object is unspecified.<br>
+ // const std::add_lvalue_reference<T>::type). The behavior of calling this<br>
+ // after calling Unwrap on the same object is unspecified.<br>
const T& Peek() const {<br>
return value_;<br>
}<br>
@@ -1391,7 +1385,7 @@ class ActionResultHolder : public UntypedActionResultHolderBase {<br>
}<br>
<br>
// Prints the held value as an action's result to os.<br>
- virtual void PrintAsActionResult(::std::ostream* os) const {<br>
+ void PrintAsActionResult(::std::ostream* os) const override {<br>
*os << "\n Returns: ";<br>
// T may be a reference type, so we don't use UniversalPrint().<br>
UniversalPrinter<T>::Print(result_.Peek(), os);<br>
@@ -1401,28 +1395,27 @@ class ActionResultHolder : public UntypedActionResultHolderBase {<br>
// result in a new-ed ActionResultHolder.<br>
template <typename F><br>
static ActionResultHolder* PerformDefaultAction(<br>
- const FunctionMockerBase<F>* func_mocker,<br>
- typename RvalueRef<typename Function<F>::ArgumentTuple>::type args,<br>
+ const FunctionMocker<F>* func_mocker,<br>
+ typename Function<F>::ArgumentTuple&& args,<br>
const std::string& call_description) {<br>
return new ActionResultHolder(Wrapper(func_mocker->PerformDefaultAction(<br>
- internal::move(args), call_description)));<br>
+ std::move(args), call_description)));<br>
}<br>
<br>
// Performs the given action and returns the result in a new-ed<br>
// ActionResultHolder.<br>
template <typename F><br>
static ActionResultHolder* PerformAction(<br>
- const Action<F>& action,<br>
- typename RvalueRef<typename Function<F>::ArgumentTuple>::type args) {<br>
+ const Action<F>& action, typename Function<F>::ArgumentTuple&& args) {<br>
return new ActionResultHolder(<br>
- Wrapper(action.Perform(internal::move(args))));<br>
+ Wrapper(action.Perform(std::move(args))));<br>
}<br>
<br>
private:<br>
typedef ReferenceOrValueWrapper<T> Wrapper;<br>
<br>
explicit ActionResultHolder(Wrapper result)<br>
- : result_(::testing::internal::move(result)) {<br>
+ : result_(std::move(result)) {<br>
}<br>
<br>
Wrapper result_;<br>
@@ -1436,16 +1429,16 @@ class ActionResultHolder<void> : public UntypedActionResultHolderBase {<br>
public:<br>
void Unwrap() { }<br>
<br>
- virtual void PrintAsActionResult(::std::ostream* /* os */) const {}<br>
+ void PrintAsActionResult(::std::ostream* /* os */) const override {}<br>
<br>
// Performs the given mock function's default action and returns ownership<br>
// of an empty ActionResultHolder*.<br>
template <typename F><br>
static ActionResultHolder* PerformDefaultAction(<br>
- const FunctionMockerBase<F>* func_mocker,<br>
- typename RvalueRef<typename Function<F>::ArgumentTuple>::type args,<br>
+ const FunctionMocker<F>* func_mocker,<br>
+ typename Function<F>::ArgumentTuple&& args,<br>
const std::string& call_description) {<br>
- func_mocker->PerformDefaultAction(internal::move(args), call_description);<br>
+ func_mocker->PerformDefaultAction(std::move(args), call_description);<br>
return new ActionResultHolder;<br>
}<br>
<br>
@@ -1453,9 +1446,8 @@ class ActionResultHolder<void> : public UntypedActionResultHolderBase {<br>
// ActionResultHolder*.<br>
template <typename F><br>
static ActionResultHolder* PerformAction(<br>
- const Action<F>& action,<br>
- typename RvalueRef<typename Function<F>::ArgumentTuple>::type args) {<br>
- action.Perform(internal::move(args));<br>
+ const Action<F>& action, typename Function<F>::ArgumentTuple&& args) {<br>
+ action.Perform(std::move(args));<br>
return new ActionResultHolder;<br>
}<br>
<br>
@@ -1464,23 +1456,39 @@ class ActionResultHolder<void> : public UntypedActionResultHolderBase {<br>
GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionResultHolder);<br>
};<br>
<br>
-// The base of the function mocker class for the given function type.<br>
-// We put the methods in this class instead of its child to avoid code<br>
-// bloat.<br>
template <typename F><br>
-class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
+class FunctionMocker;<br>
+<br>
+template <typename R, typename... Args><br>
+class FunctionMocker<R(Args...)> final : public UntypedFunctionMockerBase {<br>
+ using F = R(Args...);<br>
+<br>
public:<br>
- typedef typename Function<F>::Result Result;<br>
- typedef typename Function<F>::ArgumentTuple ArgumentTuple;<br>
- typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple;<br>
+ using Result = R;<br>
+ using ArgumentTuple = std::tuple<Args...>;<br>
+ using ArgumentMatcherTuple = std::tuple<Matcher<Args>...>;<br>
+<br>
+ FunctionMocker() {}<br>
<br>
- FunctionMockerBase() {}<br>
+ // There is no generally useful and implementable semantics of<br>
+ // copying a mock object, so copying a mock is usually a user error.<br>
+ // Thus we disallow copying function mockers. If the user really<br>
+ // wants to copy a mock object, they should implement their own copy<br>
+ // operation, for example:<br>
+ //<br>
+ // class MockFoo : public Foo {<br>
+ // public:<br>
+ // // Defines a copy constructor explicitly.<br>
+ // MockFoo(const MockFoo& src) {}<br>
+ // ...<br>
+ // };<br>
+ FunctionMocker(const FunctionMocker&) = delete;<br>
+ FunctionMocker& operator=(const FunctionMocker&) = delete;<br>
<br>
// The destructor verifies that all expectations on this mock<br>
// function have been satisfied. If not, it will report Google Test<br>
// non-fatal failures for the violations.<br>
- virtual ~FunctionMockerBase()<br>
- GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
+ ~FunctionMocker() override GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
MutexLock l(&g_gmock_mutex);<br>
VerifyAndClearExpectationsLocked();<br>
Mock::UnregisterLocked(this);<br>
@@ -1500,7 +1508,7 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
return spec;<br>
}<br>
<br>
- return NULL;<br>
+ return nullptr;<br>
}<br>
<br>
// Performs the default action of this mock function on the given<br>
@@ -1510,13 +1518,12 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
// mutable state of this object, and thus can be called concurrently<br>
// without locking.<br>
// L = *<br>
- Result PerformDefaultAction(<br>
- typename RvalueRef<typename Function<F>::ArgumentTuple>::type args,<br>
- const std::string& call_description) const {<br>
+ Result PerformDefaultAction(ArgumentTuple&& args,<br>
+ const std::string& call_description) const {<br>
const OnCallSpec<F>* const spec =<br>
this->FindOnCallSpec(args);<br>
- if (spec != NULL) {<br>
- return spec->GetAction().Perform(internal::move(args));<br>
+ if (spec != nullptr) {<br>
+ return spec->GetAction().Perform(std::move(args));<br>
}<br>
const std::string message =<br>
call_description +<br>
@@ -1537,11 +1544,11 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
// the error message to describe the call in the case the default<br>
// action fails. The caller is responsible for deleting the result.<br>
// L = *<br>
- virtual UntypedActionResultHolderBase* UntypedPerformDefaultAction(<br>
+ UntypedActionResultHolderBase* UntypedPerformDefaultAction(<br>
void* untyped_args, // must point to an ArgumentTuple<br>
- const std::string& call_description) const {<br>
+ const std::string& call_description) const override {<br>
ArgumentTuple* args = static_cast<ArgumentTuple*>(untyped_args);<br>
- return ResultHolder::PerformDefaultAction(this, internal::move(*args),<br>
+ return ResultHolder::PerformDefaultAction(this, std::move(*args),<br>
call_description);<br>
}<br>
<br>
@@ -1549,18 +1556,18 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
// the action's result. The caller is responsible for deleting the<br>
// result.<br>
// L = *<br>
- virtual UntypedActionResultHolderBase* UntypedPerformAction(<br>
- const void* untyped_action, void* untyped_args) const {<br>
+ UntypedActionResultHolderBase* UntypedPerformAction(<br>
+ const void* untyped_action, void* untyped_args) const override {<br>
// Make a copy of the action before performing it, in case the<br>
// action deletes the mock object (and thus deletes itself).<br>
const Action<F> action = *static_cast<const Action<F>*>(untyped_action);<br>
ArgumentTuple* args = static_cast<ArgumentTuple*>(untyped_args);<br>
- return ResultHolder::PerformAction(action, internal::move(*args));<br>
+ return ResultHolder::PerformAction(action, std::move(*args));<br>
}<br>
<br>
// Implements UntypedFunctionMockerBase::ClearDefaultActionsLocked():<br>
// clears the ON_CALL()s set on this mock function.<br>
- virtual void ClearDefaultActionsLocked()<br>
+ void ClearDefaultActionsLocked() override<br>
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
g_gmock_mutex.AssertHeld();<br>
<br>
@@ -1586,26 +1593,26 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
g_gmock_mutex.Lock();<br>
}<br>
<br>
- protected:<br>
- template <typename Function><br>
- friend class MockSpec;<br>
-<br>
- typedef ActionResultHolder<Result> ResultHolder;<br>
-<br>
// Returns the result of invoking this mock function with the given<br>
// arguments. This function can be safely called from multiple<br>
// threads concurrently.<br>
- Result InvokeWith(<br>
- typename RvalueRef<typename Function<F>::ArgumentTuple>::type args)<br>
- GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
- // const_cast is required since in C++98 we still pass ArgumentTuple around<br>
- // by const& instead of rvalue reference.<br>
- void* untyped_args = const_cast<void*>(static_cast<const void*>(&args));<br>
- scoped_ptr<ResultHolder> holder(<br>
- DownCast_<ResultHolder*>(this->UntypedInvokeWith(untyped_args)));<br>
+ Result Invoke(Args... args) GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
+ ArgumentTuple tuple(std::forward<Args>(args)...);<br>
+ std::unique_ptr<ResultHolder> holder(DownCast_<ResultHolder*>(<br>
+ this->UntypedInvokeWith(static_cast<void*>(&tuple))));<br>
return holder->Unwrap();<br>
}<br>
<br>
+ MockSpec<F> With(Matcher<Args>... m) {<br>
+ return MockSpec<F>(this, ::std::make_tuple(std::move(m)...));<br>
+ }<br>
+<br>
+ protected:<br>
+ template <typename Function><br>
+ friend class MockSpec;<br>
+<br>
+ typedef ActionResultHolder<Result> ResultHolder;<br>
+<br>
// Adds and returns a default action spec for this mock function.<br>
OnCallSpec<F>& AddNewOnCallSpec(<br>
const char* file, int line,<br>
@@ -1625,14 +1632,14 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line);<br>
TypedExpectation<F>* const expectation =<br>
new TypedExpectation<F>(this, file, line, source_text, m);<br>
- const linked_ptr<ExpectationBase> untyped_expectation(expectation);<br>
+ const std::shared_ptr<ExpectationBase> untyped_expectation(expectation);<br>
// See the definition of untyped_expectations_ for why access to<br>
// it is unprotected here.<br>
untyped_expectations_.push_back(untyped_expectation);<br>
<br>
// Adds this expectation into the implicit sequence if there is one.<br>
Sequence* const implicit_sequence = g_gmock_implicit_sequence.get();<br>
- if (implicit_sequence != NULL) {<br>
+ if (implicit_sequence != nullptr) {<br>
implicit_sequence->AddExpectation(Expectation(untyped_expectation));<br>
}<br>
<br>
@@ -1651,10 +1658,9 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
::std::ostream* os) const {<br>
const OnCallSpec<F>* const spec = FindOnCallSpec(args);<br>
<br>
- if (spec == NULL) {<br>
- *os << (internal::type_equals<Result, void>::value ?<br>
- "returning directly.\n" :<br>
- "returning default value.\n");<br>
+ if (spec == nullptr) {<br>
+ *os << (std::is_void<Result>::value ? "returning directly.\n"<br>
+ : "returning default value.\n");<br>
} else {<br>
*os << "taking default action specified at:\n"<br>
<< FormatFileLocation(spec->file(), spec->line()) << "\n";<br>
@@ -1664,10 +1670,9 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
// Writes a message that the call is uninteresting (i.e. neither<br>
// explicitly expected nor explicitly unexpected) to the given<br>
// ostream.<br>
- virtual void UntypedDescribeUninterestingCall(<br>
- const void* untyped_args,<br>
- ::std::ostream* os) const<br>
- GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
+ void UntypedDescribeUninterestingCall(const void* untyped_args,<br>
+ ::std::ostream* os) const override<br>
+ GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
const ArgumentTuple& args =<br>
*static_cast<const ArgumentTuple*>(untyped_args);<br>
*os << "Uninteresting mock function call - ";<br>
@@ -1692,18 +1697,17 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
// section. The reason is that we have no control on what the<br>
// action does (it can invoke an arbitrary user function or even a<br>
// mock function) and excessive locking could cause a dead lock.<br>
- virtual const ExpectationBase* UntypedFindMatchingExpectation(<br>
- const void* untyped_args,<br>
- const void** untyped_action, bool* is_excessive,<br>
- ::std::ostream* what, ::std::ostream* why)<br>
- GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
+ const ExpectationBase* UntypedFindMatchingExpectation(<br>
+ const void* untyped_args, const void** untyped_action, bool* is_excessive,<br>
+ ::std::ostream* what, ::std::ostream* why) override<br>
+ GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
const ArgumentTuple& args =<br>
*static_cast<const ArgumentTuple*>(untyped_args);<br>
MutexLock l(&g_gmock_mutex);<br>
TypedExpectation<F>* exp = this->FindMatchingExpectationLocked(args);<br>
- if (exp == NULL) { // A match wasn't found.<br>
+ if (exp == nullptr) { // A match wasn't found.<br>
this->FormatUnexpectedCallMessageLocked(args, what, why);<br>
- return NULL;<br>
+ return nullptr;<br>
}<br>
<br>
// This line must be done before calling GetActionForArguments(),<br>
@@ -1711,15 +1715,15 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
// its saturation status.<br>
*is_excessive = exp->IsSaturated();<br>
const Action<F>* action = exp->GetActionForArguments(this, args, what, why);<br>
- if (action != NULL && action->IsDoDefault())<br>
- action = NULL; // Normalize "do default" to NULL.<br>
+ if (action != nullptr && action->IsDoDefault())<br>
+ action = nullptr; // Normalize "do default" to NULL.<br>
*untyped_action = action;<br>
return exp;<br>
}<br>
<br>
// Prints the given function arguments to the ostream.<br>
- virtual void UntypedPrintArgs(const void* untyped_args,<br>
- ::std::ostream* os) const {<br>
+ void UntypedPrintArgs(const void* untyped_args,<br>
+ ::std::ostream* os) const override {<br>
const ArgumentTuple& args =<br>
*static_cast<const ArgumentTuple*>(untyped_args);<br>
UniversalPrint(args, os);<br>
@@ -1742,7 +1746,7 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
return exp;<br>
}<br>
}<br>
- return NULL;<br>
+ return nullptr;<br>
}<br>
<br>
// Returns a message that the arguments don't match any expectation.<br>
@@ -1764,12 +1768,12 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
::std::ostream* why) const<br>
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
g_gmock_mutex.AssertHeld();<br>
- const int count = static_cast<int>(untyped_expectations_.size());<br>
+ const size_t count = untyped_expectations_.size();<br>
*why << "Google Mock tried the following " << count << " "<br>
<< (count == 1 ? "expectation, but it didn't match" :<br>
"expectations, but none matched")<br>
<< ":\n";<br>
- for (int i = 0; i < count; i++) {<br>
+ for (size_t i = 0; i < count; i++) {<br>
TypedExpectation<F>* const expectation =<br>
static_cast<TypedExpectation<F>*>(untyped_expectations_[i].get());<br>
*why << "\n";<br>
@@ -1782,36 +1786,98 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
expectation->DescribeCallCountTo(why);<br>
}<br>
}<br>
-<br>
- // There is no generally useful and implementable semantics of<br>
- // copying a mock object, so copying a mock is usually a user error.<br>
- // Thus we disallow copying function mockers. If the user really<br>
- // wants to copy a mock object, they should implement their own copy<br>
- // operation, for example:<br>
- //<br>
- // class MockFoo : public Foo {<br>
- // public:<br>
- // // Defines a copy constructor explicitly.<br>
- // MockFoo(const MockFoo& src) {}<br>
- // ...<br>
- // };<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(FunctionMockerBase);<br>
-}; // class FunctionMockerBase<br>
+}; // class FunctionMocker<br>
<br>
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4355<br>
<br>
-// Implements methods of FunctionMockerBase.<br>
-<br>
-// Verifies that all expectations on this mock function have been<br>
-// satisfied. Reports one or more Google Test non-fatal failures and<br>
-// returns false if not.<br>
-<br>
// Reports an uninteresting call (whose description is in msg) in the<br>
// manner specified by 'reaction'.<br>
void ReportUninterestingCall(CallReaction reaction, const std::string& msg);<br>
<br>
} // namespace internal<br>
<br>
+// A MockFunction<F> class has one mock method whose type is F. It is<br>
+// useful when you just want your test code to emit some messages and<br>
+// have Google Mock verify the right messages are sent (and perhaps at<br>
+// the right times). For example, if you are exercising code:<br>
+//<br>
+// Foo(1);<br>
+// Foo(2);<br>
+// Foo(3);<br>
+//<br>
+// and want to verify that Foo(1) and Foo(3) both invoke<br>
+// mock.Bar("a"), but Foo(2) doesn't invoke anything, you can write:<br>
+//<br>
+// TEST(FooTest, InvokesBarCorrectly) {<br>
+// MyMock mock;<br>
+// MockFunction<void(string check_point_name)> check;<br>
+// {<br>
+// InSequence s;<br>
+//<br>
+// EXPECT_CALL(mock, Bar("a"));<br>
+// EXPECT_CALL(check, Call("1"));<br>
+// EXPECT_CALL(check, Call("2"));<br>
+// EXPECT_CALL(mock, Bar("a"));<br>
+// }<br>
+// Foo(1);<br>
+// check.Call("1");<br>
+// Foo(2);<br>
+// check.Call("2");<br>
+// Foo(3);<br>
+// }<br>
+//<br>
+// The expectation spec says that the first Bar("a") must happen<br>
+// before check point "1", the second Bar("a") must happen after check<br>
+// point "2", and nothing should happen between the two check<br>
+// points. The explicit check points make it easy to tell which<br>
+// Bar("a") is called by which call to Foo().<br>
+//<br>
+// MockFunction<F> can also be used to exercise code that accepts<br>
+// std::function<F> callbacks. To do so, use AsStdFunction() method<br>
+// to create std::function proxy forwarding to original object's Call.<br>
+// Example:<br>
+//<br>
+// TEST(FooTest, RunsCallbackWithBarArgument) {<br>
+// MockFunction<int(string)> callback;<br>
+// EXPECT_CALL(callback, Call("bar")).WillOnce(Return(1));<br>
+// Foo(callback.AsStdFunction());<br>
+// }<br>
+template <typename F><br>
+class MockFunction;<br>
+<br>
+template <typename R, typename... Args><br>
+class MockFunction<R(Args...)> {<br>
+ public:<br>
+ MockFunction() {}<br>
+ MockFunction(const MockFunction&) = delete;<br>
+ MockFunction& operator=(const MockFunction&) = delete;<br>
+<br>
+ std::function<R(Args...)> AsStdFunction() {<br>
+ return [this](Args... args) -> R {<br>
+ return this->Call(std::forward<Args>(args)...);<br>
+ };<br>
+ }<br>
+<br>
+ // Implementation detail: the expansion of the MOCK_METHOD macro.<br>
+ R Call(Args... args) {<br>
+ mock_.SetOwnerAndName(this, "Call");<br>
+ return mock_.Invoke(std::forward<Args>(args)...);<br>
+ }<br>
+<br>
+ internal::MockSpec<R(Args...)> gmock_Call(Matcher<Args>... m) {<br>
+ mock_.RegisterOwner(this);<br>
+ return mock_.With(std::move(m)...);<br>
+ }<br>
+<br>
+ internal::MockSpec<R(Args...)> gmock_Call(const internal::WithoutMatchers&,<br>
+ R (*)(Args...)) {<br>
+ return this->gmock_Call(::testing::A<Args>()...);<br>
+ }<br>
+<br>
+ private:<br>
+ internal::FunctionMocker<R(Args...)> mock_;<br>
+};<br>
+<br>
// The style guide prohibits "using" statements in a namespace scope<br>
// inside a header file. However, the MockSpec class template is<br>
// meant to be defined in the ::testing namespace. The following line<br>
@@ -1907,8 +1973,9 @@ GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251<br>
// second argument is an internal type derived from the method signature. The<br>
// failure to disambiguate two overloads of this method in the ON_CALL statement<br>
// is how we block callers from setting expectations on overloaded methods.<br>
-#define GMOCK_ON_CALL_IMPL_(mock_expr, Setter, call) \<br>
- ((mock_expr).gmock_##call)(::testing::internal::GetWithoutMatchers(), NULL) \<br>
+#define GMOCK_ON_CALL_IMPL_(mock_expr, Setter, call) \<br>
+ ((mock_expr).gmock_##call)(::testing::internal::GetWithoutMatchers(), \<br>
+ nullptr) \<br>
.Setter(__FILE__, __LINE__, #mock_expr, #call)<br>
<br>
#define ON_CALL(obj, call) \<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/gmock.h b/llvm/utils/unittest/googlemock/include/gmock/gmock.h<br>
index 436aabf7d9afe..45645ff637779 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock.h<br>
@@ -39,14 +39,14 @@<br>
<br>
// This file implements the following syntax:<br>
//<br>
-// ON_CALL(mock_object.Method(...))<br>
+// ON_CALL(mock_object, Method(...))<br>
// .With(...) ?<br>
// .WillByDefault(...);<br>
//<br>
// where With() is optional and WillByDefault() must appear exactly<br>
// once.<br>
//<br>
-// EXPECT_CALL(mock_object.Method(...))<br>
+// EXPECT_CALL(mock_object, Method(...))<br>
// .With(...) ?<br>
// .Times(...) ?<br>
// .InSequence(...) *<br>
@@ -56,24 +56,25 @@<br>
//<br>
// where all clauses are optional and WillOnce() can be repeated.<br>
<br>
-#ifdef __clang__<br>
-#if __has_warning("-Wdeprecated-copy")<br>
-#pragma clang diagnostic push<br>
-#pragma clang diagnostic ignored "-Wdeprecated-copy"<br>
-#endif<br>
-#endif<br>
-<br>
#include "gmock/gmock-actions.h"<br>
#include "gmock/gmock-cardinalities.h"<br>
+#include "gmock/gmock-function-mocker.h"<br>
#include "gmock/gmock-generated-actions.h"<br>
#include "gmock/gmock-generated-function-mockers.h"<br>
#include "gmock/gmock-generated-matchers.h"<br>
-#include "gmock/gmock-generated-nice-strict.h"<br>
#include "gmock/gmock-matchers.h"<br>
#include "gmock/gmock-more-actions.h"<br>
#include "gmock/gmock-more-matchers.h"<br>
+#include "gmock/gmock-nice-strict.h"<br>
#include "gmock/internal/gmock-internal-utils.h"<br>
<br>
+#ifdef __clang__<br>
+#if __has_warning("-Wdeprecated-copy")<br>
+#pragma clang diagnostic push<br>
+#pragma clang diagnostic ignored "-Wdeprecated-copy"<br>
+#endif<br>
+#endif<br>
+<br>
namespace testing {<br>
<br>
// Declares Google Mock flags that we want a user to use programmatically.<br>
@@ -98,6 +99,10 @@ GTEST_API_ void InitGoogleMock(int* argc, char** argv);<br>
// UNICODE mode.<br>
GTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv);<br>
<br>
+// This overloaded version can be used on Arduino/embedded platforms where<br>
+// there is no argc/argv.<br>
+GTEST_API_ void InitGoogleMock();<br>
+<br>
} // namespace testing<br>
<br>
#ifdef __clang__<br>
@@ -105,4 +110,5 @@ GTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv);<br>
#pragma clang diagnostic pop<br>
#endif<br>
#endif<br>
+<br>
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_H_<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h b/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h<br>
deleted file mode 100644<br>
index 8ccd06fb721b8..0000000000000<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h<br>
+++ /dev/null<br>
@@ -1,289 +0,0 @@<br>
-// This file was GENERATED by command:<br>
-// pump.py gmock-generated-internal-utils.h.pump<br>
-// DO NOT EDIT BY HAND!!!<br>
-<br>
-// Copyright 2007, Google Inc.<br>
-// All rights reserved.<br>
-//<br>
-// Redistribution and use in source and binary forms, with or without<br>
-// modification, are permitted provided that the following conditions are<br>
-// met:<br>
-//<br>
-// * Redistributions of source code must retain the above copyright<br>
-// notice, this list of conditions and the following disclaimer.<br>
-// * Redistributions in binary form must reproduce the above<br>
-// copyright notice, this list of conditions and the following disclaimer<br>
-// in the documentation and/or other materials provided with the<br>
-// distribution.<br>
-// * Neither the name of Google Inc. nor the names of its<br>
-// contributors may be used to endorse or promote products derived from<br>
-// this software without specific prior written permission.<br>
-//<br>
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
-<br>
-<br>
-// Google Mock - a framework for writing C++ mock classes.<br>
-//<br>
-// This file contains template meta-programming utility classes needed<br>
-// for implementing Google Mock.<br>
-<br>
-// GOOGLETEST_CM0002 DO NOT DELETE<br>
-<br>
-// IWYU pragma: private, include "gmock/gmock.h<br>
-<br>
-#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_<br>
-#define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_<br>
-<br>
-#include "gmock/internal/gmock-port.h"<br>
-<br>
-namespace testing {<br>
-<br>
-template <typename T><br>
-class Matcher;<br>
-<br>
-namespace internal {<br>
-<br>
-// An IgnoredValue object can be implicitly constructed from ANY value.<br>
-// This is used in implementing the IgnoreResult(a) action.<br>
-class IgnoredValue {<br>
- public:<br>
- // This constructor template allows any value to be implicitly<br>
- // converted to IgnoredValue. The object has no data member and<br>
- // doesn't try to remember anything about the argument. We<br>
- // deliberately omit the 'explicit' keyword in order to allow the<br>
- // conversion to be implicit.<br>
- template <typename T><br>
- IgnoredValue(const T& /* ignored */) {} // NOLINT(runtime/explicit)<br>
-};<br>
-<br>
-// MatcherTuple<T>::type is a tuple type where each field is a Matcher<br>
-// for the corresponding field in tuple type T.<br>
-template <typename Tuple><br>
-struct MatcherTuple;<br>
-<br>
-template <><br>
-struct MatcherTuple< ::testing::tuple<> > {<br>
- typedef ::testing::tuple< > type;<br>
-};<br>
-<br>
-template <typename A1><br>
-struct MatcherTuple< ::testing::tuple<A1> > {<br>
- typedef ::testing::tuple<Matcher<A1> > type;<br>
-};<br>
-<br>
-template <typename A1, typename A2><br>
-struct MatcherTuple< ::testing::tuple<A1, A2> > {<br>
- typedef ::testing::tuple<Matcher<A1>, Matcher<A2> > type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3> > {<br>
- typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3> > type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3, typename A4><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4> > {<br>
- typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4> ><br>
- type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3, typename A4, typename A5><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5> > {<br>
- typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,<br>
- Matcher<A5> ><br>
- type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6> > {<br>
- typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,<br>
- Matcher<A5>, Matcher<A6> ><br>
- type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> > {<br>
- typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,<br>
- Matcher<A5>, Matcher<A6>, Matcher<A7> ><br>
- type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7, typename A8><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > {<br>
- typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,<br>
- Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8> ><br>
- type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7, typename A8, typename A9><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > {<br>
- typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,<br>
- Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>,<br>
- Matcher<A9> ><br>
- type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
- typename A6, typename A7, typename A8, typename A9, typename A10><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,<br>
- A10> > {<br>
- typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,<br>
- Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>,<br>
- Matcher<A9>, Matcher<A10> ><br>
- type;<br>
-};<br>
-<br>
-// Template struct Function<F>, where F must be a function type, contains<br>
-// the following typedefs:<br>
-//<br>
-// Result: the function's return type.<br>
-// ArgumentN: the type of the N-th argument, where N starts with 1.<br>
-// ArgumentTuple: the tuple type consisting of all parameters of F.<br>
-// ArgumentMatcherTuple: the tuple type consisting of Matchers for all<br>
-// parameters of F.<br>
-// MakeResultVoid: the function type obtained by substituting void<br>
-// for the return type of F.<br>
-// MakeResultIgnoredValue:<br>
-// the function type obtained by substituting Something<br>
-// for the return type of F.<br>
-template <typename F><br>
-struct Function;<br>
-<br>
-template <typename R><br>
-struct Function<R()> {<br>
- typedef R Result;<br>
- typedef ::testing::tuple<> ArgumentTuple;<br>
- typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
- typedef void MakeResultVoid();<br>
- typedef IgnoredValue MakeResultIgnoredValue();<br>
-};<br>
-<br>
-template <typename R, typename A1><br>
-struct Function<R(A1)><br>
- : Function<R()> {<br>
- typedef A1 Argument1;<br>
- typedef ::testing::tuple<A1> ArgumentTuple;<br>
- typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
- typedef void MakeResultVoid(A1);<br>
- typedef IgnoredValue MakeResultIgnoredValue(A1);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2><br>
-struct Function<R(A1, A2)><br>
- : Function<R(A1)> {<br>
- typedef A2 Argument2;<br>
- typedef ::testing::tuple<A1, A2> ArgumentTuple;<br>
- typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
- typedef void MakeResultVoid(A1, A2);<br>
- typedef IgnoredValue MakeResultIgnoredValue(A1, A2);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3><br>
-struct Function<R(A1, A2, A3)><br>
- : Function<R(A1, A2)> {<br>
- typedef A3 Argument3;<br>
- typedef ::testing::tuple<A1, A2, A3> ArgumentTuple;<br>
- typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
- typedef void MakeResultVoid(A1, A2, A3);<br>
- typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4><br>
-struct Function<R(A1, A2, A3, A4)><br>
- : Function<R(A1, A2, A3)> {<br>
- typedef A4 Argument4;<br>
- typedef ::testing::tuple<A1, A2, A3, A4> ArgumentTuple;<br>
- typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
- typedef void MakeResultVoid(A1, A2, A3, A4);<br>
- typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5><br>
-struct Function<R(A1, A2, A3, A4, A5)><br>
- : Function<R(A1, A2, A3, A4)> {<br>
- typedef A5 Argument5;<br>
- typedef ::testing::tuple<A1, A2, A3, A4, A5> ArgumentTuple;<br>
- typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
- typedef void MakeResultVoid(A1, A2, A3, A4, A5);<br>
- typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5, typename A6><br>
-struct Function<R(A1, A2, A3, A4, A5, A6)><br>
- : Function<R(A1, A2, A3, A4, A5)> {<br>
- typedef A6 Argument6;<br>
- typedef ::testing::tuple<A1, A2, A3, A4, A5, A6> ArgumentTuple;<br>
- typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
- typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6);<br>
- typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5, typename A6, typename A7><br>
-struct Function<R(A1, A2, A3, A4, A5, A6, A7)><br>
- : Function<R(A1, A2, A3, A4, A5, A6)> {<br>
- typedef A7 Argument7;<br>
- typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> ArgumentTuple;<br>
- typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
- typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7);<br>
- typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5, typename A6, typename A7, typename A8><br>
-struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8)><br>
- : Function<R(A1, A2, A3, A4, A5, A6, A7)> {<br>
- typedef A8 Argument8;<br>
- typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> ArgumentTuple;<br>
- typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
- typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8);<br>
- typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5, typename A6, typename A7, typename A8, typename A9><br>
-struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)><br>
- : Function<R(A1, A2, A3, A4, A5, A6, A7, A8)> {<br>
- typedef A9 Argument9;<br>
- typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> ArgumentTuple;<br>
- typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
- typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9);<br>
- typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8,<br>
- A9);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
- typename A5, typename A6, typename A7, typename A8, typename A9,<br>
- typename A10><br>
-struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)><br>
- : Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> {<br>
- typedef A10 Argument10;<br>
- typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,<br>
- A10> ArgumentTuple;<br>
- typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
- typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);<br>
- typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8,<br>
- A9, A10);<br>
-};<br>
-<br>
-} // namespace internal<br>
-<br>
-} // namespace testing<br>
-<br>
-#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-internal-utils.h b/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-internal-utils.h<br>
index ceda2e8044d31..b9533508ef757 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-internal-utils.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-internal-utils.h<br>
@@ -44,11 +44,15 @@<br>
#include <stdio.h><br>
#include <ostream> // NOLINT<br>
#include <string><br>
-#include "gmock/internal/gmock-generated-internal-utils.h"<br>
+#include <type_traits><br>
#include "gmock/internal/gmock-port.h"<br>
#include "gtest/gtest.h"<br>
<br>
namespace testing {<br>
+<br>
+template <typename><br>
+class Matcher;<br>
+<br>
namespace internal {<br>
<br>
// Silence MSVC C4100 (unreferenced formal parameter) and<br>
@@ -94,46 +98,16 @@ inline const typename Pointer::element_type* GetRawPointer(const Pointer& p) {<br>
template <typename Element><br>
inline Element* GetRawPointer(Element* p) { return p; }<br>
<br>
-// This comparator allows linked_ptr to be stored in sets.<br>
-template <typename T><br>
-struct LinkedPtrLessThan {<br>
- bool operator()(const ::testing::internal::linked_ptr<T>& lhs,<br>
- const ::testing::internal::linked_ptr<T>& rhs) const {<br>
- return lhs.get() < rhs.get();<br>
- }<br>
-};<br>
-<br>
-// Symbian compilation can be done with wchar_t being either a native<br>
-// type or a typedef. Using Google Mock with OpenC without wchar_t<br>
-// should require the definition of _STLP_NO_WCHAR_T.<br>
-//<br>
// MSVC treats wchar_t as a native type usually, but treats it as the<br>
// same as unsigned short when the compiler option /Zc:wchar_t- is<br>
// specified. It defines _NATIVE_WCHAR_T_DEFINED symbol when wchar_t<br>
// is a native type.<br>
-#if (GTEST_OS_SYMBIAN && defined(_STLP_NO_WCHAR_T)) || \<br>
- (defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED))<br>
+#if defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED)<br>
// wchar_t is a typedef.<br>
#else<br>
# define GMOCK_WCHAR_T_IS_NATIVE_ 1<br>
#endif<br>
<br>
-// signed wchar_t and unsigned wchar_t are NOT in the C++ standard.<br>
-// Using them is a bad practice and not portable. So DON'T use them.<br>
-//<br>
-// Still, Google Mock is designed to work even if the user uses signed<br>
-// wchar_t or unsigned wchar_t (obviously, assuming the compiler<br>
-// supports them).<br>
-//<br>
-// To gcc,<br>
-// wchar_t == signed wchar_t != unsigned wchar_t == unsigned int<br>
-#ifdef __GNUC__<br>
-#if !defined(__WCHAR_UNSIGNED__)<br>
-// signed/unsigned wchar_t are valid types.<br>
-# define GMOCK_HAS_SIGNED_WCHAR_T_ 1<br>
-#endif<br>
-#endif<br>
-<br>
// In what follows, we use the term "kind" to indicate whether a type<br>
// is bool, an integer type (excluding bool), a floating-point type,<br>
// or none of them. This categorization is useful for determining<br>
@@ -185,11 +159,11 @@ GMOCK_DECLARE_KIND_(long double, kFloatingPoint);<br>
static_cast< ::testing::internal::TypeKind>( \<br>
::testing::internal::KindOf<type>::value)<br>
<br>
-// Evaluates to true iff integer type T is signed.<br>
+// Evaluates to true if and only if integer type T is signed.<br>
#define GMOCK_IS_SIGNED_(T) (static_cast<T>(-1) < 0)<br>
<br>
// LosslessArithmeticConvertibleImpl<kFromKind, From, kToKind, To>::value<br>
-// is true iff arithmetic type From can be losslessly converted to<br>
+// is true if and only if arithmetic type From can be losslessly converted to<br>
// arithmetic type To.<br>
//<br>
// It's the user's responsibility to ensure that both From and To are<br>
@@ -198,30 +172,30 @@ GMOCK_DECLARE_KIND_(long double, kFloatingPoint);<br>
// From, and kToKind is the kind of To; the value is<br>
// implementation-defined when the above pre-condition is violated.<br>
template <TypeKind kFromKind, typename From, TypeKind kToKind, typename To><br>
-struct LosslessArithmeticConvertibleImpl : public false_type {};<br>
+struct LosslessArithmeticConvertibleImpl : public std::false_type {};<br>
<br>
// Converting bool to bool is lossless.<br>
template <><br>
struct LosslessArithmeticConvertibleImpl<kBool, bool, kBool, bool><br>
- : public true_type {}; // NOLINT<br>
+ : public std::true_type {};<br>
<br>
// Converting bool to any integer type is lossless.<br>
template <typename To><br>
struct LosslessArithmeticConvertibleImpl<kBool, bool, kInteger, To><br>
- : public true_type {}; // NOLINT<br>
+ : public std::true_type {};<br>
<br>
// Converting bool to any floating-point type is lossless.<br>
template <typename To><br>
struct LosslessArithmeticConvertibleImpl<kBool, bool, kFloatingPoint, To><br>
- : public true_type {}; // NOLINT<br>
+ : public std::true_type {};<br>
<br>
// Converting an integer to bool is lossy.<br>
template <typename From><br>
struct LosslessArithmeticConvertibleImpl<kInteger, From, kBool, bool><br>
- : public false_type {}; // NOLINT<br>
+ : public std::false_type {};<br>
<br>
-// Converting an integer to another non-bool integer is lossless iff<br>
-// the target type's range encloses the source type's range.<br>
+// Converting an integer to another non-bool integer is lossless<br>
+// if and only if the target type's range encloses the source type's range.<br>
template <typename From, typename To><br>
struct LosslessArithmeticConvertibleImpl<kInteger, From, kInteger, To><br>
: public bool_constant<<br>
@@ -239,27 +213,27 @@ struct LosslessArithmeticConvertibleImpl<kInteger, From, kInteger, To><br>
// the format of a floating-point number is implementation-defined.<br>
template <typename From, typename To><br>
struct LosslessArithmeticConvertibleImpl<kInteger, From, kFloatingPoint, To><br>
- : public false_type {}; // NOLINT<br>
+ : public std::false_type {};<br>
<br>
// Converting a floating-point to bool is lossy.<br>
template <typename From><br>
struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kBool, bool><br>
- : public false_type {}; // NOLINT<br>
+ : public std::false_type {};<br>
<br>
// Converting a floating-point to an integer is lossy.<br>
template <typename From, typename To><br>
struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kInteger, To><br>
- : public false_type {}; // NOLINT<br>
+ : public std::false_type {};<br>
<br>
// Converting a floating-point to another floating-point is lossless<br>
-// iff the target type is at least as big as the source type.<br>
+// if and only if the target type is at least as big as the source type.<br>
template <typename From, typename To><br>
struct LosslessArithmeticConvertibleImpl<<br>
kFloatingPoint, From, kFloatingPoint, To><br>
: public bool_constant<sizeof(From) <= sizeof(To)> {}; // NOLINT<br>
<br>
-// LosslessArithmeticConvertible<From, To>::value is true iff arithmetic<br>
-// type From can be losslessly converted to arithmetic type To.<br>
+// LosslessArithmeticConvertible<From, To>::value is true if and only if<br>
+// arithmetic type From can be losslessly converted to arithmetic type To.<br>
//<br>
// It's the user's responsibility to ensure that both From and To are<br>
// raw (i.e. has no CV modifier, is not a pointer, and is not a<br>
@@ -333,11 +307,11 @@ const char kWarningVerbosity[] = "warning";<br>
// No logs are printed.<br>
const char kErrorVerbosity[] = "error";<br>
<br>
-// Returns true iff a log with the given severity is visible according<br>
-// to the --gmock_verbose flag.<br>
+// Returns true if and only if a log with the given severity is visible<br>
+// according to the --gmock_verbose flag.<br>
GTEST_API_ bool LogIsVisible(LogSeverity severity);<br>
<br>
-// Prints the given message to stdout iff 'severity' >= the level<br>
+// Prints the given message to stdout if and only if 'severity' >= the level<br>
// specified by the --gmock_verbose flag. If stack_frames_to_skip >=<br>
// 0, also prints the stack trace excluding the top<br>
// stack_frames_to_skip frames. In opt mode, any positive<br>
@@ -362,35 +336,8 @@ class WithoutMatchers {<br>
// Internal use only: access the singleton instance of WithoutMatchers.<br>
GTEST_API_ WithoutMatchers GetWithoutMatchers();<br>
<br>
-// FIXME: group all type utilities together.<br>
-<br>
// Type traits.<br>
<br>
-// is_reference<T>::value is non-zero iff T is a reference type.<br>
-template <typename T> struct is_reference : public false_type {};<br>
-template <typename T> struct is_reference<T&> : public true_type {};<br>
-<br>
-// type_equals<T1, T2>::value is non-zero iff T1 and T2 are the same type.<br>
-template <typename T1, typename T2> struct type_equals : public false_type {};<br>
-template <typename T> struct type_equals<T, T> : public true_type {};<br>
-<br>
-// remove_reference<T>::type removes the reference from type T, if any.<br>
-template <typename T> struct remove_reference { typedef T type; }; // NOLINT<br>
-template <typename T> struct remove_reference<T&> { typedef T type; }; // NOLINT<br>
-<br>
-// DecayArray<T>::type turns an array type U[N] to const U* and preserves<br>
-// other types. Useful for saving a copy of a function argument.<br>
-template <typename T> struct DecayArray { typedef T type; }; // NOLINT<br>
-template <typename T, size_t N> struct DecayArray<T[N]> {<br>
- typedef const T* type;<br>
-};<br>
-// Sometimes people use arrays whose size is not available at the use site<br>
-// (e.g. extern const char kNamePrefix[]). This specialization covers that<br>
-// case.<br>
-template <typename T> struct DecayArray<T[]> {<br>
- typedef const T* type;<br>
-};<br>
-<br>
// Disable MSVC warnings for infinite recursion, since in this case the<br>
// the recursion is unreachable.<br>
#ifdef _MSC_VER<br>
@@ -439,9 +386,8 @@ class StlContainerView {<br>
typedef const type& const_reference;<br>
<br>
static const_reference ConstReference(const RawContainer& container) {<br>
- // Ensures that RawContainer is not a const type.<br>
- testing::StaticAssertTypeEq<RawContainer,<br>
- GTEST_REMOVE_CONST_(RawContainer)>();<br>
+ static_assert(!std::is_const<RawContainer>::value,<br>
+ "RawContainer type must not be const");<br>
return container;<br>
}<br>
static type Copy(const RawContainer& container) { return container; }<br>
@@ -451,7 +397,7 @@ class StlContainerView {<br>
template <typename Element, size_t N><br>
class StlContainerView<Element[N]> {<br>
public:<br>
- typedef GTEST_REMOVE_CONST_(Element) RawElement;<br>
+ typedef typename std::remove_const<Element>::type RawElement;<br>
typedef internal::NativeArray<RawElement> type;<br>
// NativeArray<T> can represent a native array either by value or by<br>
// reference (selected by a constructor argument), so 'const type'<br>
@@ -461,53 +407,32 @@ class StlContainerView<Element[N]> {<br>
typedef const type const_reference;<br>
<br>
static const_reference ConstReference(const Element (&array)[N]) {<br>
- // Ensures that Element is not a const type.<br>
- testing::StaticAssertTypeEq<Element, RawElement>();<br>
-#if GTEST_OS_SYMBIAN<br>
- // The Nokia Symbian compiler confuses itself in template instantiation<br>
- // for this call without the cast to Element*:<br>
- // function call '[testing::internal::NativeArray<char *>].NativeArray(<br>
- // {lval} const char *[4], long, testing::internal::RelationToSource)'<br>
- // does not match<br>
- // 'testing::internal::NativeArray<char *>::NativeArray(<br>
- // char *const *, unsigned int, testing::internal::RelationToSource)'<br>
- // (instantiating: 'testing::internal::ContainsMatcherImpl<br>
- // <const char * (&)[4]>::Matches(const char * (&)[4]) const')<br>
- // (instantiating: 'testing::internal::StlContainerView<char *[4]>::<br>
- // ConstReference(const char * (&)[4])')<br>
- // (and though the N parameter type is mismatched in the above explicit<br>
- // conversion of it doesn't help - only the conversion of the array).<br>
- return type(const_cast<Element*>(&array[0]), N,<br>
- RelationToSourceReference());<br>
-#else<br>
+ static_assert(std::is_same<Element, RawElement>::value,<br>
+ "Element type must not be const");<br>
return type(array, N, RelationToSourceReference());<br>
-#endif // GTEST_OS_SYMBIAN<br>
}<br>
static type Copy(const Element (&array)[N]) {<br>
-#if GTEST_OS_SYMBIAN<br>
- return type(const_cast<Element*>(&array[0]), N, RelationToSourceCopy());<br>
-#else<br>
return type(array, N, RelationToSourceCopy());<br>
-#endif // GTEST_OS_SYMBIAN<br>
}<br>
};<br>
<br>
// This specialization is used when RawContainer is a native array<br>
// represented as a (pointer, size) tuple.<br>
template <typename ElementPointer, typename Size><br>
-class StlContainerView< ::testing::tuple<ElementPointer, Size> > {<br>
+class StlContainerView< ::std::tuple<ElementPointer, Size> > {<br>
public:<br>
- typedef GTEST_REMOVE_CONST_(<br>
- typename internal::PointeeOf<ElementPointer>::type) RawElement;<br>
+ typedef typename std::remove_const<<br>
+ typename internal::PointeeOf<ElementPointer>::type>::type RawElement;<br>
typedef internal::NativeArray<RawElement> type;<br>
typedef const type const_reference;<br>
<br>
static const_reference ConstReference(<br>
- const ::testing::tuple<ElementPointer, Size>& array) {<br>
- return type(get<0>(array), get<1>(array), RelationToSourceReference());<br>
+ const ::std::tuple<ElementPointer, Size>& array) {<br>
+ return type(std::get<0>(array), std::get<1>(array),<br>
+ RelationToSourceReference());<br>
}<br>
- static type Copy(const ::testing::tuple<ElementPointer, Size>& array) {<br>
- return type(get<0>(array), get<1>(array), RelationToSourceCopy());<br>
+ static type Copy(const ::std::tuple<ElementPointer, Size>& array) {<br>
+ return type(std::get<0>(array), std::get<1>(array), RelationToSourceCopy());<br>
}<br>
};<br>
<br>
@@ -529,29 +454,12 @@ struct RemoveConstFromKey<std::pair<const K, V> > {<br>
typedef std::pair<K, V> type;<br>
};<br>
<br>
-// Mapping from booleans to types. Similar to boost::bool_<kValue> and<br>
-// std::integral_constant<bool, kValue>.<br>
-template <bool kValue><br>
-struct BooleanConstant {};<br>
-<br>
// Emit an assertion failure due to incorrect DoDefault() usage. Out-of-lined to<br>
// reduce code size.<br>
GTEST_API_ void IllegalDoDefault(const char* file, int line);<br>
<br>
-#if GTEST_LANG_CXX11<br>
-// Helper types for Apply() below.<br>
-template <size_t... Is> struct int_pack { typedef int_pack type; };<br>
-<br>
-template <class Pack, size_t I> struct append;<br>
-template <size_t... Is, size_t I><br>
-struct append<int_pack<Is...>, I> : int_pack<Is..., I> {};<br>
-<br>
-template <size_t C><br>
-struct make_int_pack : append<typename make_int_pack<C - 1>::type, C - 1> {};<br>
-template <> struct make_int_pack<0> : int_pack<> {};<br>
-<br>
template <typename F, typename Tuple, size_t... Idx><br>
-auto ApplyImpl(F&& f, Tuple&& args, int_pack<Idx...>) -> decltype(<br>
+auto ApplyImpl(F&& f, Tuple&& args, IndexSequence<Idx...>) -> decltype(<br>
std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...)) {<br>
return std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...);<br>
}<br>
@@ -560,12 +468,42 @@ auto ApplyImpl(F&& f, Tuple&& args, int_pack<Idx...>) -> decltype(<br>
template <typename F, typename Tuple><br>
auto Apply(F&& f, Tuple&& args)<br>
-> decltype(ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),<br>
- make_int_pack<std::tuple_size<Tuple>::value>())) {<br>
+ MakeIndexSequence<std::tuple_size<Tuple>::value>())) {<br>
return ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),<br>
- make_int_pack<std::tuple_size<Tuple>::value>());<br>
+ MakeIndexSequence<std::tuple_size<Tuple>::value>());<br>
}<br>
-#endif<br>
<br>
+// Template struct Function<F>, where F must be a function type, contains<br>
+// the following typedefs:<br>
+//<br>
+// Result: the function's return type.<br>
+// Arg<N>: the type of the N-th argument, where N starts with 0.<br>
+// ArgumentTuple: the tuple type consisting of all parameters of F.<br>
+// ArgumentMatcherTuple: the tuple type consisting of Matchers for all<br>
+// parameters of F.<br>
+// MakeResultVoid: the function type obtained by substituting void<br>
+// for the return type of F.<br>
+// MakeResultIgnoredValue:<br>
+// the function type obtained by substituting Something<br>
+// for the return type of F.<br>
+template <typename T><br>
+struct Function;<br>
+<br>
+template <typename R, typename... Args><br>
+struct Function<R(Args...)> {<br>
+ using Result = R;<br>
+ static constexpr size_t ArgumentCount = sizeof...(Args);<br>
+ template <size_t I><br>
+ using Arg = ElemFromList<I, typename MakeIndexSequence<sizeof...(Args)>::type,<br>
+ Args...>;<br>
+ using ArgumentTuple = std::tuple<Args...>;<br>
+ using ArgumentMatcherTuple = std::tuple<Matcher<Args>...>;<br>
+ using MakeResultVoid = void(Args...);<br>
+ using MakeResultIgnoredValue = IgnoredValue(Args...);<br>
+};<br>
+<br>
+template <typename R, typename... Args><br>
+constexpr size_t Function<R(Args...)>::ArgumentCount;<br>
<br>
#ifdef _MSC_VER<br>
# pragma warning(pop)<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-port.h b/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-port.h<br>
index 0ee6abc80fcd4..27e4c0caf2bcc 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-port.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-port.h<br>
@@ -54,14 +54,13 @@<br>
// here, as Google Mock depends on Google Test. Only add a utility<br>
// here if it's truly specific to Google Mock.<br>
<br>
-#include "gtest/internal/gtest-linked_ptr.h"<br>
#include "gtest/internal/gtest-port.h"<br>
#include "gmock/internal/custom/gmock-port.h"<br>
<br>
-// For MS Visual C++, check the compiler version. At least VS 2003 is<br>
+// For MS Visual C++, check the compiler version. At least VS 2015 is<br>
// required to compile Google Mock.<br>
-#if defined(_MSC_VER) && _MSC_VER < 1310<br>
-# error "At least Visual C++ 2003 (7.1) is required to compile Google Mock."<br>
+#if defined(_MSC_VER) && _MSC_VER < 1900<br>
+# error "At least Visual C++ 2015 (14.0) is required to compile Google Mock."<br>
#endif<br>
<br>
// Macro for referencing flags. This is public as we want the user to<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-pp.h b/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-pp.h<br>
new file mode 100644<br>
index 0000000000000..1ab80e1cdbee6<br>
--- /dev/null<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-pp.h<br>
@@ -0,0 +1,317 @@<br>
+#ifndef THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_PP_H_<br>
+#define THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_PP_H_<br>
+<br>
+#undef GMOCK_PP_INTERNAL_USE_MSVC<br>
+#if defined(__clang__)<br>
+#define GMOCK_PP_INTERNAL_USE_MSVC 0<br>
+#elif defined(_MSC_VER)<br>
+// TODO(iserna): Also verify tradional versus comformant preprocessor.<br>
+static_assert(<br>
+ _MSC_VER >= 1900,<br>
+ "MSVC version not supported. There is support for MSVC 14.0 and above.");<br>
+#define GMOCK_PP_INTERNAL_USE_MSVC 1<br>
+#else<br>
+#define GMOCK_PP_INTERNAL_USE_MSVC 0<br>
+#endif<br>
+<br>
+// Expands and concatenates the arguments. Constructed macros reevaluate.<br>
+#define GMOCK_PP_CAT(_1, _2) GMOCK_PP_INTERNAL_CAT(_1, _2)<br>
+<br>
+// Expands and stringifies the only argument.<br>
+#define GMOCK_PP_STRINGIZE(...) GMOCK_PP_INTERNAL_STRINGIZE(__VA_ARGS__)<br>
+<br>
+// Returns empty. Given a variadic number of arguments.<br>
+#define GMOCK_PP_EMPTY(...)<br>
+<br>
+// Returns a comma. Given a variadic number of arguments.<br>
+#define GMOCK_PP_COMMA(...) ,<br>
+<br>
+// Returns the only argument.<br>
+#define GMOCK_PP_IDENTITY(_1) _1<br>
+<br>
+// MSVC preprocessor collapses __VA_ARGS__ in a single argument, we use a<br>
+// CAT-like directive to force correct evaluation. Each macro has its own.<br>
+#if GMOCK_PP_INTERNAL_USE_MSVC<br>
+<br>
+// Evaluates to the number of arguments after expansion.<br>
+//<br>
+// #define PAIR x, y<br>
+//<br>
+// GMOCK_PP_NARG() => 1<br>
+// GMOCK_PP_NARG(x) => 1<br>
+// GMOCK_PP_NARG(x, y) => 2<br>
+// GMOCK_PP_NARG(PAIR) => 2<br>
+//<br>
+// Requires: the number of arguments after expansion is at most 15.<br>
+#define GMOCK_PP_NARG(...) \<br>
+ GMOCK_PP_INTERNAL_NARG_CAT( \<br>
+ GMOCK_PP_INTERNAL_INTERNAL_16TH(__VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, \<br>
+ 8, 7, 6, 5, 4, 3, 2, 1), )<br>
+<br>
+// Returns 1 if the expansion of arguments has an unprotected comma. Otherwise<br>
+// returns 0. Requires no more than 15 unprotected commas.<br>
+#define GMOCK_PP_HAS_COMMA(...) \<br>
+ GMOCK_PP_INTERNAL_HAS_COMMA_CAT( \<br>
+ GMOCK_PP_INTERNAL_INTERNAL_16TH(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, \<br>
+ 1, 1, 1, 1, 1, 0), )<br>
+// Returns the first argument.<br>
+#define GMOCK_PP_HEAD(...) \<br>
+ GMOCK_PP_INTERNAL_HEAD_CAT(GMOCK_PP_INTERNAL_HEAD(__VA_ARGS__), )<br>
+<br>
+// Returns the tail. A variadic list of all arguments minus the first. Requires<br>
+// at least one argument.<br>
+#define GMOCK_PP_TAIL(...) \<br>
+ GMOCK_PP_INTERNAL_TAIL_CAT(GMOCK_PP_INTERNAL_TAIL(__VA_ARGS__), )<br>
+<br>
+// Calls CAT(_Macro, NARG(__VA_ARGS__))(__VA_ARGS__)<br>
+#define GMOCK_PP_VARIADIC_CALL(_Macro, ...) \<br>
+ GMOCK_PP_INTERNAL_VARIADIC_CALL_CAT( \<br>
+ GMOCK_PP_CAT(_Macro, GMOCK_PP_NARG(__VA_ARGS__))(__VA_ARGS__), )<br>
+<br>
+#else // GMOCK_PP_INTERNAL_USE_MSVC<br>
+<br>
+#define GMOCK_PP_NARG(...) \<br>
+ GMOCK_PP_INTERNAL_INTERNAL_16TH(__VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, \<br>
+ 7, 6, 5, 4, 3, 2, 1)<br>
+#define GMOCK_PP_HAS_COMMA(...) \<br>
+ GMOCK_PP_INTERNAL_INTERNAL_16TH(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \<br>
+ 1, 1, 1, 1, 0)<br>
+#define GMOCK_PP_HEAD(...) GMOCK_PP_INTERNAL_HEAD(__VA_ARGS__)<br>
+#define GMOCK_PP_TAIL(...) GMOCK_PP_INTERNAL_TAIL(__VA_ARGS__)<br>
+#define GMOCK_PP_VARIADIC_CALL(_Macro, ...) \<br>
+ GMOCK_PP_CAT(_Macro, GMOCK_PP_NARG(__VA_ARGS__))(__VA_ARGS__)<br>
+<br>
+#endif // GMOCK_PP_INTERNAL_USE_MSVC<br>
+<br>
+// If the arguments after expansion have no tokens, evaluates to `1`. Otherwise<br>
+// evaluates to `0`.<br>
+//<br>
+// Requires: * the number of arguments after expansion is at most 15.<br>
+// * If the argument is a macro, it must be able to be called with one<br>
+// argument.<br>
+//<br>
+// Implementation details:<br>
+//<br>
+// There is one case when it generates a compile error: if the argument is macro<br>
+// that cannot be called with one argument.<br>
+//<br>
+// #define M(a, b) // it doesn't matter what it expands to<br>
+//<br>
+// // Expected: expands to `0`.<br>
+// // Actual: compile error.<br>
+// GMOCK_PP_IS_EMPTY(M)<br>
+//<br>
+// There are 4 cases tested:<br>
+//<br>
+// * __VA_ARGS__ possible expansion has no unparen'd commas. Expected 0.<br>
+// * __VA_ARGS__ possible expansion is not enclosed in parenthesis. Expected 0.<br>
+// * __VA_ARGS__ possible expansion is not a macro that ()-evaluates to a comma.<br>
+// Expected 0<br>
+// * __VA_ARGS__ is empty, or has unparen'd commas, or is enclosed in<br>
+// parenthesis, or is a macro that ()-evaluates to comma. Expected 1.<br>
+//<br>
+// We trigger detection on '0001', i.e. on empty.<br>
+#define GMOCK_PP_IS_EMPTY(...) \<br>
+ GMOCK_PP_INTERNAL_IS_EMPTY(GMOCK_PP_HAS_COMMA(__VA_ARGS__), \<br>
+ GMOCK_PP_HAS_COMMA(GMOCK_PP_COMMA __VA_ARGS__), \<br>
+ GMOCK_PP_HAS_COMMA(__VA_ARGS__()), \<br>
+ GMOCK_PP_HAS_COMMA(GMOCK_PP_COMMA __VA_ARGS__()))<br>
+<br>
+// Evaluates to _Then if _Cond is 1 and _Else if _Cond is 0.<br>
+#define GMOCK_PP_IF(_Cond, _Then, _Else) \<br>
+ GMOCK_PP_CAT(GMOCK_PP_INTERNAL_IF_, _Cond)(_Then, _Else)<br>
+<br>
+// Evaluates to the number of arguments after expansion. Identifies 'empty' as<br>
+// 0.<br>
+//<br>
+// #define PAIR x, y<br>
+//<br>
+// GMOCK_PP_NARG0() => 0<br>
+// GMOCK_PP_NARG0(x) => 1<br>
+// GMOCK_PP_NARG0(x, y) => 2<br>
+// GMOCK_PP_NARG0(PAIR) => 2<br>
+//<br>
+// Requires: * the number of arguments after expansion is at most 15.<br>
+// * If the argument is a macro, it must be able to be called with one<br>
+// argument.<br>
+#define GMOCK_PP_NARG0(...) \<br>
+ GMOCK_PP_IF(GMOCK_PP_IS_EMPTY(__VA_ARGS__), 0, GMOCK_PP_NARG(__VA_ARGS__))<br>
+<br>
+// Expands to 1 if the first argument starts with something in parentheses,<br>
+// otherwise to 0.<br>
+#define GMOCK_PP_IS_BEGIN_PARENS(...) \<br>
+ GMOCK_PP_INTERNAL_ALTERNATE_HEAD( \<br>
+ GMOCK_PP_CAT(GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_R_, \<br>
+ GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_C __VA_ARGS__))<br>
+<br>
+// Expands to 1 is there is only one argument and it is enclosed in parentheses.<br>
+#define GMOCK_PP_IS_ENCLOSED_PARENS(...) \<br>
+ GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(__VA_ARGS__), \<br>
+ GMOCK_PP_IS_EMPTY(GMOCK_PP_EMPTY __VA_ARGS__), 0)<br>
+<br>
+// Remove the parens, requires GMOCK_PP_IS_ENCLOSED_PARENS(args) => 1.<br>
+#define GMOCK_PP_REMOVE_PARENS(...) GMOCK_PP_INTERNAL_REMOVE_PARENS __VA_ARGS__<br>
+<br>
+// Expands to _Macro(0, _Data, e1) _Macro(1, _Data, e2) ... _Macro(K -1, _Data,<br>
+// eK) as many of GMOCK_INTERNAL_NARG0 _Tuple.<br>
+// Requires: * |_Macro| can be called with 3 arguments.<br>
+// * |_Tuple| expansion has no more than 15 elements.<br>
+#define GMOCK_PP_FOR_EACH(_Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_CAT(GMOCK_PP_INTERNAL_FOR_EACH_IMPL_, GMOCK_PP_NARG0 _Tuple) \<br>
+ (0, _Macro, _Data, _Tuple)<br>
+<br>
+// Expands to _Macro(0, _Data, ) _Macro(1, _Data, ) ... _Macro(K - 1, _Data, )<br>
+// Empty if _K = 0.<br>
+// Requires: * |_Macro| can be called with 3 arguments.<br>
+// * |_K| literal between 0 and 15<br>
+#define GMOCK_PP_REPEAT(_Macro, _Data, _N) \<br>
+ GMOCK_PP_CAT(GMOCK_PP_INTERNAL_FOR_EACH_IMPL_, _N) \<br>
+ (0, _Macro, _Data, GMOCK_PP_INTENRAL_EMPTY_TUPLE)<br>
+<br>
+// Increments the argument, requires the argument to be between 0 and 15.<br>
+#define GMOCK_PP_INC(_i) GMOCK_PP_CAT(GMOCK_PP_INTERNAL_INC_, _i)<br>
+<br>
+// Returns comma if _i != 0. Requires _i to be between 0 and 15.<br>
+#define GMOCK_PP_COMMA_IF(_i) GMOCK_PP_CAT(GMOCK_PP_INTERNAL_COMMA_IF_, _i)<br>
+<br>
+// Internal details follow. Do not use any of these symbols outside of this<br>
+// file or we will break your code.<br>
+#define GMOCK_PP_INTENRAL_EMPTY_TUPLE (, , , , , , , , , , , , , , , )<br>
+#define GMOCK_PP_INTERNAL_CAT(_1, _2) _1##_2<br>
+#define GMOCK_PP_INTERNAL_STRINGIZE(...) #__VA_ARGS__<br>
+#define GMOCK_PP_INTERNAL_INTERNAL_16TH(_1, _2, _3, _4, _5, _6, _7, _8, _9, \<br>
+ _10, _11, _12, _13, _14, _15, _16, \<br>
+ ...) \<br>
+ _16<br>
+#define GMOCK_PP_INTERNAL_CAT_5(_1, _2, _3, _4, _5) _1##_2##_3##_4##_5<br>
+#define GMOCK_PP_INTERNAL_IS_EMPTY(_1, _2, _3, _4) \<br>
+ GMOCK_PP_HAS_COMMA(GMOCK_PP_INTERNAL_CAT_5(GMOCK_PP_INTERNAL_IS_EMPTY_CASE_, \<br>
+ _1, _2, _3, _4))<br>
+#define GMOCK_PP_INTERNAL_IS_EMPTY_CASE_0001 ,<br>
+#define GMOCK_PP_INTERNAL_IF_1(_Then, _Else) _Then<br>
+#define GMOCK_PP_INTERNAL_IF_0(_Then, _Else) _Else<br>
+#define GMOCK_PP_INTERNAL_HEAD(_1, ...) _1<br>
+#define GMOCK_PP_INTERNAL_TAIL(_1, ...) __VA_ARGS__<br>
+<br>
+#if GMOCK_PP_INTERNAL_USE_MSVC<br>
+#define GMOCK_PP_INTERNAL_NARG_CAT(_1, _2) GMOCK_PP_INTERNAL_NARG_CAT_I(_1, _2)<br>
+#define GMOCK_PP_INTERNAL_HEAD_CAT(_1, _2) GMOCK_PP_INTERNAL_HEAD_CAT_I(_1, _2)<br>
+#define GMOCK_PP_INTERNAL_HAS_COMMA_CAT(_1, _2) \<br>
+ GMOCK_PP_INTERNAL_HAS_COMMA_CAT_I(_1, _2)<br>
+#define GMOCK_PP_INTERNAL_TAIL_CAT(_1, _2) GMOCK_PP_INTERNAL_TAIL_CAT_I(_1, _2)<br>
+#define GMOCK_PP_INTERNAL_VARIADIC_CALL_CAT(_1, _2) \<br>
+ GMOCK_PP_INTERNAL_VARIADIC_CALL_CAT_I(_1, _2)<br>
+#define GMOCK_PP_INTERNAL_NARG_CAT_I(_1, _2) _1##_2<br>
+#define GMOCK_PP_INTERNAL_HEAD_CAT_I(_1, _2) _1##_2<br>
+#define GMOCK_PP_INTERNAL_HAS_COMMA_CAT_I(_1, _2) _1##_2<br>
+#define GMOCK_PP_INTERNAL_TAIL_CAT_I(_1, _2) _1##_2<br>
+#define GMOCK_PP_INTERNAL_VARIADIC_CALL_CAT_I(_1, _2) _1##_2<br>
+#define GMOCK_PP_INTERNAL_ALTERNATE_HEAD(...) \<br>
+ GMOCK_PP_INTERNAL_ALTERNATE_HEAD_CAT(GMOCK_PP_HEAD(__VA_ARGS__), )<br>
+#define GMOCK_PP_INTERNAL_ALTERNATE_HEAD_CAT(_1, _2) \<br>
+ GMOCK_PP_INTERNAL_ALTERNATE_HEAD_CAT_I(_1, _2)<br>
+#define GMOCK_PP_INTERNAL_ALTERNATE_HEAD_CAT_I(_1, _2) _1##_2<br>
+#else // GMOCK_PP_INTERNAL_USE_MSVC<br>
+#define GMOCK_PP_INTERNAL_ALTERNATE_HEAD(...) GMOCK_PP_HEAD(__VA_ARGS__)<br>
+#endif // GMOCK_PP_INTERNAL_USE_MSVC<br>
+<br>
+#define GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_C(...) 1 _<br>
+#define GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_R_1 1,<br>
+#define GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_R_GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_C \<br>
+ 0,<br>
+#define GMOCK_PP_INTERNAL_REMOVE_PARENS(...) __VA_ARGS__<br>
+#define GMOCK_PP_INTERNAL_INC_0 1<br>
+#define GMOCK_PP_INTERNAL_INC_1 2<br>
+#define GMOCK_PP_INTERNAL_INC_2 3<br>
+#define GMOCK_PP_INTERNAL_INC_3 4<br>
+#define GMOCK_PP_INTERNAL_INC_4 5<br>
+#define GMOCK_PP_INTERNAL_INC_5 6<br>
+#define GMOCK_PP_INTERNAL_INC_6 7<br>
+#define GMOCK_PP_INTERNAL_INC_7 8<br>
+#define GMOCK_PP_INTERNAL_INC_8 9<br>
+#define GMOCK_PP_INTERNAL_INC_9 10<br>
+#define GMOCK_PP_INTERNAL_INC_10 11<br>
+#define GMOCK_PP_INTERNAL_INC_11 12<br>
+#define GMOCK_PP_INTERNAL_INC_12 13<br>
+#define GMOCK_PP_INTERNAL_INC_13 14<br>
+#define GMOCK_PP_INTERNAL_INC_14 15<br>
+#define GMOCK_PP_INTERNAL_INC_15 16<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_0<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_1 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_2 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_3 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_4 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_5 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_6 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_7 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_8 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_9 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_10 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_11 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_12 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_13 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_14 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_15 ,<br>
+#define GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, _element) \<br>
+ _Macro(_i, _Data, _element)<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_0(_i, _Macro, _Data, _Tuple)<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_1(_i, _Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple)<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_2(_i, _Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+ GMOCK_PP_INTERNAL_FOR_EACH_IMPL_1(GMOCK_PP_INC(_i), _Macro, _Data, \<br>
+ (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_3(_i, _Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+ GMOCK_PP_INTERNAL_FOR_EACH_IMPL_2(GMOCK_PP_INC(_i), _Macro, _Data, \<br>
+ (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_4(_i, _Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+ GMOCK_PP_INTERNAL_FOR_EACH_IMPL_3(GMOCK_PP_INC(_i), _Macro, _Data, \<br>
+ (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_5(_i, _Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+ GMOCK_PP_INTERNAL_FOR_EACH_IMPL_4(GMOCK_PP_INC(_i), _Macro, _Data, \<br>
+ (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_6(_i, _Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+ GMOCK_PP_INTERNAL_FOR_EACH_IMPL_5(GMOCK_PP_INC(_i), _Macro, _Data, \<br>
+ (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_7(_i, _Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+ GMOCK_PP_INTERNAL_FOR_EACH_IMPL_6(GMOCK_PP_INC(_i), _Macro, _Data, \<br>
+ (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_8(_i, _Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+ GMOCK_PP_INTERNAL_FOR_EACH_IMPL_7(GMOCK_PP_INC(_i), _Macro, _Data, \<br>
+ (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_9(_i, _Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+ GMOCK_PP_INTERNAL_FOR_EACH_IMPL_8(GMOCK_PP_INC(_i), _Macro, _Data, \<br>
+ (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_10(_i, _Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+ GMOCK_PP_INTERNAL_FOR_EACH_IMPL_9(GMOCK_PP_INC(_i), _Macro, _Data, \<br>
+ (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_11(_i, _Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+ GMOCK_PP_INTERNAL_FOR_EACH_IMPL_10(GMOCK_PP_INC(_i), _Macro, _Data, \<br>
+ (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_12(_i, _Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+ GMOCK_PP_INTERNAL_FOR_EACH_IMPL_11(GMOCK_PP_INC(_i), _Macro, _Data, \<br>
+ (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_13(_i, _Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+ GMOCK_PP_INTERNAL_FOR_EACH_IMPL_12(GMOCK_PP_INC(_i), _Macro, _Data, \<br>
+ (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_14(_i, _Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+ GMOCK_PP_INTERNAL_FOR_EACH_IMPL_13(GMOCK_PP_INC(_i), _Macro, _Data, \<br>
+ (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_15(_i, _Macro, _Data, _Tuple) \<br>
+ GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+ GMOCK_PP_INTERNAL_FOR_EACH_IMPL_14(GMOCK_PP_INC(_i), _Macro, _Data, \<br>
+ (GMOCK_PP_TAIL _Tuple))<br>
+<br>
+#endif // THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PP_H_<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/src/gmock-cardinalities.cc b/llvm/utils/unittest/googlemock/src/gmock-cardinalities.cc<br>
index 0549f7276d78c..7463f4383233c 100644<br>
--- a/llvm/utils/unittest/googlemock/src/gmock-cardinalities.cc<br>
+++ b/llvm/utils/unittest/googlemock/src/gmock-cardinalities.cc<br>
@@ -70,18 +70,18 @@ class BetweenCardinalityImpl : public CardinalityInterface {<br>
<br>
// Conservative estimate on the lower/upper bound of the number of<br>
// calls allowed.<br>
- virtual int ConservativeLowerBound() const { return min_; }<br>
- virtual int ConservativeUpperBound() const { return max_; }<br>
+ int ConservativeLowerBound() const override { return min_; }<br>
+ int ConservativeUpperBound() const override { return max_; }<br>
<br>
- virtual bool IsSatisfiedByCallCount(int call_count) const {<br>
+ bool IsSatisfiedByCallCount(int call_count) const override {<br>
return min_ <= call_count && call_count <= max_;<br>
}<br>
<br>
- virtual bool IsSaturatedByCallCount(int call_count) const {<br>
+ bool IsSaturatedByCallCount(int call_count) const override {<br>
return call_count >= max_;<br>
}<br>
<br>
- virtual void DescribeTo(::std::ostream* os) const;<br>
+ void DescribeTo(::std::ostream* os) const override;<br>
<br>
private:<br>
const int min_;<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/src/gmock-internal-utils.cc b/llvm/utils/unittest/googlemock/src/gmock-internal-utils.cc<br>
index e3a674859a85d..e5b547981d14d 100644<br>
--- a/llvm/utils/unittest/googlemock/src/gmock-internal-utils.cc<br>
+++ b/llvm/utils/unittest/googlemock/src/gmock-internal-utils.cc<br>
@@ -93,8 +93,8 @@ GTEST_API_ std::string ConvertIdentifierNameToWords(const char* id_name) {<br>
// use Google Mock with a testing framework other than Google Test.<br>
class GoogleTestFailureReporter : public FailureReporterInterface {<br>
public:<br>
- virtual void ReportFailure(FailureType type, const char* file, int line,<br>
- const std::string& message) {<br>
+ void ReportFailure(FailureType type, const char* file, int line,<br>
+ const std::string& message) override {<br>
AssertHelper(type == kFatal ?<br>
TestPartResult::kFatalFailure :<br>
TestPartResult::kNonFatalFailure,<br>
@@ -123,8 +123,8 @@ GTEST_API_ FailureReporterInterface* GetFailureReporter() {<br>
// Protects global resources (stdout in particular) used by Log().<br>
static GTEST_DEFINE_STATIC_MUTEX_(g_log_mutex);<br>
<br>
-// Returns true iff a log with the given severity is visible according<br>
-// to the --gmock_verbose flag.<br>
+// Returns true if and only if a log with the given severity is visible<br>
+// according to the --gmock_verbose flag.<br>
GTEST_API_ bool LogIsVisible(LogSeverity severity) {<br>
if (GMOCK_FLAG(verbose) == kInfoVerbosity) {<br>
// Always show the log if --gmock_verbose=info.<br>
@@ -139,7 +139,7 @@ GTEST_API_ bool LogIsVisible(LogSeverity severity) {<br>
}<br>
}<br>
<br>
-// Prints the given message to stdout iff 'severity' >= the level<br>
+// Prints the given message to stdout if and only if 'severity' >= the level<br>
// specified by the --gmock_verbose flag. If stack_frames_to_skip >=<br>
// 0, also prints the stack trace excluding the top<br>
// stack_frames_to_skip frames. In opt mode, any positive<br>
@@ -154,9 +154,6 @@ GTEST_API_ void Log(LogSeverity severity, const std::string& message,<br>
// Ensures that logs from <br>
diff erent threads don't interleave.<br>
MutexLock l(&g_log_mutex);<br>
<br>
- // "using ::std::cout;" doesn't work with Symbian's STLport, where cout is a<br>
- // macro.<br>
-<br>
if (severity == kWarning) {<br>
// Prints a GMOCK WARNING marker to make the warnings easily searchable.<br>
std::cout << "\nGMOCK WARNING:";<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/src/gmock-matchers.cc b/llvm/utils/unittest/googlemock/src/gmock-matchers.cc<br>
index f8ddff15b5c05..4a3f7af2351de 100644<br>
--- a/llvm/utils/unittest/googlemock/src/gmock-matchers.cc<br>
+++ b/llvm/utils/unittest/googlemock/src/gmock-matchers.cc<br>
@@ -42,116 +42,6 @@<br>
#include <string><br>
<br>
namespace testing {<br>
-<br>
-// Constructs a matcher that matches a const std::string& whose value is<br>
-// equal to s.<br>
-Matcher<const std::string&>::Matcher(const std::string& s) { *this = Eq(s); }<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-// Constructs a matcher that matches a const std::string& whose value is<br>
-// equal to s.<br>
-Matcher<const std::string&>::Matcher(const ::string& s) {<br>
- *this = Eq(static_cast<std::string>(s));<br>
-}<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-// Constructs a matcher that matches a const std::string& whose value is<br>
-// equal to s.<br>
-Matcher<const std::string&>::Matcher(const char* s) {<br>
- *this = Eq(std::string(s));<br>
-}<br>
-<br>
-// Constructs a matcher that matches a std::string whose value is equal to<br>
-// s.<br>
-Matcher<std::string>::Matcher(const std::string& s) { *this = Eq(s); }<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-// Constructs a matcher that matches a std::string whose value is equal to<br>
-// s.<br>
-Matcher<std::string>::Matcher(const ::string& s) {<br>
- *this = Eq(static_cast<std::string>(s));<br>
-}<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-// Constructs a matcher that matches a std::string whose value is equal to<br>
-// s.<br>
-Matcher<std::string>::Matcher(const char* s) { *this = Eq(std::string(s)); }<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-// Constructs a matcher that matches a const ::string& whose value is<br>
-// equal to s.<br>
-Matcher<const ::string&>::Matcher(const std::string& s) {<br>
- *this = Eq(static_cast<::string>(s));<br>
-}<br>
-<br>
-// Constructs a matcher that matches a const ::string& whose value is<br>
-// equal to s.<br>
-Matcher<const ::string&>::Matcher(const ::string& s) { *this = Eq(s); }<br>
-<br>
-// Constructs a matcher that matches a const ::string& whose value is<br>
-// equal to s.<br>
-Matcher<const ::string&>::Matcher(const char* s) { *this = Eq(::string(s)); }<br>
-<br>
-// Constructs a matcher that matches a ::string whose value is equal to s.<br>
-Matcher<::string>::Matcher(const std::string& s) {<br>
- *this = Eq(static_cast<::string>(s));<br>
-}<br>
-<br>
-// Constructs a matcher that matches a ::string whose value is equal to s.<br>
-Matcher<::string>::Matcher(const ::string& s) { *this = Eq(s); }<br>
-<br>
-// Constructs a matcher that matches a string whose value is equal to s.<br>
-Matcher<::string>::Matcher(const char* s) { *this = Eq(::string(s)); }<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-#if GTEST_HAS_ABSL<br>
-// Constructs a matcher that matches a const absl::string_view& whose value is<br>
-// equal to s.<br>
-Matcher<const absl::string_view&>::Matcher(const std::string& s) {<br>
- *this = Eq(s);<br>
-}<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-// Constructs a matcher that matches a const absl::string_view& whose value is<br>
-// equal to s.<br>
-Matcher<const absl::string_view&>::Matcher(const ::string& s) { *this = Eq(s); }<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-// Constructs a matcher that matches a const absl::string_view& whose value is<br>
-// equal to s.<br>
-Matcher<const absl::string_view&>::Matcher(const char* s) {<br>
- *this = Eq(std::string(s));<br>
-}<br>
-<br>
-// Constructs a matcher that matches a const absl::string_view& whose value is<br>
-// equal to s.<br>
-Matcher<const absl::string_view&>::Matcher(absl::string_view s) {<br>
- *this = Eq(std::string(s));<br>
-}<br>
-<br>
-// Constructs a matcher that matches a absl::string_view whose value is equal to<br>
-// s.<br>
-Matcher<absl::string_view>::Matcher(const std::string& s) { *this = Eq(s); }<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-// Constructs a matcher that matches a absl::string_view whose value is equal to<br>
-// s.<br>
-Matcher<absl::string_view>::Matcher(const ::string& s) { *this = Eq(s); }<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-// Constructs a matcher that matches a absl::string_view whose value is equal to<br>
-// s.<br>
-Matcher<absl::string_view>::Matcher(const char* s) {<br>
- *this = Eq(std::string(s));<br>
-}<br>
-<br>
-// Constructs a matcher that matches a absl::string_view whose value is equal to<br>
-// s.<br>
-Matcher<absl::string_view>::Matcher(absl::string_view s) {<br>
- *this = Eq(std::string(s));<br>
-}<br>
-#endif // GTEST_HAS_ABSL<br>
-<br>
namespace internal {<br>
<br>
// Returns the description for a matcher defined using the MATCHER*()<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/src/gmock-spec-builders.cc b/llvm/utils/unittest/googlemock/src/gmock-spec-builders.cc<br>
index b93f4e0ef6b50..f9d3434560b40 100644<br>
--- a/llvm/utils/unittest/googlemock/src/gmock-spec-builders.cc<br>
+++ b/llvm/utils/unittest/googlemock/src/gmock-spec-builders.cc<br>
@@ -38,6 +38,7 @@<br>
#include <stdlib.h><br>
#include <iostream> // NOLINT<br>
#include <map><br>
+#include <memory><br>
#include <set><br>
#include <string><br>
#include <vector><br>
@@ -49,9 +50,9 @@<br>
#endif<br>
<br>
// Silence C4800 (C4800: 'int *const ': forcing value<br>
-// to bool 'true' or 'false') for MSVC 14,15<br>
+// to bool 'true' or 'false') for MSVC 15<br>
#ifdef _MSC_VER<br>
-#if _MSC_VER <= 1900<br>
+#if _MSC_VER == 1900<br>
# pragma warning(push)<br>
# pragma warning(disable:4800)<br>
#endif<br>
@@ -125,8 +126,8 @@ void ExpectationBase::RetireAllPreRequisites()<br>
}<br>
}<br>
<br>
-// Returns true iff all pre-requisites of this expectation have been<br>
-// satisfied.<br>
+// Returns true if and only if all pre-requisites of this expectation<br>
+// have been satisfied.<br>
bool ExpectationBase::AllPrerequisitesAreSatisfied() const<br>
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
g_gmock_mutex.AssertHeld();<br>
@@ -291,17 +292,17 @@ void ReportUninterestingCall(CallReaction reaction, const std::string& msg) {<br>
"an EXPECT_CALL() if you don't mean to enforce the call. "<br>
"See "<br>
"<a href="https://github.com/google/googletest/blob/master/googlemock/" rel="noreferrer" target="_blank">https://github.com/google/googletest/blob/master/googlemock/</a>"<br>
- "docs/CookBook.md#"<br>
+ "docs/cook_book.md#"<br>
"knowing-when-to-expect for details.\n",<br>
stack_frames_to_skip);<br>
break;<br>
default: // FAIL<br>
- Expect(false, NULL, -1, msg);<br>
+ Expect(false, nullptr, -1, msg);<br>
}<br>
}<br>
<br>
UntypedFunctionMockerBase::UntypedFunctionMockerBase()<br>
- : mock_obj_(NULL), name_("") {}<br>
+ : mock_obj_(nullptr), name_("") {}<br>
<br>
UntypedFunctionMockerBase::~UntypedFunctionMockerBase() {}<br>
<br>
@@ -340,7 +341,7 @@ const void* UntypedFunctionMockerBase::MockObject() const<br>
// We protect mock_obj_ under g_gmock_mutex in case this mock<br>
// function is called from two threads concurrently.<br>
MutexLock l(&g_gmock_mutex);<br>
- Assert(mock_obj_ != NULL, __FILE__, __LINE__,<br>
+ Assert(mock_obj_ != nullptr, __FILE__, __LINE__,<br>
"MockObject() must not be called before RegisterOwner() or "<br>
"SetOwnerAndName() has been called.");<br>
mock_obj = mock_obj_;<br>
@@ -357,7 +358,7 @@ const char* UntypedFunctionMockerBase::Name() const<br>
// We protect name_ under g_gmock_mutex in case this mock<br>
// function is called from two threads concurrently.<br>
MutexLock l(&g_gmock_mutex);<br>
- Assert(name_ != NULL, __FILE__, __LINE__,<br>
+ Assert(name_ != nullptr, __FILE__, __LINE__,<br>
"Name() must not be called before SetOwnerAndName() has "<br>
"been called.");<br>
name = name_;<br>
@@ -383,7 +384,7 @@ UntypedActionResultHolderBase* UntypedFunctionMockerBase::UntypedInvokeWith(<br>
const CallReaction reaction =<br>
Mock::GetReactionOnUninterestingCalls(MockObject());<br>
<br>
- // True iff we need to print this call's arguments and return<br>
+ // True if and only if we need to print this call's arguments and return<br>
// value. This definition must be kept in sync with<br>
// the behavior of ReportUninterestingCall().<br>
const bool need_to_report_uninteresting_call =<br>
@@ -414,8 +415,7 @@ UntypedActionResultHolderBase* UntypedFunctionMockerBase::UntypedInvokeWith(<br>
this->UntypedPerformDefaultAction(untyped_args, ss.str());<br>
<br>
// Prints the function result.<br>
- if (result != NULL)<br>
- result->PrintAsActionResult(&ss);<br>
+ if (result != nullptr) result->PrintAsActionResult(&ss);<br>
<br>
ReportUninterestingCall(reaction, ss.str());<br>
return result;<br>
@@ -425,7 +425,7 @@ UntypedActionResultHolderBase* UntypedFunctionMockerBase::UntypedInvokeWith(<br>
::std::stringstream ss;<br>
::std::stringstream why;<br>
::std::stringstream loc;<br>
- const void* untyped_action = NULL;<br>
+ const void* untyped_action = nullptr;<br>
<br>
// The UntypedFindMatchingExpectation() function acquires and<br>
// releases g_gmock_mutex.<br>
@@ -433,19 +433,19 @@ UntypedActionResultHolderBase* UntypedFunctionMockerBase::UntypedInvokeWith(<br>
this->UntypedFindMatchingExpectation(<br>
untyped_args, &untyped_action, &is_excessive,<br>
&ss, &why);<br>
- const bool found = untyped_expectation != NULL;<br>
+ const bool found = untyped_expectation != nullptr;<br>
<br>
- // True iff we need to print the call's arguments and return value.<br>
+ // True if and only if we need to print the call's arguments<br>
+ // and return value.<br>
// This definition must be kept in sync with the uses of Expect()<br>
// and Log() in this function.<br>
const bool need_to_report_call =<br>
!found || is_excessive || LogIsVisible(kInfo);<br>
if (!need_to_report_call) {<br>
// Perform the action without printing the call information.<br>
- return<br>
- untyped_action == NULL ?<br>
- this->UntypedPerformDefaultAction(untyped_args, "") :<br>
- this->UntypedPerformAction(untyped_action, untyped_args);<br>
+ return untyped_action == nullptr<br>
+ ? this->UntypedPerformDefaultAction(untyped_args, "")<br>
+ : this->UntypedPerformAction(untyped_action, untyped_args);<br>
}<br>
<br>
ss << " Function call: " << Name();<br>
@@ -458,16 +458,15 @@ UntypedActionResultHolderBase* UntypedFunctionMockerBase::UntypedInvokeWith(<br>
}<br>
<br>
UntypedActionResultHolderBase* const result =<br>
- untyped_action == NULL ?<br>
- this->UntypedPerformDefaultAction(untyped_args, ss.str()) :<br>
- this->UntypedPerformAction(untyped_action, untyped_args);<br>
- if (result != NULL)<br>
- result->PrintAsActionResult(&ss);<br>
+ untyped_action == nullptr<br>
+ ? this->UntypedPerformDefaultAction(untyped_args, ss.str())<br>
+ : this->UntypedPerformAction(untyped_action, untyped_args);<br>
+ if (result != nullptr) result->PrintAsActionResult(&ss);<br>
ss << "\n" << why.str();<br>
<br>
if (!found) {<br>
// No expectation matches this call - reports a failure.<br>
- Expect(false, NULL, -1, ss.str());<br>
+ Expect(false, nullptr, -1, ss.str());<br>
} else if (is_excessive) {<br>
// We had an upper-bound violation and the failure message is in ss.<br>
Expect(false, untyped_expectation->file(),<br>
@@ -568,15 +567,15 @@ typedef std::set<internal::UntypedFunctionMockerBase*> FunctionMockers;<br>
// expectations.<br>
struct MockObjectState {<br>
MockObjectState()<br>
- : first_used_file(NULL), first_used_line(-1), leakable(false) {}<br>
+ : first_used_file(nullptr), first_used_line(-1), leakable(false) {}<br>
<br>
// Where in the source file an ON_CALL or EXPECT_CALL is first<br>
// invoked on this mock object.<br>
const char* first_used_file;<br>
int first_used_line;<br>
- ::std::string first_used_test_case;<br>
+ ::std::string first_used_test_suite;<br>
::std::string first_used_test;<br>
- bool leakable; // true iff it's OK to leak the object.<br>
+ bool leakable; // true if and only if it's OK to leak the object.<br>
FunctionMockers function_mockers; // All registered methods of the object.<br>
};<br>
<br>
@@ -594,9 +593,6 @@ class MockObjectRegistry {<br>
// object alive. Therefore we report any living object as test<br>
// failure, unless the user explicitly asked us to ignore it.<br>
~MockObjectRegistry() {<br>
- // "using ::std::cout;" doesn't work with Symbian's STLport, where cout is<br>
- // a macro.<br>
-<br>
if (!GMOCK_FLAG(catch_leaked_mocks))<br>
return;<br>
<br>
@@ -614,8 +610,8 @@ class MockObjectRegistry {<br>
state.first_used_line);<br>
std::cout << " ERROR: this mock object";<br>
if (state.first_used_test != "") {<br>
- std::cout << " (used in test " << state.first_used_test_case << "."<br>
- << state.first_used_test << ")";<br>
+ std::cout << " (used in test " << state.first_used_test_suite << "."<br>
+ << state.first_used_test << ")";<br>
}<br>
std::cout << " should be deleted but never is. Its address is @"<br>
<< it->first << ".";<br>
@@ -723,7 +719,7 @@ bool Mock::VerifyAndClearExpectations(void* mock_obj)<br>
}<br>
<br>
// Verifies all expectations on the given mock object and clears its<br>
-// default actions and expectations. Returns true iff the<br>
+// default actions and expectations. Returns true if and only if the<br>
// verification was successful.<br>
bool Mock::VerifyAndClear(void* mock_obj)<br>
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {<br>
@@ -760,6 +756,19 @@ bool Mock::VerifyAndClearExpectationsLocked(void* mock_obj)<br>
return expectations_met;<br>
}<br>
<br>
+bool Mock::IsNaggy(void* mock_obj)<br>
+ GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {<br>
+ return Mock::GetReactionOnUninterestingCalls(mock_obj) == internal::kWarn;<br>
+}<br>
+bool Mock::IsNice(void* mock_obj)<br>
+ GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {<br>
+ return Mock::GetReactionOnUninterestingCalls(mock_obj) == internal::kAllow;<br>
+}<br>
+bool Mock::IsStrict(void* mock_obj)<br>
+ GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {<br>
+ return Mock::GetReactionOnUninterestingCalls(mock_obj) == internal::kFail;<br>
+}<br>
+<br>
// Registers a mock object and a mock method it owns.<br>
void Mock::Register(const void* mock_obj,<br>
internal::UntypedFunctionMockerBase* mocker)<br>
@@ -776,16 +785,13 @@ void Mock::RegisterUseByOnCallOrExpectCall(const void* mock_obj,<br>
GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {<br>
internal::MutexLock l(&internal::g_gmock_mutex);<br>
MockObjectState& state = g_mock_object_registry.states()[mock_obj];<br>
- if (state.first_used_file == NULL) {<br>
+ if (state.first_used_file == nullptr) {<br>
state.first_used_file = file;<br>
state.first_used_line = line;<br>
const TestInfo* const test_info =<br>
UnitTest::GetInstance()->current_test_info();<br>
- if (test_info != NULL) {<br>
- // FIXME: record the test case name when the<br>
- // ON_CALL or EXPECT_CALL is invoked from SetUpTestCase() or<br>
- // TearDownTestCase().<br>
- state.first_used_test_case = test_info->test_case_name();<br>
+ if (test_info != nullptr) {<br>
+ state.first_used_test_suite = test_info->test_suite_name();<br>
state.first_used_test = test_info->name();<br>
}<br>
}<br>
@@ -838,7 +844,7 @@ void Mock::ClearDefaultActionsLocked(void* mock_obj)<br>
Expectation::Expectation() {}<br>
<br>
Expectation::Expectation(<br>
- const internal::linked_ptr<internal::ExpectationBase>& an_expectation_base)<br>
+ const std::shared_ptr<internal::ExpectationBase>& an_expectation_base)<br>
: expectation_base_(an_expectation_base) {}<br>
<br>
Expectation::~Expectation() {}<br>
@@ -846,7 +852,7 @@ Expectation::~Expectation() {}<br>
// Adds an expectation to a sequence.<br>
void Sequence::AddExpectation(const Expectation& expectation) const {<br>
if (*last_expectation_ != expectation) {<br>
- if (last_expectation_->expectation_base() != NULL) {<br>
+ if (last_expectation_->expectation_base() != nullptr) {<br>
expectation.expectation_base()->immediate_prerequisites_<br>
+= *last_expectation_;<br>
}<br>
@@ -856,7 +862,7 @@ void Sequence::AddExpectation(const Expectation& expectation) const {<br>
<br>
// Creates the implicit sequence if there isn't one.<br>
InSequence::InSequence() {<br>
- if (internal::g_gmock_implicit_sequence.get() == NULL) {<br>
+ if (internal::g_gmock_implicit_sequence.get() == nullptr) {<br>
internal::g_gmock_implicit_sequence.set(new Sequence);<br>
sequence_created_ = true;<br>
} else {<br>
@@ -869,14 +875,14 @@ InSequence::InSequence() {<br>
InSequence::~InSequence() {<br>
if (sequence_created_) {<br>
delete internal::g_gmock_implicit_sequence.get();<br>
- internal::g_gmock_implicit_sequence.set(NULL);<br>
+ internal::g_gmock_implicit_sequence.set(nullptr);<br>
}<br>
}<br>
<br>
} // namespace testing<br>
<br>
#ifdef _MSC_VER<br>
-#if _MSC_VER <= 1900<br>
+#if _MSC_VER == 1900<br>
# pragma warning(pop)<br>
#endif<br>
#endif<br>
<br>
diff --git a/llvm/utils/unittest/googlemock/src/gmock.cc b/llvm/utils/unittest/googlemock/src/gmock.cc<br>
index 36356c9334ee2..32b2a7394fd08 100644<br>
--- a/llvm/utils/unittest/googlemock/src/gmock.cc<br>
+++ b/llvm/utils/unittest/googlemock/src/gmock.cc<br>
@@ -33,12 +33,9 @@<br>
<br>
namespace testing {<br>
<br>
-// FIXME: support using environment variables to<br>
-// control the flag values, like what Google Test does.<br>
-<br>
GMOCK_DEFINE_bool_(catch_leaked_mocks, true,<br>
- "true iff Google Mock should report leaked mock objects "<br>
- "as failures.");<br>
+ "true if and only if Google Mock should report leaked "<br>
+ "mock objects as failures.");<br>
<br>
GMOCK_DEFINE_string_(verbose, internal::kWarningVerbosity,<br>
"Controls how verbose Google Mock's output is."<br>
@@ -65,12 +62,12 @@ static const char* ParseGoogleMockFlagValue(const char* str,<br>
const char* flag,<br>
bool def_optional) {<br>
// str and flag must not be NULL.<br>
- if (str == NULL || flag == NULL) return NULL;<br>
+ if (str == nullptr || flag == nullptr) return nullptr;<br>
<br>
// The flag must start with "--gmock_".<br>
const std::string flag_str = std::string("--gmock_") + flag;<br>
const size_t flag_len = flag_str.length();<br>
- if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;<br>
+ if (strncmp(str, flag_str.c_str(), flag_len) != 0) return nullptr;<br>
<br>
// Skips the flag name.<br>
const char* flag_end = str + flag_len;<br>
@@ -83,7 +80,7 @@ static const char* ParseGoogleMockFlagValue(const char* str,<br>
// If def_optional is true and there are more characters after the<br>
// flag name, or if def_optional is false, there must be a '=' after<br>
// the flag name.<br>
- if (flag_end[0] != '=') return NULL;<br>
+ if (flag_end[0] != '=') return nullptr;<br>
<br>
// Returns the string after "=".<br>
return flag_end + 1;<br>
@@ -100,7 +97,7 @@ static bool ParseGoogleMockBoolFlag(const char* str, const char* flag,<br>
const char* const value_str = ParseGoogleMockFlagValue(str, flag, true);<br>
<br>
// Aborts if the parsing failed.<br>
- if (value_str == NULL) return false;<br>
+ if (value_str == nullptr) return false;<br>
<br>
// Converts the string value to a bool.<br>
*value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');<br>
@@ -119,7 +116,7 @@ static bool ParseGoogleMockStringFlag(const char* str, const char* flag,<br>
const char* const value_str = ParseGoogleMockFlagValue(str, flag, false);<br>
<br>
// Aborts if the parsing failed.<br>
- if (value_str == NULL) return false;<br>
+ if (value_str == nullptr) return false;<br>
<br>
// Sets *value to the value of the flag.<br>
*value = value_str;<br>
@@ -132,7 +129,7 @@ static bool ParseGoogleMockIntFlag(const char* str, const char* flag,<br>
const char* const value_str = ParseGoogleMockFlagValue(str, flag, true);<br>
<br>
// Aborts if the parsing failed.<br>
- if (value_str == NULL) return false;<br>
+ if (value_str == nullptr) return false;<br>
<br>
// Sets *value to the value of the flag.<br>
return ParseInt32(Message() << "The value of flag --" << flag,<br>
@@ -201,4 +198,16 @@ GTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv) {<br>
internal::InitGoogleMockImpl(argc, argv);<br>
}<br>
<br>
+// This overloaded version can be used on Arduino/embedded platforms where<br>
+// there is no argc/argv.<br>
+GTEST_API_ void InitGoogleMock() {<br>
+ // Since Arduino doesn't have a command line, fake out the argc/argv arguments<br>
+ int argc = 1;<br>
+ const auto arg0 = "dummy";<br>
+ char* argv0 = const_cast<char*>(arg0);<br>
+ char** argv = &argv0;<br>
+<br>
+ internal::InitGoogleMockImpl(&argc, argv);<br>
+}<br>
+<br>
} // namespace testing<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/gtest-death-test.h b/llvm/utils/unittest/googletest/include/gtest/gtest-death-test.h<br>
index 20c54d869519f..dc878ffbb3ae5 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest-death-test.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-death-test.h<br>
@@ -161,7 +161,6 @@ GTEST_API_ bool InDeathTestChild();<br>
// is rarely a problem as people usually don't put the test binary<br>
// directory in PATH.<br>
//<br>
-// FIXME: make thread-safe death tests search the PATH.<br>
<br>
// Asserts that a given statement causes the program to exit, with an<br>
// integer exit status that satisfies predicate, and emitting error output<br>
@@ -170,7 +169,7 @@ GTEST_API_ bool InDeathTestChild();<br>
GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)<br>
<br>
// Like ASSERT_EXIT, but continues on to successive tests in the<br>
-// test case, if any:<br>
+// test suite, if any:<br>
# define EXPECT_EXIT(statement, predicate, regex) \<br>
GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)<br>
<br>
@@ -181,7 +180,7 @@ GTEST_API_ bool InDeathTestChild();<br>
ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)<br>
<br>
// Like ASSERT_DEATH, but continues on to successive tests in the<br>
-// test case, if any:<br>
+// test suite, if any:<br>
# define EXPECT_DEATH(statement, regex) \<br>
EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)<br>
<br>
@@ -228,7 +227,7 @@ class GTEST_API_ KilledBySignal {<br>
// return 12;<br>
// }<br>
//<br>
-// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {<br>
+// TEST(TestSuite, TestDieOr12WorksInDgbAndOpt) {<br>
// int sideeffect = 0;<br>
// // Only asserts in dbg.<br>
// EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");<br>
@@ -277,20 +276,20 @@ class GTEST_API_ KilledBySignal {<br>
// This macro is used for implementing macros such as<br>
// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where<br>
// death tests are not supported. Those macros must compile on such systems<br>
-// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on<br>
-// systems that support death tests. This allows one to write such a macro<br>
-// on a system that does not support death tests and be sure that it will<br>
-// compile on a death-test supporting system. It is exposed publicly so that<br>
-// systems that have death-tests with stricter requirements than<br>
-// GTEST_HAS_DEATH_TEST can write their own equivalent of<br>
-// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED.<br>
+// if and only if EXPECT_DEATH and ASSERT_DEATH compile with the same parameters<br>
+// on systems that support death tests. This allows one to write such a macro on<br>
+// a system that does not support death tests and be sure that it will compile<br>
+// on a death-test supporting system. It is exposed publicly so that systems<br>
+// that have death-tests with stricter requirements than GTEST_HAS_DEATH_TEST<br>
+// can write their own equivalent of EXPECT_DEATH_IF_SUPPORTED and<br>
+// ASSERT_DEATH_IF_SUPPORTED.<br>
//<br>
// Parameters:<br>
// statement - A statement that a macro such as EXPECT_DEATH would test<br>
// for program termination. This macro has to make sure this<br>
// statement is compiled but not executed, to ensure that<br>
// EXPECT_DEATH_IF_SUPPORTED compiles with a certain<br>
-// parameter iff EXPECT_DEATH compiles with it.<br>
+// parameter if and only if EXPECT_DEATH compiles with it.<br>
// regex - A regex that a macro such as EXPECT_DEATH would use to test<br>
// the output of statement. This parameter has to be<br>
// compiled but not evaluated by this macro, to ensure that<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/gtest-matchers.h b/llvm/utils/unittest/googletest/include/gtest/gtest-matchers.h<br>
new file mode 100644<br>
index 0000000000000..9de6c2e10a20d<br>
--- /dev/null<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-matchers.h<br>
@@ -0,0 +1,750 @@<br>
+// Copyright 2007, Google Inc.<br>
+// All rights reserved.<br>
+//<br>
+// Redistribution and use in source and binary forms, with or without<br>
+// modification, are permitted provided that the following conditions are<br>
+// met:<br>
+//<br>
+// * Redistributions of source code must retain the above copyright<br>
+// notice, this list of conditions and the following disclaimer.<br>
+// * Redistributions in binary form must reproduce the above<br>
+// copyright notice, this list of conditions and the following disclaimer<br>
+// in the documentation and/or other materials provided with the<br>
+// distribution.<br>
+// * Neither the name of Google Inc. nor the names of its<br>
+// contributors may be used to endorse or promote products derived from<br>
+// this software without specific prior written permission.<br>
+//<br>
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
+<br>
+// The Google C++ Testing and Mocking Framework (Google Test)<br>
+//<br>
+// This file implements just enough of the matcher interface to allow<br>
+// EXPECT_DEATH and friends to accept a matcher argument.<br>
+<br>
+// IWYU pragma: private, include "testing/base/public/gunit.h"<br>
+// IWYU pragma: friend third_party/googletest/googlemock/.*<br>
+// IWYU pragma: friend third_party/googletest/googletest/.*<br>
+<br>
+#ifndef GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_<br>
+#define GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_<br>
+<br>
+#include <memory><br>
+#include <ostream><br>
+#include <string><br>
+#include <type_traits><br>
+<br>
+#include "gtest/gtest-printers.h"<br>
+#include "gtest/internal/gtest-internal.h"<br>
+#include "gtest/internal/gtest-port.h"<br>
+<br>
+// MSVC warning C5046 is new as of VS2017 version 15.8.<br>
+#if defined(_MSC_VER) && _MSC_VER >= 1915<br>
+#define GTEST_MAYBE_5046_ 5046<br>
+#else<br>
+#define GTEST_MAYBE_5046_<br>
+#endif<br>
+<br>
+GTEST_DISABLE_MSC_WARNINGS_PUSH_(<br>
+ 4251 GTEST_MAYBE_5046_ /* class A needs to have dll-interface to be used by<br>
+ clients of class B */<br>
+ /* Symbol involving type with internal linkage not defined */)<br>
+<br>
+namespace testing {<br>
+<br>
+// To implement a matcher Foo for type T, define:<br>
+// 1. a class FooMatcherImpl that implements the<br>
+// MatcherInterface<T> interface, and<br>
+// 2. a factory function that creates a Matcher<T> object from a<br>
+// FooMatcherImpl*.<br>
+//<br>
+// The two-level delegation design makes it possible to allow a user<br>
+// to write "v" instead of "Eq(v)" where a Matcher is expected, which<br>
+// is impossible if we pass matchers by pointers. It also eases<br>
+// ownership management as Matcher objects can now be copied like<br>
+// plain values.<br>
+<br>
+// MatchResultListener is an abstract class. Its << operator can be<br>
+// used by a matcher to explain why a value matches or doesn't match.<br>
+//<br>
+class MatchResultListener {<br>
+ public:<br>
+ // Creates a listener object with the given underlying ostream. The<br>
+ // listener does not own the ostream, and does not dereference it<br>
+ // in the constructor or destructor.<br>
+ explicit MatchResultListener(::std::ostream* os) : stream_(os) {}<br>
+ virtual ~MatchResultListener() = 0; // Makes this class abstract.<br>
+<br>
+ // Streams x to the underlying ostream; does nothing if the ostream<br>
+ // is NULL.<br>
+ template <typename T><br>
+ MatchResultListener& operator<<(const T& x) {<br>
+ if (stream_ != nullptr) *stream_ << x;<br>
+ return *this;<br>
+ }<br>
+<br>
+ // Returns the underlying ostream.<br>
+ ::std::ostream* stream() { return stream_; }<br>
+<br>
+ // Returns true if and only if the listener is interested in an explanation<br>
+ // of the match result. A matcher's MatchAndExplain() method can use<br>
+ // this information to avoid generating the explanation when no one<br>
+ // intends to hear it.<br>
+ bool IsInterested() const { return stream_ != nullptr; }<br>
+<br>
+ private:<br>
+ ::std::ostream* const stream_;<br>
+<br>
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener);<br>
+};<br>
+<br>
+inline MatchResultListener::~MatchResultListener() {<br>
+}<br>
+<br>
+// An instance of a subclass of this knows how to describe itself as a<br>
+// matcher.<br>
+class MatcherDescriberInterface {<br>
+ public:<br>
+ virtual ~MatcherDescriberInterface() {}<br>
+<br>
+ // Describes this matcher to an ostream. The function should print<br>
+ // a verb phrase that describes the property a value matching this<br>
+ // matcher should have. The subject of the verb phrase is the value<br>
+ // being matched. For example, the DescribeTo() method of the Gt(7)<br>
+ // matcher prints "is greater than 7".<br>
+ virtual void DescribeTo(::std::ostream* os) const = 0;<br>
+<br>
+ // Describes the negation of this matcher to an ostream. For<br>
+ // example, if the description of this matcher is "is greater than<br>
+ // 7", the negated description could be "is not greater than 7".<br>
+ // You are not required to override this when implementing<br>
+ // MatcherInterface, but it is highly advised so that your matcher<br>
+ // can produce good error messages.<br>
+ virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ *os << "not (";<br>
+ DescribeTo(os);<br>
+ *os << ")";<br>
+ }<br>
+};<br>
+<br>
+// The implementation of a matcher.<br>
+template <typename T><br>
+class MatcherInterface : public MatcherDescriberInterface {<br>
+ public:<br>
+ // Returns true if and only if the matcher matches x; also explains the<br>
+ // match result to 'listener' if necessary (see the next paragraph), in<br>
+ // the form of a non-restrictive relative clause ("which ...",<br>
+ // "whose ...", etc) that describes x. For example, the<br>
+ // MatchAndExplain() method of the Pointee(...) matcher should<br>
+ // generate an explanation like "which points to ...".<br>
+ //<br>
+ // Implementations of MatchAndExplain() should add an explanation of<br>
+ // the match result *if and only if* they can provide additional<br>
+ // information that's not already present (or not obvious) in the<br>
+ // print-out of x and the matcher's description. Whether the match<br>
+ // succeeds is not a factor in deciding whether an explanation is<br>
+ // needed, as sometimes the caller needs to print a failure message<br>
+ // when the match succeeds (e.g. when the matcher is used inside<br>
+ // Not()).<br>
+ //<br>
+ // For example, a "has at least 10 elements" matcher should explain<br>
+ // what the actual element count is, regardless of the match result,<br>
+ // as it is useful information to the reader; on the other hand, an<br>
+ // "is empty" matcher probably only needs to explain what the actual<br>
+ // size is when the match fails, as it's redundant to say that the<br>
+ // size is 0 when the value is already known to be empty.<br>
+ //<br>
+ // You should override this method when defining a new matcher.<br>
+ //<br>
+ // It's the responsibility of the caller (Google Test) to guarantee<br>
+ // that 'listener' is not NULL. This helps to simplify a matcher's<br>
+ // implementation when it doesn't care about the performance, as it<br>
+ // can talk to 'listener' without checking its validity first.<br>
+ // However, in order to implement dummy listeners efficiently,<br>
+ // listener->stream() may be NULL.<br>
+ virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0;<br>
+<br>
+ // Inherits these methods from MatcherDescriberInterface:<br>
+ // virtual void DescribeTo(::std::ostream* os) const = 0;<br>
+ // virtual void DescribeNegationTo(::std::ostream* os) const;<br>
+};<br>
+<br>
+namespace internal {<br>
+<br>
+// Converts a MatcherInterface<T> to a MatcherInterface<const T&>.<br>
+template <typename T><br>
+class MatcherInterfaceAdapter : public MatcherInterface<const T&> {<br>
+ public:<br>
+ explicit MatcherInterfaceAdapter(const MatcherInterface<T>* impl)<br>
+ : impl_(impl) {}<br>
+ ~MatcherInterfaceAdapter() override { delete impl_; }<br>
+<br>
+ void DescribeTo(::std::ostream* os) const override { impl_->DescribeTo(os); }<br>
+<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
+ impl_->DescribeNegationTo(os);<br>
+ }<br>
+<br>
+ bool MatchAndExplain(const T& x,<br>
+ MatchResultListener* listener) const override {<br>
+ return impl_->MatchAndExplain(x, listener);<br>
+ }<br>
+<br>
+ private:<br>
+ const MatcherInterface<T>* const impl_;<br>
+<br>
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(MatcherInterfaceAdapter);<br>
+};<br>
+<br>
+struct AnyEq {<br>
+ template <typename A, typename B><br>
+ bool operator()(const A& a, const B& b) const { return a == b; }<br>
+};<br>
+struct AnyNe {<br>
+ template <typename A, typename B><br>
+ bool operator()(const A& a, const B& b) const { return a != b; }<br>
+};<br>
+struct AnyLt {<br>
+ template <typename A, typename B><br>
+ bool operator()(const A& a, const B& b) const { return a < b; }<br>
+};<br>
+struct AnyGt {<br>
+ template <typename A, typename B><br>
+ bool operator()(const A& a, const B& b) const { return a > b; }<br>
+};<br>
+struct AnyLe {<br>
+ template <typename A, typename B><br>
+ bool operator()(const A& a, const B& b) const { return a <= b; }<br>
+};<br>
+struct AnyGe {<br>
+ template <typename A, typename B><br>
+ bool operator()(const A& a, const B& b) const { return a >= b; }<br>
+};<br>
+<br>
+// A match result listener that ignores the explanation.<br>
+class DummyMatchResultListener : public MatchResultListener {<br>
+ public:<br>
+ DummyMatchResultListener() : MatchResultListener(nullptr) {}<br>
+<br>
+ private:<br>
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener);<br>
+};<br>
+<br>
+// A match result listener that forwards the explanation to a given<br>
+// ostream. The <br>
diff erence between this and MatchResultListener is<br>
+// that the former is concrete.<br>
+class StreamMatchResultListener : public MatchResultListener {<br>
+ public:<br>
+ explicit StreamMatchResultListener(::std::ostream* os)<br>
+ : MatchResultListener(os) {}<br>
+<br>
+ private:<br>
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener);<br>
+};<br>
+<br>
+// An internal class for implementing Matcher<T>, which will derive<br>
+// from it. We put functionalities common to all Matcher<T><br>
+// specializations here to avoid code duplication.<br>
+template <typename T><br>
+class MatcherBase {<br>
+ public:<br>
+ // Returns true if and only if the matcher matches x; also explains the<br>
+ // match result to 'listener'.<br>
+ bool MatchAndExplain(const T& x, MatchResultListener* listener) const {<br>
+ return impl_->MatchAndExplain(x, listener);<br>
+ }<br>
+<br>
+ // Returns true if and only if this matcher matches x.<br>
+ bool Matches(const T& x) const {<br>
+ DummyMatchResultListener dummy;<br>
+ return MatchAndExplain(x, &dummy);<br>
+ }<br>
+<br>
+ // Describes this matcher to an ostream.<br>
+ void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); }<br>
+<br>
+ // Describes the negation of this matcher to an ostream.<br>
+ void DescribeNegationTo(::std::ostream* os) const {<br>
+ impl_->DescribeNegationTo(os);<br>
+ }<br>
+<br>
+ // Explains why x matches, or doesn't match, the matcher.<br>
+ void ExplainMatchResultTo(const T& x, ::std::ostream* os) const {<br>
+ StreamMatchResultListener listener(os);<br>
+ MatchAndExplain(x, &listener);<br>
+ }<br>
+<br>
+ // Returns the describer for this matcher object; retains ownership<br>
+ // of the describer, which is only guaranteed to be alive when<br>
+ // this matcher object is alive.<br>
+ const MatcherDescriberInterface* GetDescriber() const {<br>
+ return impl_.get();<br>
+ }<br>
+<br>
+ protected:<br>
+ MatcherBase() {}<br>
+<br>
+ // Constructs a matcher from its implementation.<br>
+ explicit MatcherBase(const MatcherInterface<const T&>* impl) : impl_(impl) {}<br>
+<br>
+ template <typename U><br>
+ explicit MatcherBase(<br>
+ const MatcherInterface<U>* impl,<br>
+ typename std::enable_if<!std::is_same<U, const U&>::value>::type* =<br>
+ nullptr)<br>
+ : impl_(new internal::MatcherInterfaceAdapter<U>(impl)) {}<br>
+<br>
+ MatcherBase(const MatcherBase&) = default;<br>
+ MatcherBase& operator=(const MatcherBase&) = default;<br>
+ MatcherBase(MatcherBase&&) = default;<br>
+ MatcherBase& operator=(MatcherBase&&) = default;<br>
+<br>
+ virtual ~MatcherBase() {}<br>
+<br>
+ private:<br>
+ std::shared_ptr<const MatcherInterface<const T&>> impl_;<br>
+};<br>
+<br>
+} // namespace internal<br>
+<br>
+// A Matcher<T> is a copyable and IMMUTABLE (except by assignment)<br>
+// object that can check whether a value of type T matches. The<br>
+// implementation of Matcher<T> is just a std::shared_ptr to const<br>
+// MatcherInterface<T>. Don't inherit from Matcher!<br>
+template <typename T><br>
+class Matcher : public internal::MatcherBase<T> {<br>
+ public:<br>
+ // Constructs a null matcher. Needed for storing Matcher objects in STL<br>
+ // containers. A default-constructed matcher is not yet initialized. You<br>
+ // cannot use it until a valid value has been assigned to it.<br>
+ explicit Matcher() {} // NOLINT<br>
+<br>
+ // Constructs a matcher from its implementation.<br>
+ explicit Matcher(const MatcherInterface<const T&>* impl)<br>
+ : internal::MatcherBase<T>(impl) {}<br>
+<br>
+ template <typename U><br>
+ explicit Matcher(<br>
+ const MatcherInterface<U>* impl,<br>
+ typename std::enable_if<!std::is_same<U, const U&>::value>::type* =<br>
+ nullptr)<br>
+ : internal::MatcherBase<T>(impl) {}<br>
+<br>
+ // Implicit constructor here allows people to write<br>
+ // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes<br>
+ Matcher(T value); // NOLINT<br>
+};<br>
+<br>
+// The following two specializations allow the user to write str<br>
+// instead of Eq(str) and "foo" instead of Eq("foo") when a std::string<br>
+// matcher is expected.<br>
+template <><br>
+class GTEST_API_ Matcher<const std::string&><br>
+ : public internal::MatcherBase<const std::string&> {<br>
+ public:<br>
+ Matcher() {}<br>
+<br>
+ explicit Matcher(const MatcherInterface<const std::string&>* impl)<br>
+ : internal::MatcherBase<const std::string&>(impl) {}<br>
+<br>
+ // Allows the user to write str instead of Eq(str) sometimes, where<br>
+ // str is a std::string object.<br>
+ Matcher(const std::string& s); // NOLINT<br>
+<br>
+ // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
+ Matcher(const char* s); // NOLINT<br>
+};<br>
+<br>
+template <><br>
+class GTEST_API_ Matcher<std::string><br>
+ : public internal::MatcherBase<std::string> {<br>
+ public:<br>
+ Matcher() {}<br>
+<br>
+ explicit Matcher(const MatcherInterface<const std::string&>* impl)<br>
+ : internal::MatcherBase<std::string>(impl) {}<br>
+ explicit Matcher(const MatcherInterface<std::string>* impl)<br>
+ : internal::MatcherBase<std::string>(impl) {}<br>
+<br>
+ // Allows the user to write str instead of Eq(str) sometimes, where<br>
+ // str is a string object.<br>
+ Matcher(const std::string& s); // NOLINT<br>
+<br>
+ // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
+ Matcher(const char* s); // NOLINT<br>
+};<br>
+<br>
+#if GTEST_HAS_ABSL<br>
+// The following two specializations allow the user to write str<br>
+// instead of Eq(str) and "foo" instead of Eq("foo") when a absl::string_view<br>
+// matcher is expected.<br>
+template <><br>
+class GTEST_API_ Matcher<const absl::string_view&><br>
+ : public internal::MatcherBase<const absl::string_view&> {<br>
+ public:<br>
+ Matcher() {}<br>
+<br>
+ explicit Matcher(const MatcherInterface<const absl::string_view&>* impl)<br>
+ : internal::MatcherBase<const absl::string_view&>(impl) {}<br>
+<br>
+ // Allows the user to write str instead of Eq(str) sometimes, where<br>
+ // str is a std::string object.<br>
+ Matcher(const std::string& s); // NOLINT<br>
+<br>
+ // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
+ Matcher(const char* s); // NOLINT<br>
+<br>
+ // Allows the user to pass absl::string_views directly.<br>
+ Matcher(absl::string_view s); // NOLINT<br>
+};<br>
+<br>
+template <><br>
+class GTEST_API_ Matcher<absl::string_view><br>
+ : public internal::MatcherBase<absl::string_view> {<br>
+ public:<br>
+ Matcher() {}<br>
+<br>
+ explicit Matcher(const MatcherInterface<const absl::string_view&>* impl)<br>
+ : internal::MatcherBase<absl::string_view>(impl) {}<br>
+ explicit Matcher(const MatcherInterface<absl::string_view>* impl)<br>
+ : internal::MatcherBase<absl::string_view>(impl) {}<br>
+<br>
+ // Allows the user to write str instead of Eq(str) sometimes, where<br>
+ // str is a std::string object.<br>
+ Matcher(const std::string& s); // NOLINT<br>
+<br>
+ // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
+ Matcher(const char* s); // NOLINT<br>
+<br>
+ // Allows the user to pass absl::string_views directly.<br>
+ Matcher(absl::string_view s); // NOLINT<br>
+};<br>
+#endif // GTEST_HAS_ABSL<br>
+<br>
+// Prints a matcher in a human-readable format.<br>
+template <typename T><br>
+std::ostream& operator<<(std::ostream& os, const Matcher<T>& matcher) {<br>
+ matcher.DescribeTo(&os);<br>
+ return os;<br>
+}<br>
+<br>
+// The PolymorphicMatcher class template makes it easy to implement a<br>
+// polymorphic matcher (i.e. a matcher that can match values of more<br>
+// than one type, e.g. Eq(n) and NotNull()).<br>
+//<br>
+// To define a polymorphic matcher, a user should provide an Impl<br>
+// class that has a DescribeTo() method and a DescribeNegationTo()<br>
+// method, and define a member function (or member function template)<br>
+//<br>
+// bool MatchAndExplain(const Value& value,<br>
+// MatchResultListener* listener) const;<br>
+//<br>
+// See the definition of NotNull() for a complete example.<br>
+template <class Impl><br>
+class PolymorphicMatcher {<br>
+ public:<br>
+ explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {}<br>
+<br>
+ // Returns a mutable reference to the underlying matcher<br>
+ // implementation object.<br>
+ Impl& mutable_impl() { return impl_; }<br>
+<br>
+ // Returns an immutable reference to the underlying matcher<br>
+ // implementation object.<br>
+ const Impl& impl() const { return impl_; }<br>
+<br>
+ template <typename T><br>
+ operator Matcher<T>() const {<br>
+ return Matcher<T>(new MonomorphicImpl<const T&>(impl_));<br>
+ }<br>
+<br>
+ private:<br>
+ template <typename T><br>
+ class MonomorphicImpl : public MatcherInterface<T> {<br>
+ public:<br>
+ explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}<br>
+<br>
+ virtual void DescribeTo(::std::ostream* os) const { impl_.DescribeTo(os); }<br>
+<br>
+ virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+ impl_.DescribeNegationTo(os);<br>
+ }<br>
+<br>
+ virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {<br>
+ return impl_.MatchAndExplain(x, listener);<br>
+ }<br>
+<br>
+ private:<br>
+ const Impl impl_;<br>
+ };<br>
+<br>
+ Impl impl_;<br>
+};<br>
+<br>
+// Creates a matcher from its implementation.<br>
+// DEPRECATED: Especially in the generic code, prefer:<br>
+// Matcher<T>(new MyMatcherImpl<const T&>(...));<br>
+//<br>
+// MakeMatcher may create a Matcher that accepts its argument by value, which<br>
+// leads to unnecessary copies & lack of support for non-copyable types.<br>
+template <typename T><br>
+inline Matcher<T> MakeMatcher(const MatcherInterface<T>* impl) {<br>
+ return Matcher<T>(impl);<br>
+}<br>
+<br>
+// Creates a polymorphic matcher from its implementation. This is<br>
+// easier to use than the PolymorphicMatcher<Impl> constructor as it<br>
+// doesn't require you to explicitly write the template argument, e.g.<br>
+//<br>
+// MakePolymorphicMatcher(foo);<br>
+// vs<br>
+// PolymorphicMatcher<TypeOfFoo>(foo);<br>
+template <class Impl><br>
+inline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) {<br>
+ return PolymorphicMatcher<Impl>(impl);<br>
+}<br>
+<br>
+namespace internal {<br>
+// Implements a matcher that compares a given value with a<br>
+// pre-supplied value using one of the ==, <=, <, etc, operators. The<br>
+// two values being compared don't have to have the same type.<br>
+//<br>
+// The matcher defined here is polymorphic (for example, Eq(5) can be<br>
+// used to match an int, a short, a double, etc). Therefore we use<br>
+// a template type conversion operator in the implementation.<br>
+//<br>
+// The following template definition assumes that the Rhs parameter is<br>
+// a "bare" type (i.e. neither 'const T' nor 'T&').<br>
+template <typename D, typename Rhs, typename Op><br>
+class ComparisonBase {<br>
+ public:<br>
+ explicit ComparisonBase(const Rhs& rhs) : rhs_(rhs) {}<br>
+ template <typename Lhs><br>
+ operator Matcher<Lhs>() const {<br>
+ return Matcher<Lhs>(new Impl<const Lhs&>(rhs_));<br>
+ }<br>
+<br>
+ private:<br>
+ template <typename T><br>
+ static const T& Unwrap(const T& v) { return v; }<br>
+ template <typename T><br>
+ static const T& Unwrap(std::reference_wrapper<T> v) { return v; }<br>
+<br>
+ template <typename Lhs, typename = Rhs><br>
+ class Impl : public MatcherInterface<Lhs> {<br>
+ public:<br>
+ explicit Impl(const Rhs& rhs) : rhs_(rhs) {}<br>
+ bool MatchAndExplain(Lhs lhs,<br>
+ MatchResultListener* /* listener */) const override {<br>
+ return Op()(lhs, Unwrap(rhs_));<br>
+ }<br>
+ void DescribeTo(::std::ostream* os) const override {<br>
+ *os << D::Desc() << " ";<br>
+ UniversalPrint(Unwrap(rhs_), os);<br>
+ }<br>
+ void DescribeNegationTo(::std::ostream* os) const override {<br>
+ *os << D::NegatedDesc() << " ";<br>
+ UniversalPrint(Unwrap(rhs_), os);<br>
+ }<br>
+<br>
+ private:<br>
+ Rhs rhs_;<br>
+ };<br>
+ Rhs rhs_;<br>
+};<br>
+<br>
+template <typename Rhs><br>
+class EqMatcher : public ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq> {<br>
+ public:<br>
+ explicit EqMatcher(const Rhs& rhs)<br>
+ : ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq>(rhs) { }<br>
+ static const char* Desc() { return "is equal to"; }<br>
+ static const char* NegatedDesc() { return "isn't equal to"; }<br>
+};<br>
+template <typename Rhs><br>
+class NeMatcher : public ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe> {<br>
+ public:<br>
+ explicit NeMatcher(const Rhs& rhs)<br>
+ : ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe>(rhs) { }<br>
+ static const char* Desc() { return "isn't equal to"; }<br>
+ static const char* NegatedDesc() { return "is equal to"; }<br>
+};<br>
+template <typename Rhs><br>
+class LtMatcher : public ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt> {<br>
+ public:<br>
+ explicit LtMatcher(const Rhs& rhs)<br>
+ : ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt>(rhs) { }<br>
+ static const char* Desc() { return "is <"; }<br>
+ static const char* NegatedDesc() { return "isn't <"; }<br>
+};<br>
+template <typename Rhs><br>
+class GtMatcher : public ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt> {<br>
+ public:<br>
+ explicit GtMatcher(const Rhs& rhs)<br>
+ : ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt>(rhs) { }<br>
+ static const char* Desc() { return "is >"; }<br>
+ static const char* NegatedDesc() { return "isn't >"; }<br>
+};<br>
+template <typename Rhs><br>
+class LeMatcher : public ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe> {<br>
+ public:<br>
+ explicit LeMatcher(const Rhs& rhs)<br>
+ : ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe>(rhs) { }<br>
+ static const char* Desc() { return "is <="; }<br>
+ static const char* NegatedDesc() { return "isn't <="; }<br>
+};<br>
+template <typename Rhs><br>
+class GeMatcher : public ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe> {<br>
+ public:<br>
+ explicit GeMatcher(const Rhs& rhs)<br>
+ : ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe>(rhs) { }<br>
+ static const char* Desc() { return "is >="; }<br>
+ static const char* NegatedDesc() { return "isn't >="; }<br>
+};<br>
+<br>
+// Implements polymorphic matchers MatchesRegex(regex) and<br>
+// ContainsRegex(regex), which can be used as a Matcher<T> as long as<br>
+// T can be converted to a string.<br>
+class MatchesRegexMatcher {<br>
+ public:<br>
+ MatchesRegexMatcher(const RE* regex, bool full_match)<br>
+ : regex_(regex), full_match_(full_match) {}<br>
+<br>
+#if GTEST_HAS_ABSL<br>
+ bool MatchAndExplain(const absl::string_view& s,<br>
+ MatchResultListener* listener) const {<br>
+ return MatchAndExplain(std::string(s), listener);<br>
+ }<br>
+#endif // GTEST_HAS_ABSL<br>
+<br>
+ // Accepts pointer types, particularly:<br>
+ // const char*<br>
+ // char*<br>
+ // const wchar_t*<br>
+ // wchar_t*<br>
+ template <typename CharType><br>
+ bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {<br>
+ return s != nullptr && MatchAndExplain(std::string(s), listener);<br>
+ }<br>
+<br>
+ // Matches anything that can convert to std::string.<br>
+ //<br>
+ // This is a template, not just a plain function with const std::string&,<br>
+ // because absl::string_view has some interfering non-explicit constructors.<br>
+ template <class MatcheeStringType><br>
+ bool MatchAndExplain(const MatcheeStringType& s,<br>
+ MatchResultListener* /* listener */) const {<br>
+ const std::string& s2(s);<br>
+ return full_match_ ? RE::FullMatch(s2, *regex_)<br>
+ : RE::PartialMatch(s2, *regex_);<br>
+ }<br>
+<br>
+ void DescribeTo(::std::ostream* os) const {<br>
+ *os << (full_match_ ? "matches" : "contains") << " regular expression ";<br>
+ UniversalPrinter<std::string>::Print(regex_->pattern(), os);<br>
+ }<br>
+<br>
+ void DescribeNegationTo(::std::ostream* os) const {<br>
+ *os << "doesn't " << (full_match_ ? "match" : "contain")<br>
+ << " regular expression ";<br>
+ UniversalPrinter<std::string>::Print(regex_->pattern(), os);<br>
+ }<br>
+<br>
+ private:<br>
+ const std::shared_ptr<const RE> regex_;<br>
+ const bool full_match_;<br>
+};<br>
+} // namespace internal<br>
+<br>
+// Matches a string that fully matches regular expression 'regex'.<br>
+// The matcher takes ownership of 'regex'.<br>
+inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(<br>
+ const internal::RE* regex) {<br>
+ return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true));<br>
+}<br>
+inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(<br>
+ const std::string& regex) {<br>
+ return MatchesRegex(new internal::RE(regex));<br>
+}<br>
+<br>
+// Matches a string that contains regular expression 'regex'.<br>
+// The matcher takes ownership of 'regex'.<br>
+inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(<br>
+ const internal::RE* regex) {<br>
+ return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false));<br>
+}<br>
+inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(<br>
+ const std::string& regex) {<br>
+ return ContainsRegex(new internal::RE(regex));<br>
+}<br>
+<br>
+// Creates a polymorphic matcher that matches anything equal to x.<br>
+// Note: if the parameter of Eq() were declared as const T&, Eq("foo")<br>
+// wouldn't compile.<br>
+template <typename T><br>
+inline internal::EqMatcher<T> Eq(T x) { return internal::EqMatcher<T>(x); }<br>
+<br>
+// Constructs a Matcher<T> from a 'value' of type T. The constructed<br>
+// matcher matches any value that's equal to 'value'.<br>
+template <typename T><br>
+Matcher<T>::Matcher(T value) { *this = Eq(value); }<br>
+<br>
+// Creates a monomorphic matcher that matches anything with type Lhs<br>
+// and equal to rhs. A user may need to use this instead of Eq(...)<br>
+// in order to resolve an overloading ambiguity.<br>
+//<br>
+// TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x))<br>
+// or Matcher<T>(x), but more readable than the latter.<br>
+//<br>
+// We could define similar monomorphic matchers for other comparison<br>
+// operations (e.g. TypedLt, TypedGe, and etc), but decided not to do<br>
+// it yet as those are used much less than Eq() in practice. A user<br>
+// can always write Matcher<T>(Lt(5)) to be explicit about the type,<br>
+// for example.<br>
+template <typename Lhs, typename Rhs><br>
+inline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); }<br>
+<br>
+// Creates a polymorphic matcher that matches anything >= x.<br>
+template <typename Rhs><br>
+inline internal::GeMatcher<Rhs> Ge(Rhs x) {<br>
+ return internal::GeMatcher<Rhs>(x);<br>
+}<br>
+<br>
+// Creates a polymorphic matcher that matches anything > x.<br>
+template <typename Rhs><br>
+inline internal::GtMatcher<Rhs> Gt(Rhs x) {<br>
+ return internal::GtMatcher<Rhs>(x);<br>
+}<br>
+<br>
+// Creates a polymorphic matcher that matches anything <= x.<br>
+template <typename Rhs><br>
+inline internal::LeMatcher<Rhs> Le(Rhs x) {<br>
+ return internal::LeMatcher<Rhs>(x);<br>
+}<br>
+<br>
+// Creates a polymorphic matcher that matches anything < x.<br>
+template <typename Rhs><br>
+inline internal::LtMatcher<Rhs> Lt(Rhs x) {<br>
+ return internal::LtMatcher<Rhs>(x);<br>
+}<br>
+<br>
+// Creates a polymorphic matcher that matches anything != x.<br>
+template <typename Rhs><br>
+inline internal::NeMatcher<Rhs> Ne(Rhs x) {<br>
+ return internal::NeMatcher<Rhs>(x);<br>
+}<br>
+} // namespace testing<br>
+<br>
+GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 5046<br>
+<br>
+#endif // GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/gtest-message.h b/llvm/utils/unittest/googletest/include/gtest/gtest-message.h<br>
index 892e086466ad5..cbabe5defd77d 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest-message.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-message.h<br>
@@ -48,6 +48,7 @@<br>
#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_<br>
<br>
#include <limits><br>
+#include <memory><br>
<br>
#include "gtest/internal/gtest-port.h"<br>
#include "gtest/internal/custom/raw-ostream.h"<br>
@@ -107,14 +108,6 @@ class GTEST_API_ Message {<br>
*ss_ << str;<br>
}<br>
<br>
-#if GTEST_OS_SYMBIAN<br>
- // Streams a value (either a pointer or not) to this object.<br>
- template <typename T><br>
- inline Message& operator <<(const T& value) {<br>
- StreamHelper(typename internal::is_pointer<T>::type(), value);<br>
- return *this;<br>
- }<br>
-#else<br>
// Streams a non-pointer value to this object.<br>
template <typename T><br>
inline Message& operator <<(const T& val) {<br>
@@ -152,14 +145,13 @@ class GTEST_API_ Message {<br>
// as "(null)".<br>
template <typename T><br>
inline Message& operator <<(T* const& pointer) { // NOLINT<br>
- if (pointer == NULL) {<br>
+ if (pointer == nullptr) {<br>
*ss_ << "(null)";<br>
} else {<br>
*ss_ << llvm_gtest::printable(pointer);<br>
}<br>
return *this;<br>
}<br>
-#endif // GTEST_OS_SYMBIAN<br>
<br>
// Since the basic IO manipulators are overloaded for both narrow<br>
// and wide streams, we have to provide this specialized definition<br>
@@ -188,12 +180,6 @@ class GTEST_API_ Message {<br>
Message& operator <<(const ::std::wstring& wstr);<br>
#endif // GTEST_HAS_STD_WSTRING<br>
<br>
-#if GTEST_HAS_GLOBAL_WSTRING<br>
- // Converts the given wide string to a narrow string using the UTF-8<br>
- // encoding, and streams the result to this Message object.<br>
- Message& operator <<(const ::wstring& wstr);<br>
-#endif // GTEST_HAS_GLOBAL_WSTRING<br>
-<br>
// Gets the text streamed to this object so far as an std::string.<br>
// Each '\0' character in the buffer is replaced with "\\0".<br>
//<br>
@@ -201,31 +187,8 @@ class GTEST_API_ Message {<br>
std::string GetString() const;<br>
<br>
private:<br>
-#if GTEST_OS_SYMBIAN<br>
- // These are needed as the Nokia Symbian Compiler cannot decide between<br>
- // const T& and const T* in a function template. The Nokia compiler _can_<br>
- // decide between class template specializations for T and T*, so a<br>
- // tr1::type_traits-like is_pointer works, and we can overload on that.<br>
- template <typename T><br>
- inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {<br>
- if (pointer == NULL) {<br>
- *ss_ << "(null)";<br>
- } else {<br>
- *ss_ << pointer;<br>
- }<br>
- }<br>
- template <typename T><br>
- inline void StreamHelper(internal::false_type /*is_pointer*/,<br>
- const T& value) {<br>
- // See the comments in Message& operator <<(const T&) above for why<br>
- // we need this using statement.<br>
- using ::operator <<;<br>
- *ss_ << value;<br>
- }<br>
-#endif // GTEST_OS_SYMBIAN<br>
-<br>
// We'll hold the text streamed to this object here.<br>
- const internal::scoped_ptr< ::std::stringstream> ss_;<br>
+ const std::unique_ptr< ::std::stringstream> ss_;<br>
<br>
// We declare (but don't implement) this to prevent the compiler<br>
// from implementing the assignment operator.<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/gtest-param-test.h b/llvm/utils/unittest/googletest/include/gtest/gtest-param-test.h<br>
index 3e95e4390e00e..c2e6eae3d8326 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest-param-test.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-param-test.h<br>
@@ -1,7 +1,3 @@<br>
-// This file was GENERATED by command:<br>
-// pump.py gtest-param-test.h.pump<br>
-// DO NOT EDIT BY HAND!!!<br>
-<br>
// Copyright 2008, Google Inc.<br>
// All rights reserved.<br>
//<br>
@@ -75,7 +71,7 @@ TEST_P(FooTest, HasBlahBlah) {<br>
...<br>
}<br>
<br>
-// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test<br>
+// Finally, you can use INSTANTIATE_TEST_SUITE_P to instantiate the test<br>
// case with any set of parameters you want. Google Test defines a number<br>
// of functions for generating test parameters. They return what we call<br>
// (surprise!) parameter generators. Here is a summary of them, which<br>
@@ -96,17 +92,17 @@ TEST_P(FooTest, HasBlahBlah) {<br>
// For more details, see comments at the definitions of these functions below<br>
// in this file.<br>
//<br>
-// The following statement will instantiate tests from the FooTest test case<br>
+// The following statement will instantiate tests from the FooTest test suite<br>
// each with parameter values "meeny", "miny", and "moe".<br>
<br>
-INSTANTIATE_TEST_CASE_P(InstantiationName,<br>
- FooTest,<br>
- Values("meeny", "miny", "moe"));<br>
+INSTANTIATE_TEST_SUITE_P(InstantiationName,<br>
+ FooTest,<br>
+ Values("meeny", "miny", "moe"));<br>
<br>
// To distinguish <br>
diff erent instances of the pattern, (yes, you<br>
-// can instantiate it more then once) the first argument to the<br>
-// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the<br>
-// actual test case name. Remember to pick unique prefixes for <br>
diff erent<br>
+// can instantiate it more than once) the first argument to the<br>
+// INSTANTIATE_TEST_SUITE_P macro is a prefix that will be added to the<br>
+// actual test suite name. Remember to pick unique prefixes for <br>
diff erent<br>
// instantiations. The tests from the instantiation above will have<br>
// these names:<br>
//<br>
@@ -123,7 +119,7 @@ INSTANTIATE_TEST_CASE_P(InstantiationName,<br>
// with parameter values "cat" and "dog":<br>
<br>
const char* pets[] = {"cat", "dog"};<br>
-INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));<br>
+INSTANTIATE_TEST_SUITE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));<br>
<br>
// The tests from the instantiation above will have these names:<br>
//<br>
@@ -132,9 +128,9 @@ INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));<br>
// * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"<br>
// * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"<br>
//<br>
-// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests<br>
-// in the given test case, whether their definitions come before or<br>
-// AFTER the INSTANTIATE_TEST_CASE_P statement.<br>
+// Please note that INSTANTIATE_TEST_SUITE_P will instantiate all tests<br>
+// in the given test suite, whether their definitions come before or<br>
+// AFTER the INSTANTIATE_TEST_SUITE_P statement.<br>
//<br>
// Please also note that generator expressions (including parameters to the<br>
// generators) are evaluated in InitGoogleTest(), after main() has started.<br>
@@ -178,26 +174,23 @@ TEST_P(DerivedTest, DoesBlah) {<br>
<br>
#endif // 0<br>
<br>
-#include "gtest/internal/gtest-port.h"<br>
-<br>
-#if !GTEST_OS_SYMBIAN<br>
-# include <utility><br>
-#endif<br>
+#include <iterator><br>
+#include <utility><br>
<br>
#include "gtest/internal/gtest-internal.h"<br>
#include "gtest/internal/gtest-param-util.h"<br>
-#include "gtest/internal/gtest-param-util-generated.h"<br>
+#include "gtest/internal/gtest-port.h"<br>
<br>
namespace testing {<br>
<br>
// Functions producing parameter generators.<br>
//<br>
// Google Test uses these generators to produce parameters for value-<br>
-// parameterized tests. When a parameterized test case is instantiated<br>
+// parameterized tests. When a parameterized test suite is instantiated<br>
// with a particular generator, Google Test creates and runs tests<br>
// for each element in the sequence produced by the generator.<br>
//<br>
-// In the following sample, tests from test case FooTest are instantiated<br>
+// In the following sample, tests from test suite FooTest are instantiated<br>
// each three times with parameter values 3, 5, and 8:<br>
//<br>
// class FooTest : public TestWithParam<int> { ... };<br>
@@ -206,7 +199,7 @@ namespace testing {<br>
// }<br>
// TEST_P(FooTest, TestThat) {<br>
// }<br>
-// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));<br>
+// INSTANTIATE_TEST_SUITE_P(TestSequence, FooTest, Values(3, 5, 8));<br>
//<br>
<br>
// Range() returns generators providing sequences of values in a range.<br>
@@ -263,13 +256,13 @@ internal::ParamGenerator<T> Range(T start, T end) {<br>
//<br>
// Examples:<br>
//<br>
-// This instantiates tests from test case StringTest<br>
+// This instantiates tests from test suite StringTest<br>
// each with C-string values of "foo", "bar", and "baz":<br>
//<br>
// const char* strings[] = {"foo", "bar", "baz"};<br>
-// INSTANTIATE_TEST_CASE_P(StringSequence, StringTest, ValuesIn(strings));<br>
+// INSTANTIATE_TEST_SUITE_P(StringSequence, StringTest, ValuesIn(strings));<br>
//<br>
-// This instantiates tests from test case StlStringTest<br>
+// This instantiates tests from test suite StlStringTest<br>
// each with STL strings with values "a" and "b":<br>
//<br>
// ::std::vector< ::std::string> GetParameterStrings() {<br>
@@ -279,9 +272,9 @@ internal::ParamGenerator<T> Range(T start, T end) {<br>
// return v;<br>
// }<br>
//<br>
-// INSTANTIATE_TEST_CASE_P(CharSequence,<br>
-// StlStringTest,<br>
-// ValuesIn(GetParameterStrings()));<br>
+// INSTANTIATE_TEST_SUITE_P(CharSequence,<br>
+// StlStringTest,<br>
+// ValuesIn(GetParameterStrings()));<br>
//<br>
//<br>
// This will also instantiate tests from CharTest<br>
@@ -294,16 +287,15 @@ internal::ParamGenerator<T> Range(T start, T end) {<br>
// return list;<br>
// }<br>
// ::std::list<char> l = GetParameterChars();<br>
-// INSTANTIATE_TEST_CASE_P(CharSequence2,<br>
-// CharTest,<br>
-// ValuesIn(l.begin(), l.end()));<br>
+// INSTANTIATE_TEST_SUITE_P(CharSequence2,<br>
+// CharTest,<br>
+// ValuesIn(l.begin(), l.end()));<br>
//<br>
template <typename ForwardIterator><br>
internal::ParamGenerator<<br>
- typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type><br>
+ typename std::iterator_traits<ForwardIterator>::value_type><br>
ValuesIn(ForwardIterator begin, ForwardIterator end) {<br>
- typedef typename ::testing::internal::IteratorTraits<ForwardIterator><br>
- ::value_type ParamType;<br>
+ typedef typename std::iterator_traits<ForwardIterator>::value_type ParamType;<br>
return internal::ParamGenerator<ParamType>(<br>
new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));<br>
}<br>
@@ -326,869 +318,22 @@ internal::ParamGenerator<typename Container::value_type> ValuesIn(<br>
// Values(T v1, T v2, ..., T vN)<br>
// - returns a generator producing sequences with elements v1, v2, ..., vN.<br>
//<br>
-// For example, this instantiates tests from test case BarTest each<br>
+// For example, this instantiates tests from test suite BarTest each<br>
// with values "one", "two", and "three":<br>
//<br>
-// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));<br>
+// INSTANTIATE_TEST_SUITE_P(NumSequence,<br>
+// BarTest,<br>
+// Values("one", "two", "three"));<br>
//<br>
-// This instantiates tests from test case BazTest each with values 1, 2, 3.5.<br>
+// This instantiates tests from test suite BazTest each with values 1, 2, 3.5.<br>
// The exact type of values will depend on the type of parameter in BazTest.<br>
//<br>
-// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));<br>
+// INSTANTIATE_TEST_SUITE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));<br>
//<br>
-// Currently, Values() supports from 1 to 50 parameters.<br>
//<br>
-template <typename T1><br>
-internal::ValueArray1<T1> Values(T1 v1) {<br>
- return internal::ValueArray1<T1>(v1);<br>
-}<br>
-<br>
-template <typename T1, typename T2><br>
-internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {<br>
- return internal::ValueArray2<T1, T2>(v1, v2);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3><br>
-internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {<br>
- return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4><br>
-internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {<br>
- return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5><br>
-internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,<br>
- T5 v5) {<br>
- return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6><br>
-internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,<br>
- T4 v4, T5 v5, T6 v6) {<br>
- return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7><br>
-internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,<br>
- T4 v4, T5 v5, T6 v6, T7 v7) {<br>
- return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,<br>
- v6, v7);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8><br>
-internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,<br>
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {<br>
- return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,<br>
- v5, v6, v7, v8);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9><br>
-internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,<br>
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {<br>
- return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,<br>
- v4, v5, v6, v7, v8, v9);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10><br>
-internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,<br>
- T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {<br>
- return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,<br>
- v2, v3, v4, v5, v6, v7, v8, v9, v10);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11><br>
-internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,<br>
- T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11) {<br>
- return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,<br>
- T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12><br>
-internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12) {<br>
- return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13><br>
-internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,<br>
- T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13) {<br>
- return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14><br>
-internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {<br>
- return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,<br>
- v14);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15><br>
-internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,<br>
- T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {<br>
- return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,<br>
- v13, v14, v15);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16><br>
-internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,<br>
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
- T16 v16) {<br>
- return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,<br>
- v12, v13, v14, v15, v16);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17><br>
-internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,<br>
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
- T16 v16, T17 v17) {<br>
- return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,<br>
- v11, v12, v13, v14, v15, v16, v17);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18><br>
-internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,<br>
- T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
- T16 v16, T17 v17, T18 v18) {<br>
- return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,<br>
- v10, v11, v12, v13, v14, v15, v16, v17, v18);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19><br>
-internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,<br>
- T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,<br>
- T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {<br>
- return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,<br>
- v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20><br>
-internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,<br>
- T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,<br>
- T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {<br>
- return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,<br>
- v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21><br>
-internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,<br>
- T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,<br>
- T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {<br>
- return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,<br>
- v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22><br>
-internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,<br>
- T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,<br>
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,<br>
- T21 v21, T22 v22) {<br>
- return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,<br>
- v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,<br>
- v20, v21, v22);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23><br>
-internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,<br>
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,<br>
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,<br>
- T21 v21, T22 v22, T23 v23) {<br>
- return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,<br>
- v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,<br>
- v20, v21, v22, v23);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24><br>
-internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,<br>
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,<br>
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,<br>
- T21 v21, T22 v22, T23 v23, T24 v24) {<br>
- return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,<br>
- v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,<br>
- v19, v20, v21, v22, v23, v24);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25><br>
-internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,<br>
- T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,<br>
- T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,<br>
- T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {<br>
- return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,<br>
- v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,<br>
- v18, v19, v20, v21, v22, v23, v24, v25);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26><br>
-internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26) {<br>
- return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,<br>
- v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27><br>
-internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,<br>
- T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27) {<br>
- return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,<br>
- v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28><br>
-internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,<br>
- T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28) {<br>
- return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,<br>
- v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,<br>
- v28);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29><br>
-internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29) {<br>
- return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,<br>
- v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,<br>
- v27, v28, v29);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30><br>
-internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,<br>
- T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,<br>
- T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,<br>
- T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {<br>
- return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,<br>
- v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,<br>
- v26, v27, v28, v29, v30);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31><br>
-internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,<br>
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,<br>
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {<br>
- return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,<br>
- v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,<br>
- v25, v26, v27, v28, v29, v30, v31);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32><br>
-internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,<br>
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,<br>
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,<br>
- T32 v32) {<br>
- return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,<br>
- v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,<br>
- v24, v25, v26, v27, v28, v29, v30, v31, v32);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33><br>
-internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,<br>
- T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,<br>
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,<br>
- T32 v32, T33 v33) {<br>
- return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,<br>
- v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,<br>
- v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34><br>
-internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,<br>
- T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,<br>
- T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,<br>
- T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,<br>
- T31 v31, T32 v32, T33 v33, T34 v34) {<br>
- return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,<br>
- v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,<br>
- v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35><br>
-internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,<br>
- T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,<br>
- T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,<br>
- T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,<br>
- T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {<br>
- return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,<br>
- v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,<br>
- v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36><br>
-internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,<br>
- T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,<br>
- T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,<br>
- T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,<br>
- T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {<br>
- return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,<br>
- v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,<br>
- v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,<br>
- v34, v35, v36);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37><br>
-internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,<br>
- T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,<br>
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,<br>
- T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,<br>
- T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,<br>
- T37 v37) {<br>
- return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,<br>
- v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,<br>
- v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,<br>
- v34, v35, v36, v37);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38><br>
-internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,<br>
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,<br>
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,<br>
- T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,<br>
- T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,<br>
- T37 v37, T38 v38) {<br>
- return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,<br>
- v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,<br>
- v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,<br>
- v33, v34, v35, v36, v37, v38);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39><br>
-internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,<br>
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,<br>
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,<br>
- T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,<br>
- T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,<br>
- T37 v37, T38 v38, T39 v39) {<br>
- return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,<br>
- v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,<br>
- v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,<br>
- v32, v33, v34, v35, v36, v37, v38, v39);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40><br>
-internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,<br>
- T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,<br>
- T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,<br>
- T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,<br>
- T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,<br>
- T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {<br>
- return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
- T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,<br>
- v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,<br>
- v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41><br>
-internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,<br>
- T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {<br>
- return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
- T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,<br>
- v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,<br>
- v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42><br>
-internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,<br>
- T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
- T42 v42) {<br>
- return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
- T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,<br>
- v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,<br>
- v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,<br>
- v42);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43><br>
-internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,<br>
- T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
- T42 v42, T43 v43) {<br>
- return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
- T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,<br>
- v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,<br>
- v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,<br>
- v41, v42, v43);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43, typename T44><br>
-internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,<br>
- T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
- T42 v42, T43 v43, T44 v44) {<br>
- return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
- T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,<br>
- v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,<br>
- v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,<br>
- v40, v41, v42, v43, v44);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43, typename T44, typename T45><br>
-internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,<br>
- T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,<br>
- T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,<br>
- T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,<br>
- T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,<br>
- T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,<br>
- T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {<br>
- return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
- T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,<br>
- v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,<br>
- v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,<br>
- v39, v40, v41, v42, v43, v44, v45);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43, typename T44, typename T45,<br>
- typename T46><br>
-internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,<br>
- T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,<br>
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,<br>
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,<br>
- T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,<br>
- T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {<br>
- return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
- T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,<br>
- v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,<br>
- v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,<br>
- v38, v39, v40, v41, v42, v43, v44, v45, v46);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43, typename T44, typename T45,<br>
- typename T46, typename T47><br>
-internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,<br>
- T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,<br>
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,<br>
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,<br>
- T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,<br>
- T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {<br>
- return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
- T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,<br>
- v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,<br>
- v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,<br>
- v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43, typename T44, typename T45,<br>
- typename T46, typename T47, typename T48><br>
-internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,<br>
- T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,<br>
- T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,<br>
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,<br>
- T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,<br>
- T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,<br>
- T48 v48) {<br>
- return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
- T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,<br>
- v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,<br>
- v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,<br>
- v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43, typename T44, typename T45,<br>
- typename T46, typename T47, typename T48, typename T49><br>
-internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,<br>
- T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,<br>
- T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,<br>
- T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,<br>
- T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,<br>
- T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,<br>
- T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,<br>
- T47 v47, T48 v48, T49 v49) {<br>
- return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
- T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,<br>
- v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,<br>
- v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,<br>
- v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43, typename T44, typename T45,<br>
- typename T46, typename T47, typename T48, typename T49, typename T50><br>
-internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,<br>
- T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,<br>
- T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,<br>
- T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,<br>
- T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,<br>
- T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,<br>
- T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,<br>
- T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {<br>
- return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
- T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,<br>
- v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,<br>
- v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,<br>
- v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,<br>
- v48, v49, v50);<br>
+template <typename... T><br>
+internal::ValueArray<T...> Values(T... v) {<br>
+ return internal::ValueArray<T...>(std::move(v)...);<br>
}<br>
<br>
// Bool() allows generating tests with parameters in a set of (false, true).<br>
@@ -1201,7 +346,7 @@ internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
// of multiple flags can be tested when several Bool()'s are combined using<br>
// Combine() function.<br>
//<br>
-// In the following example all tests in the test case FlagDependentTest<br>
+// In the following example all tests in the test suite FlagDependentTest<br>
// will be instantiated twice with parameters false and true.<br>
//<br>
// class FlagDependentTest : public testing::TestWithParam<bool> {<br>
@@ -1209,13 +354,12 @@ internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
// external_flag = GetParam();<br>
// }<br>
// }<br>
-// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());<br>
+// INSTANTIATE_TEST_SUITE_P(BoolSequence, FlagDependentTest, Bool());<br>
//<br>
inline internal::ParamGenerator<bool> Bool() {<br>
return Values(false, true);<br>
}<br>
<br>
-# if GTEST_HAS_COMBINE<br>
// Combine() allows the user to combine two or more sequences to produce<br>
// values of a Cartesian product of those sequences' elements.<br>
//<br>
@@ -1224,184 +368,83 @@ inline internal::ParamGenerator<bool> Bool() {<br>
// - returns a generator producing sequences with elements coming from<br>
// the Cartesian product of elements from the sequences generated by<br>
// gen1, gen2, ..., genN. The sequence elements will have a type of<br>
-// tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types<br>
+// std::tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types<br>
// of elements from sequences produces by gen1, gen2, ..., genN.<br>
//<br>
-// Combine can have up to 10 arguments. This number is currently limited<br>
-// by the maximum number of elements in the tuple implementation used by Google<br>
-// Test.<br>
+// Combine can have up to 10 arguments.<br>
//<br>
// Example:<br>
//<br>
-// This will instantiate tests in test case AnimalTest each one with<br>
+// This will instantiate tests in test suite AnimalTest each one with<br>
// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),<br>
// tuple("dog", BLACK), and tuple("dog", WHITE):<br>
//<br>
// enum Color { BLACK, GRAY, WHITE };<br>
// class AnimalTest<br>
-// : public testing::TestWithParam<tuple<const char*, Color> > {...};<br>
+// : public testing::TestWithParam<std::tuple<const char*, Color> > {...};<br>
//<br>
// TEST_P(AnimalTest, AnimalLooksNice) {...}<br>
//<br>
-// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,<br>
-// Combine(Values("cat", "dog"),<br>
-// Values(BLACK, WHITE)));<br>
+// INSTANTIATE_TEST_SUITE_P(AnimalVariations, AnimalTest,<br>
+// Combine(Values("cat", "dog"),<br>
+// Values(BLACK, WHITE)));<br>
//<br>
// This will instantiate tests in FlagDependentTest with all variations of two<br>
// Boolean flags:<br>
//<br>
// class FlagDependentTest<br>
-// : public testing::TestWithParam<tuple<bool, bool> > {<br>
+// : public testing::TestWithParam<std::tuple<bool, bool> > {<br>
// virtual void SetUp() {<br>
// // Assigns external_flag_1 and external_flag_2 values from the tuple.<br>
-// tie(external_flag_1, external_flag_2) = GetParam();<br>
+// std::tie(external_flag_1, external_flag_2) = GetParam();<br>
// }<br>
// };<br>
//<br>
// TEST_P(FlagDependentTest, TestFeature1) {<br>
// // Test your code using external_flag_1 and external_flag_2 here.<br>
// }<br>
-// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,<br>
-// Combine(Bool(), Bool()));<br>
-//<br>
-template <typename Generator1, typename Generator2><br>
-internal::CartesianProductHolder2<Generator1, Generator2> Combine(<br>
- const Generator1& g1, const Generator2& g2) {<br>
- return internal::CartesianProductHolder2<Generator1, Generator2>(<br>
- g1, g2);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3><br>
-internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(<br>
- const Generator1& g1, const Generator2& g2, const Generator3& g3) {<br>
- return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(<br>
- g1, g2, g3);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3,<br>
- typename Generator4><br>
-internal::CartesianProductHolder4<Generator1, Generator2, Generator3,<br>
- Generator4> Combine(<br>
- const Generator1& g1, const Generator2& g2, const Generator3& g3,<br>
- const Generator4& g4) {<br>
- return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,<br>
- Generator4>(<br>
- g1, g2, g3, g4);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3,<br>
- typename Generator4, typename Generator5><br>
-internal::CartesianProductHolder5<Generator1, Generator2, Generator3,<br>
- Generator4, Generator5> Combine(<br>
- const Generator1& g1, const Generator2& g2, const Generator3& g3,<br>
- const Generator4& g4, const Generator5& g5) {<br>
- return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,<br>
- Generator4, Generator5>(<br>
- g1, g2, g3, g4, g5);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3,<br>
- typename Generator4, typename Generator5, typename Generator6><br>
-internal::CartesianProductHolder6<Generator1, Generator2, Generator3,<br>
- Generator4, Generator5, Generator6> Combine(<br>
- const Generator1& g1, const Generator2& g2, const Generator3& g3,<br>
- const Generator4& g4, const Generator5& g5, const Generator6& g6) {<br>
- return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,<br>
- Generator4, Generator5, Generator6>(<br>
- g1, g2, g3, g4, g5, g6);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3,<br>
- typename Generator4, typename Generator5, typename Generator6,<br>
- typename Generator7><br>
-internal::CartesianProductHolder7<Generator1, Generator2, Generator3,<br>
- Generator4, Generator5, Generator6, Generator7> Combine(<br>
- const Generator1& g1, const Generator2& g2, const Generator3& g3,<br>
- const Generator4& g4, const Generator5& g5, const Generator6& g6,<br>
- const Generator7& g7) {<br>
- return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,<br>
- Generator4, Generator5, Generator6, Generator7>(<br>
- g1, g2, g3, g4, g5, g6, g7);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3,<br>
- typename Generator4, typename Generator5, typename Generator6,<br>
- typename Generator7, typename Generator8><br>
-internal::CartesianProductHolder8<Generator1, Generator2, Generator3,<br>
- Generator4, Generator5, Generator6, Generator7, Generator8> Combine(<br>
- const Generator1& g1, const Generator2& g2, const Generator3& g3,<br>
- const Generator4& g4, const Generator5& g5, const Generator6& g6,<br>
- const Generator7& g7, const Generator8& g8) {<br>
- return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,<br>
- Generator4, Generator5, Generator6, Generator7, Generator8>(<br>
- g1, g2, g3, g4, g5, g6, g7, g8);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3,<br>
- typename Generator4, typename Generator5, typename Generator6,<br>
- typename Generator7, typename Generator8, typename Generator9><br>
-internal::CartesianProductHolder9<Generator1, Generator2, Generator3,<br>
- Generator4, Generator5, Generator6, Generator7, Generator8,<br>
- Generator9> Combine(<br>
- const Generator1& g1, const Generator2& g2, const Generator3& g3,<br>
- const Generator4& g4, const Generator5& g5, const Generator6& g6,<br>
- const Generator7& g7, const Generator8& g8, const Generator9& g9) {<br>
- return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,<br>
- Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(<br>
- g1, g2, g3, g4, g5, g6, g7, g8, g9);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3,<br>
- typename Generator4, typename Generator5, typename Generator6,<br>
- typename Generator7, typename Generator8, typename Generator9,<br>
- typename Generator10><br>
-internal::CartesianProductHolder10<Generator1, Generator2, Generator3,<br>
- Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,<br>
- Generator10> Combine(<br>
- const Generator1& g1, const Generator2& g2, const Generator3& g3,<br>
- const Generator4& g4, const Generator5& g5, const Generator6& g6,<br>
- const Generator7& g7, const Generator8& g8, const Generator9& g9,<br>
- const Generator10& g10) {<br>
- return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,<br>
- Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,<br>
- Generator10>(<br>
- g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);<br>
-}<br>
-# endif // GTEST_HAS_COMBINE<br>
-<br>
-# define TEST_P(test_case_name, test_name) \<br>
- class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \<br>
- : public test_case_name { \<br>
- public: \<br>
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \<br>
- virtual void TestBody(); \<br>
- private: \<br>
- static int AddToRegistry() { \<br>
- ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \<br>
- GetTestCasePatternHolder<test_case_name>(\<br>
- #test_case_name, \<br>
- ::testing::internal::CodeLocation(\<br>
- __FILE__, __LINE__))->AddTestPattern(\<br>
- GTEST_STRINGIFY_(test_case_name), \<br>
- GTEST_STRINGIFY_(test_name), \<br>
- new ::testing::internal::TestMetaFactory< \<br>
- GTEST_TEST_CLASS_NAME_(\<br>
- test_case_name, test_name)>()); \<br>
- return 0; \<br>
- } \<br>
- static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(\<br>
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \<br>
- }; \<br>
- int GTEST_TEST_CLASS_NAME_(test_case_name, \<br>
- test_name)::gtest_registering_dummy_ = \<br>
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \<br>
- void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()<br>
-<br>
-// The optional last argument to INSTANTIATE_TEST_CASE_P allows the user<br>
-// to specify a function or functor that generates custom test name suffixes<br>
-// based on the test parameters. The function should accept one argument of<br>
-// type testing::TestParamInfo<class ParamType>, and return std::string.<br>
+// INSTANTIATE_TEST_SUITE_P(TwoBoolSequence, FlagDependentTest,<br>
+// Combine(Bool(), Bool()));<br>
+//<br>
+template <typename... Generator><br>
+internal::CartesianProductHolder<Generator...> Combine(const Generator&... g) {<br>
+ return internal::CartesianProductHolder<Generator...>(g...);<br>
+}<br>
+<br>
+#define TEST_P(test_suite_name, test_name) \<br>
+ class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \<br>
+ : public test_suite_name { \<br>
+ public: \<br>
+ GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \<br>
+ virtual void TestBody(); \<br>
+ \<br>
+ private: \<br>
+ static int AddToRegistry() { \<br>
+ ::testing::UnitTest::GetInstance() \<br>
+ ->parameterized_test_registry() \<br>
+ .GetTestSuitePatternHolder<test_suite_name>( \<br>
+ #test_suite_name, \<br>
+ ::testing::internal::CodeLocation(__FILE__, __LINE__)) \<br>
+ ->AddTestPattern( \<br>
+ GTEST_STRINGIFY_(test_suite_name), GTEST_STRINGIFY_(test_name), \<br>
+ new ::testing::internal::TestMetaFactory<GTEST_TEST_CLASS_NAME_( \<br>
+ test_suite_name, test_name)>()); \<br>
+ return 0; \<br>
+ } \<br>
+ static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \<br>
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \<br>
+ test_name)); \<br>
+ }; \<br>
+ int GTEST_TEST_CLASS_NAME_(test_suite_name, \<br>
+ test_name)::gtest_registering_dummy_ = \<br>
+ GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::AddToRegistry(); \<br>
+ void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody()<br>
+<br>
+// The last argument to INSTANTIATE_TEST_SUITE_P allows the user to specify<br>
+// generator and an optional function or functor that generates custom test name<br>
+// suffixes based on the test parameters. Such a function or functor should<br>
+// accept one argument of type testing::TestParamInfo<class ParamType>, and<br>
+// return std::string.<br>
//<br>
// testing::PrintToStringParamName is a builtin test suffix generator that<br>
// returns the value of testing::PrintToString(GetParam()).<br>
@@ -1410,24 +453,50 @@ internal::CartesianProductHolder10<Generator1, Generator2, Generator3,<br>
// alphanumeric characters or underscore. Because PrintToString adds quotes<br>
// to std::string and C strings, it won't work for these types.<br>
<br>
-# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator, ...) \<br>
- static ::testing::internal::ParamGenerator<test_case_name::ParamType> \<br>
- gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \<br>
- static ::std::string gtest_##prefix##test_case_name##_EvalGenerateName_( \<br>
- const ::testing::TestParamInfo<test_case_name::ParamType>& info) { \<br>
- return ::testing::internal::GetParamNameGen<test_case_name::ParamType> \<br>
- (__VA_ARGS__)(info); \<br>
- } \<br>
- static int gtest_##prefix##test_case_name##_dummy_ GTEST_ATTRIBUTE_UNUSED_ = \<br>
- ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \<br>
- GetTestCasePatternHolder<test_case_name>(\<br>
- #test_case_name, \<br>
- ::testing::internal::CodeLocation(\<br>
- __FILE__, __LINE__))->AddTestCaseInstantiation(\<br>
- #prefix, \<br>
- >est_##prefix##test_case_name##_EvalGenerator_, \<br>
- >est_##prefix##test_case_name##_EvalGenerateName_, \<br>
- __FILE__, __LINE__)<br>
+#define GTEST_EXPAND_(arg) arg<br>
+#define GTEST_GET_FIRST_(first, ...) first<br>
+#define GTEST_GET_SECOND_(first, second, ...) second<br>
+<br>
+#define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, ...) \<br>
+ static ::testing::internal::ParamGenerator<test_suite_name::ParamType> \<br>
+ gtest_##prefix##test_suite_name##_EvalGenerator_() { \<br>
+ return GTEST_EXPAND_(GTEST_GET_FIRST_(__VA_ARGS__, DUMMY_PARAM_)); \<br>
+ } \<br>
+ static ::std::string gtest_##prefix##test_suite_name##_EvalGenerateName_( \<br>
+ const ::testing::TestParamInfo<test_suite_name::ParamType>& info) { \<br>
+ if (::testing::internal::AlwaysFalse()) { \<br>
+ ::testing::internal::TestNotEmpty(GTEST_EXPAND_(GTEST_GET_SECOND_( \<br>
+ __VA_ARGS__, \<br>
+ ::testing::internal::DefaultParamName<test_suite_name::ParamType>, \<br>
+ DUMMY_PARAM_))); \<br>
+ auto t = std::make_tuple(__VA_ARGS__); \<br>
+ static_assert(std::tuple_size<decltype(t)>::value <= 2, \<br>
+ "Too Many Args!"); \<br>
+ } \<br>
+ return ((GTEST_EXPAND_(GTEST_GET_SECOND_( \<br>
+ __VA_ARGS__, \<br>
+ ::testing::internal::DefaultParamName<test_suite_name::ParamType>, \<br>
+ DUMMY_PARAM_))))(info); \<br>
+ } \<br>
+ static int gtest_##prefix##test_suite_name##_dummy_ \<br>
+ GTEST_ATTRIBUTE_UNUSED_ = \<br>
+ ::testing::UnitTest::GetInstance() \<br>
+ ->parameterized_test_registry() \<br>
+ .GetTestSuitePatternHolder<test_suite_name>( \<br>
+ #test_suite_name, \<br>
+ ::testing::internal::CodeLocation(__FILE__, __LINE__)) \<br>
+ ->AddTestSuiteInstantiation( \<br>
+ #prefix, >est_##prefix##test_suite_name##_EvalGenerator_, \<br>
+ >est_##prefix##test_suite_name##_EvalGenerateName_, \<br>
+ __FILE__, __LINE__)<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+#define INSTANTIATE_TEST_CASE_P \<br>
+ static_assert(::testing::internal::InstantiateTestCase_P_IsDeprecated(), \<br>
+ ""); \<br>
+ INSTANTIATE_TEST_SUITE_P<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
} // namespace testing<br>
<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/gtest-printers.h b/llvm/utils/unittest/googletest/include/gtest/gtest-printers.h<br>
index c4b3de950c2b6..956f07910484a 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest-printers.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-printers.h<br>
@@ -100,19 +100,18 @@<br>
#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_<br>
#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_<br>
<br>
+#include <functional><br>
#include <ostream> // NOLINT<br>
#include <sstream><br>
#include <string><br>
+#include <tuple><br>
+#include <type_traits><br>
#include <utility><br>
#include <vector><br>
-#include "gtest/internal/gtest-port.h"<br>
#include "gtest/internal/gtest-internal.h"<br>
+#include "gtest/internal/gtest-port.h"<br>
#include "gtest/internal/custom/raw-ostream.h"<br>
<br>
-#if GTEST_HAS_STD_TUPLE_<br>
-# include <tuple><br>
-#endif<br>
-<br>
#if GTEST_HAS_ABSL<br>
#include "absl/strings/string_view.h"<br>
#include "absl/types/optional.h"<br>
@@ -153,9 +152,10 @@ class TypeWithoutFormatter {<br>
public:<br>
// This default version is called when kTypeKind is kOtherType.<br>
static void PrintValue(const T& value, ::std::ostream* os) {<br>
- PrintBytesInObjectTo(static_cast<const unsigned char*>(<br>
- reinterpret_cast<const void*>(&value)),<br>
- sizeof(value), os);<br>
+ PrintBytesInObjectTo(<br>
+ static_cast<const unsigned char*>(<br>
+ reinterpret_cast<const void*>(std::addressof(value))),<br>
+ sizeof(value), os);<br>
}<br>
};<br>
<br>
@@ -234,12 +234,12 @@ ::std::basic_ostream<Char, CharTraits>& operator<<(<br>
::std::basic_ostream<Char, CharTraits>& os, const T& x) {<br>
TypeWithoutFormatter<T, (internal::IsAProtocolMessage<T>::value<br>
? kProtobuf<br>
- : internal::ImplicitlyConvertible<<br>
+ : std::is_convertible<<br>
const T&, internal::BiggestInt>::value<br>
? kConvertibleToInteger<br>
:<br>
#if GTEST_HAS_ABSL<br>
- internal::ImplicitlyConvertible<<br>
+ std::is_convertible<<br>
const T&, absl::string_view>::value<br>
? kConvertibleToStringView<br>
:<br>
@@ -359,16 +359,6 @@ GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);<br>
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);<br>
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);<br>
<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);<br>
-GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);<br>
-#endif<br>
-<br>
-#if GTEST_HAS_GLOBAL_WSTRING<br>
-GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);<br>
-GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);<br>
-#endif<br>
-<br>
#if GTEST_HAS_STD_WSTRING<br>
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);<br>
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);<br>
@@ -449,7 +439,7 @@ void DefaultPrintTo(WrapPrinterType<kPrintContainer> /* dummy */,<br>
template <typename T><br>
void DefaultPrintTo(WrapPrinterType<kPrintPointer> /* dummy */,<br>
T* p, ::std::ostream* os) {<br>
- if (p == NULL) {<br>
+ if (p == nullptr) {<br>
*os << "NULL";<br>
} else {<br>
// T is not a function type. We just call << to print p,<br>
@@ -461,7 +451,7 @@ void DefaultPrintTo(WrapPrinterType<kPrintPointer> /* dummy */,<br>
template <typename T><br>
void DefaultPrintTo(WrapPrinterType<kPrintFunctionPointer> /* dummy */,<br>
T* p, ::std::ostream* os) {<br>
- if (p == NULL) {<br>
+ if (p == nullptr) {<br>
*os << "NULL";<br>
} else {<br>
// T is a function type, so '*os << p' doesn't do what we want<br>
@@ -516,13 +506,9 @@ void PrintTo(const T& value, ::std::ostream* os) {<br>
(sizeof(IsContainerTest<T>(0)) == sizeof(IsContainer)) &&<br>
!IsRecursiveContainer<T>::value<br>
? kPrintContainer<br>
- : !is_pointer<T>::value<br>
+ : !std::is_pointer<T>::value<br>
? kPrintOther<br>
-#if GTEST_LANG_CXX11<br>
: std::is_function<typename std::remove_pointer<T>::type>::value<br>
-#else<br>
- : !internal::ImplicitlyConvertible<T, const void*>::value<br>
-#endif<br>
? kPrintFunctionPointer<br>
: kPrintPointer > (),<br>
value, os);<br>
@@ -604,27 +590,13 @@ void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {<br>
}<br>
}<br>
<br>
-// Overloads for ::string and ::std::string.<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);<br>
-inline void PrintTo(const ::string& s, ::std::ostream* os) {<br>
- PrintStringTo(s, os);<br>
-}<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
+// Overloads for ::std::string.<br>
GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);<br>
inline void PrintTo(const ::std::string& s, ::std::ostream* os) {<br>
PrintStringTo(s, os);<br>
}<br>
<br>
-// Overloads for ::wstring and ::std::wstring.<br>
-#if GTEST_HAS_GLOBAL_WSTRING<br>
-GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);<br>
-inline void PrintTo(const ::wstring& s, ::std::ostream* os) {<br>
- PrintWideStringTo(s, os);<br>
-}<br>
-#endif // GTEST_HAS_GLOBAL_WSTRING<br>
-<br>
+// Overloads for ::std::wstring.<br>
#if GTEST_HAS_STD_WSTRING<br>
GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);<br>
inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {<br>
@@ -639,99 +611,38 @@ inline void PrintTo(absl::string_view sp, ::std::ostream* os) {<br>
}<br>
#endif // GTEST_HAS_ABSL<br>
<br>
-#if GTEST_LANG_CXX11<br>
inline void PrintTo(std::nullptr_t, ::std::ostream* os) { *os << "(nullptr)"; }<br>
-#endif // GTEST_LANG_CXX11<br>
<br>
-#if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_<br>
-// Helper function for printing a tuple. T must be instantiated with<br>
-// a tuple type.<br>
template <typename T><br>
-void PrintTupleTo(const T& t, ::std::ostream* os);<br>
-#endif // GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_<br>
-<br>
-#if GTEST_HAS_TR1_TUPLE<br>
-// Overload for ::std::tr1::tuple. Needed for printing function arguments,<br>
-// which are packed as tuples.<br>
-<br>
-// Overloaded PrintTo() for tuples of various arities. We support<br>
-// tuples of up-to 10 fields. The following implementation works<br>
-// regardless of whether tr1::tuple is implemented using the<br>
-// non-standard variadic template feature or not.<br>
-<br>
-inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {<br>
- PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1><br>
-void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {<br>
- PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {<br>
- PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {<br>
- PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {<br>
- PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,<br>
- ::std::ostream* os) {<br>
- PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,<br>
- ::std::ostream* os) {<br>
- PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,<br>
- ::std::ostream* os) {<br>
- PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,<br>
- ::std::ostream* os) {<br>
- PrintTupleTo(t, os);<br>
+void PrintTo(std::reference_wrapper<T> ref, ::std::ostream* os) {<br>
+ UniversalPrinter<T&>::Print(ref.get(), os);<br>
}<br>
<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,<br>
- ::std::ostream* os) {<br>
- PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10><br>
-void PrintTo(<br>
- const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,<br>
- ::std::ostream* os) {<br>
- PrintTupleTo(t, os);<br>
+// Helper function for printing a tuple. T must be instantiated with<br>
+// a tuple type.<br>
+template <typename T><br>
+void PrintTupleTo(const T&, std::integral_constant<size_t, 0>,<br>
+ ::std::ostream*) {}<br>
+<br>
+template <typename T, size_t I><br>
+void PrintTupleTo(const T& t, std::integral_constant<size_t, I>,<br>
+ ::std::ostream* os) {<br>
+ PrintTupleTo(t, std::integral_constant<size_t, I - 1>(), os);<br>
+ GTEST_INTENTIONAL_CONST_COND_PUSH_()<br>
+ if (I > 1) {<br>
+ GTEST_INTENTIONAL_CONST_COND_POP_()<br>
+ *os << ", ";<br>
+ }<br>
+ UniversalPrinter<typename std::tuple_element<I - 1, T>::type>::Print(<br>
+ std::get<I - 1>(t), os);<br>
}<br>
-#endif // GTEST_HAS_TR1_TUPLE<br>
<br>
-#if GTEST_HAS_STD_TUPLE_<br>
template <typename... Types><br>
void PrintTo(const ::std::tuple<Types...>& t, ::std::ostream* os) {<br>
- PrintTupleTo(t, os);<br>
+ *os << "(";<br>
+ PrintTupleTo(t, std::integral_constant<size_t, sizeof...(Types)>(), os);<br>
+ *os << ")";<br>
}<br>
-#endif // GTEST_HAS_STD_TUPLE_<br>
<br>
// Overload for std::pair.<br>
template <typename T1, typename T2><br>
@@ -827,7 +738,6 @@ void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {<br>
// If the array has more than kThreshold elements, we'll have to<br>
// omit some details by printing only the first and the last<br>
// kChunkSize elements.<br>
- // FIXME: let the user control the threshold using a flag.<br>
if (len <= kThreshold) {<br>
PrintRawArrayTo(begin, len, os);<br>
} else {<br>
@@ -906,7 +816,7 @@ template <><br>
class UniversalTersePrinter<const char*> {<br>
public:<br>
static void Print(const char* str, ::std::ostream* os) {<br>
- if (str == NULL) {<br>
+ if (str == nullptr) {<br>
*os << "NULL";<br>
} else {<br>
UniversalPrint(std::string(str), os);<br>
@@ -926,7 +836,7 @@ template <><br>
class UniversalTersePrinter<const wchar_t*> {<br>
public:<br>
static void Print(const wchar_t* str, ::std::ostream* os) {<br>
- if (str == NULL) {<br>
+ if (str == nullptr) {<br>
*os << "NULL";<br>
} else {<br>
UniversalPrint(::std::wstring(str), os);<br>
@@ -962,109 +872,20 @@ void UniversalPrint(const T& value, ::std::ostream* os) {<br>
<br>
typedef ::std::vector< ::std::string> Strings;<br>
<br>
-// TuplePolicy<TupleT> must provide:<br>
-// - tuple_size<br>
-// size of tuple TupleT.<br>
-// - get<size_t I>(const TupleT& t)<br>
-// static function extracting element I of tuple TupleT.<br>
-// - tuple_element<size_t I>::type<br>
-// type of element I of tuple TupleT.<br>
-template <typename TupleT><br>
-struct TuplePolicy;<br>
-<br>
-#if GTEST_HAS_TR1_TUPLE<br>
-template <typename TupleT><br>
-struct TuplePolicy {<br>
- typedef TupleT Tuple;<br>
- static const size_t tuple_size = ::std::tr1::tuple_size<Tuple>::value;<br>
-<br>
- template <size_t I><br>
- struct tuple_element : ::std::tr1::tuple_element<static_cast<int>(I), Tuple> {<br>
- };<br>
-<br>
- template <size_t I><br>
- static typename AddReference<const typename ::std::tr1::tuple_element<<br>
- static_cast<int>(I), Tuple>::type>::type<br>
- get(const Tuple& tuple) {<br>
- return ::std::tr1::get<I>(tuple);<br>
- }<br>
-};<br>
-template <typename TupleT><br>
-const size_t TuplePolicy<TupleT>::tuple_size;<br>
-#endif // GTEST_HAS_TR1_TUPLE<br>
-<br>
-#if GTEST_HAS_STD_TUPLE_<br>
-template <typename... Types><br>
-struct TuplePolicy< ::std::tuple<Types...> > {<br>
- typedef ::std::tuple<Types...> Tuple;<br>
- static const size_t tuple_size = ::std::tuple_size<Tuple>::value;<br>
-<br>
- template <size_t I><br>
- struct tuple_element : ::std::tuple_element<I, Tuple> {};<br>
-<br>
- template <size_t I><br>
- static const typename ::std::tuple_element<I, Tuple>::type& get(<br>
- const Tuple& tuple) {<br>
- return ::std::get<I>(tuple);<br>
- }<br>
-};<br>
-template <typename... Types><br>
-const size_t TuplePolicy< ::std::tuple<Types...> >::tuple_size;<br>
-#endif // GTEST_HAS_STD_TUPLE_<br>
-<br>
-#if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_<br>
-// This helper template allows PrintTo() for tuples and<br>
-// UniversalTersePrintTupleFieldsToStrings() to be defined by<br>
-// induction on the number of tuple fields. The idea is that<br>
-// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N<br>
-// fields in tuple t, and can be defined in terms of<br>
-// TuplePrefixPrinter<N - 1>.<br>
-//<br>
-// The inductive case.<br>
-template <size_t N><br>
-struct TuplePrefixPrinter {<br>
- // Prints the first N fields of a tuple.<br>
- template <typename Tuple><br>
- static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {<br>
- TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);<br>
- GTEST_INTENTIONAL_CONST_COND_PUSH_()<br>
- if (N > 1) {<br>
- GTEST_INTENTIONAL_CONST_COND_POP_()<br>
- *os << ", ";<br>
- }<br>
- UniversalPrinter<<br>
- typename TuplePolicy<Tuple>::template tuple_element<N - 1>::type><br>
- ::Print(TuplePolicy<Tuple>::template get<N - 1>(t), os);<br>
- }<br>
-<br>
// Tersely prints the first N fields of a tuple to a string vector,<br>
// one element for each field.<br>
- template <typename Tuple><br>
- static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {<br>
- TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);<br>
- ::std::stringstream ss;<br>
- UniversalTersePrint(TuplePolicy<Tuple>::template get<N - 1>(t), &ss);<br>
- strings->push_back(ss.str());<br>
- }<br>
-};<br>
-<br>
-// Base case.<br>
-template <><br>
-struct TuplePrefixPrinter<0> {<br>
- template <typename Tuple><br>
- static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}<br>
-<br>
- template <typename Tuple><br>
- static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}<br>
-};<br>
-<br>
-// Helper function for printing a tuple.<br>
-// Tuple must be either std::tr1::tuple or std::tuple type.<br>
template <typename Tuple><br>
-void PrintTupleTo(const Tuple& t, ::std::ostream* os) {<br>
- *os << "(";<br>
- TuplePrefixPrinter<TuplePolicy<Tuple>::tuple_size>::PrintPrefixTo(t, os);<br>
- *os << ")";<br>
+void TersePrintPrefixToStrings(const Tuple&, std::integral_constant<size_t, 0>,<br>
+ Strings*) {}<br>
+template <typename Tuple, size_t I><br>
+void TersePrintPrefixToStrings(const Tuple& t,<br>
+ std::integral_constant<size_t, I>,<br>
+ Strings* strings) {<br>
+ TersePrintPrefixToStrings(t, std::integral_constant<size_t, I - 1>(),<br>
+ strings);<br>
+ ::std::stringstream ss;<br>
+ UniversalTersePrint(std::get<I - 1>(t), &ss);<br>
+ strings->push_back(ss.str());<br>
}<br>
<br>
// Prints the fields of a tuple tersely to a string vector, one<br>
@@ -1073,11 +894,11 @@ void PrintTupleTo(const Tuple& t, ::std::ostream* os) {<br>
template <typename Tuple><br>
Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {<br>
Strings result;<br>
- TuplePrefixPrinter<TuplePolicy<Tuple>::tuple_size>::<br>
- TersePrintPrefixToStrings(value, &result);<br>
+ TersePrintPrefixToStrings(<br>
+ value, std::integral_constant<size_t, std::tuple_size<Tuple>::value>(),<br>
+ &result);<br>
return result;<br>
}<br>
-#endif // GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_<br>
<br>
} // namespace internal<br>
<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/gtest-spi.h b/llvm/utils/unittest/googletest/include/gtest/gtest-spi.h<br>
index 1e8983938ea27..aa38870e8e1c9 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest-spi.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-spi.h<br>
@@ -72,14 +72,15 @@ class GTEST_API_ ScopedFakeTestPartResultReporter<br>
TestPartResultArray* result);<br>
<br>
// The d'tor restores the previous test part result reporter.<br>
- virtual ~ScopedFakeTestPartResultReporter();<br>
+ ~ScopedFakeTestPartResultReporter() override;<br>
<br>
// Appends the TestPartResult object to the TestPartResultArray<br>
// received in the constructor.<br>
//<br>
// This method is from the TestPartResultReporterInterface<br>
// interface.<br>
- virtual void ReportTestPartResult(const TestPartResult& result);<br>
+ void ReportTestPartResult(const TestPartResult& result) override;<br>
+<br>
private:<br>
void Init();<br>
<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/gtest-test-part.h b/llvm/utils/unittest/googletest/include/gtest/gtest-test-part.h<br>
index 1c7b89e08796d..05a79853586a9 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest-test-part.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-test-part.h<br>
@@ -53,22 +53,20 @@ class GTEST_API_ TestPartResult {<br>
enum Type {<br>
kSuccess, // Succeeded.<br>
kNonFatalFailure, // Failed but the test can continue.<br>
- kFatalFailure // Failed and the test should be terminated.<br>
+ kFatalFailure, // Failed and the test should be terminated.<br>
+ kSkip // Skipped.<br>
};<br>
<br>
// C'tor. TestPartResult does NOT have a default constructor.<br>
// Always use this constructor (with parameters) to create a<br>
// TestPartResult object.<br>
- TestPartResult(Type a_type,<br>
- const char* a_file_name,<br>
- int a_line_number,<br>
+ TestPartResult(Type a_type, const char* a_file_name, int a_line_number,<br>
const char* a_message)<br>
: type_(a_type),<br>
- file_name_(a_file_name == NULL ? "" : a_file_name),<br>
+ file_name_(a_file_name == nullptr ? "" : a_file_name),<br>
line_number_(a_line_number),<br>
summary_(ExtractSummary(a_message)),<br>
- message_(a_message) {<br>
- }<br>
+ message_(a_message) {}<br>
<br>
// Gets the outcome of the test part.<br>
Type type() const { return type_; }<br>
@@ -76,7 +74,7 @@ class GTEST_API_ TestPartResult {<br>
// Gets the name of the source file where the test part took place, or<br>
// NULL if it's unknown.<br>
const char* file_name() const {<br>
- return file_name_.empty() ? NULL : file_name_.c_str();<br>
+ return file_name_.empty() ? nullptr : file_name_.c_str();<br>
}<br>
<br>
// Gets the line in the source file where the test part took place,<br>
@@ -89,18 +87,21 @@ class GTEST_API_ TestPartResult {<br>
// Gets the message associated with the test part.<br>
const char* message() const { return message_.c_str(); }<br>
<br>
- // Returns true iff the test part passed.<br>
- bool passed() const { return type_ == kSuccess; }<br>
+ // Returns true if and only if the test part was skipped.<br>
+ bool skipped() const { return type_ == kSkip; }<br>
<br>
- // Returns true iff the test part failed.<br>
- bool failed() const { return type_ != kSuccess; }<br>
+ // Returns true if and only if the test part passed.<br>
+ bool passed() const { return type_ == kSuccess; }<br>
<br>
- // Returns true iff the test part non-fatally failed.<br>
+ // Returns true if and only if the test part non-fatally failed.<br>
bool nonfatally_failed() const { return type_ == kNonFatalFailure; }<br>
<br>
- // Returns true iff the test part fatally failed.<br>
+ // Returns true if and only if the test part fatally failed.<br>
bool fatally_failed() const { return type_ == kFatalFailure; }<br>
<br>
+ // Returns true if and only if the test part failed.<br>
+ bool failed() const { return fatally_failed() || nonfatally_failed(); }<br>
+<br>
private:<br>
Type type_;<br>
<br>
@@ -164,8 +165,8 @@ class GTEST_API_ HasNewFatalFailureHelper<br>
: public TestPartResultReporterInterface {<br>
public:<br>
HasNewFatalFailureHelper();<br>
- virtual ~HasNewFatalFailureHelper();<br>
- virtual void ReportTestPartResult(const TestPartResult& result);<br>
+ ~HasNewFatalFailureHelper() override;<br>
+ void ReportTestPartResult(const TestPartResult& result) override;<br>
bool has_new_fatal_failure() const { return has_new_fatal_failure_; }<br>
private:<br>
bool has_new_fatal_failure_;<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/gtest-typed-test.h b/llvm/utils/unittest/googletest/include/gtest/gtest-typed-test.h<br>
index 74bce46bdc50f..095ce058022f8 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest-typed-test.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-typed-test.h<br>
@@ -52,22 +52,22 @@ class FooTest : public testing::Test {<br>
T value_;<br>
};<br>
<br>
-// Next, associate a list of types with the test case, which will be<br>
+// Next, associate a list of types with the test suite, which will be<br>
// repeated for each type in the list. The typedef is necessary for<br>
// the macro to parse correctly.<br>
typedef testing::Types<char, int, unsigned int> MyTypes;<br>
-TYPED_TEST_CASE(FooTest, MyTypes);<br>
+TYPED_TEST_SUITE(FooTest, MyTypes);<br>
<br>
// If the type list contains only one type, you can write that type<br>
// directly without Types<...>:<br>
-// TYPED_TEST_CASE(FooTest, int);<br>
+// TYPED_TEST_SUITE(FooTest, int);<br>
<br>
// Then, use TYPED_TEST() instead of TEST_F() to define as many typed<br>
-// tests for this test case as you want.<br>
+// tests for this test suite as you want.<br>
TYPED_TEST(FooTest, DoesBlah) {<br>
- // Inside a test, refer to TypeParam to get the type parameter.<br>
- // Since we are inside a derived class template, C++ requires use to<br>
- // visit the members of FooTest via 'this'.<br>
+ // Inside a test, refer to the special name TypeParam to get the type<br>
+ // parameter. Since we are inside a derived class template, C++ requires<br>
+ // us to visit the members of FooTest via 'this'.<br>
TypeParam n = this->value_;<br>
<br>
// To visit static members of the fixture, add the TestFixture::<br>
@@ -83,7 +83,7 @@ TYPED_TEST(FooTest, DoesBlah) {<br>
<br>
TYPED_TEST(FooTest, HasPropertyA) { ... }<br>
<br>
-// TYPED_TEST_CASE takes an optional third argument which allows to specify a<br>
+// TYPED_TEST_SUITE takes an optional third argument which allows to specify a<br>
// class that generates custom test name suffixes based on the type. This should<br>
// be a class which has a static template function GetName(int index) returning<br>
// a string for each type. The provided integer index equals the index of the<br>
@@ -99,7 +99,7 @@ TYPED_TEST(FooTest, HasPropertyA) { ... }<br>
// if (std::is_same<T, unsigned int>()) return "unsignedInt";<br>
// }<br>
// };<br>
-// TYPED_TEST_CASE(FooTest, MyTypes, MyTypeNames);<br>
+// TYPED_TEST_SUITE(FooTest, MyTypes, MyTypeNames);<br>
<br>
#endif // 0<br>
<br>
@@ -126,13 +126,13 @@ class FooTest : public testing::Test {<br>
...<br>
};<br>
<br>
-// Next, declare that you will define a type-parameterized test case<br>
+// Next, declare that you will define a type-parameterized test suite<br>
// (the _P suffix is for "parameterized" or "pattern", whichever you<br>
// prefer):<br>
-TYPED_TEST_CASE_P(FooTest);<br>
+TYPED_TEST_SUITE_P(FooTest);<br>
<br>
// Then, use TYPED_TEST_P() to define as many type-parameterized tests<br>
-// for this type-parameterized test case as you want.<br>
+// for this type-parameterized test suite as you want.<br>
TYPED_TEST_P(FooTest, DoesBlah) {<br>
// Inside a test, refer to TypeParam to get the type parameter.<br>
TypeParam n = 0;<br>
@@ -143,10 +143,10 @@ TYPED_TEST_P(FooTest, HasPropertyA) { ... }<br>
<br>
// Now the tricky part: you need to register all test patterns before<br>
// you can instantiate them. The first argument of the macro is the<br>
-// test case name; the rest are the names of the tests in this test<br>
+// test suite name; the rest are the names of the tests in this test<br>
// case.<br>
-REGISTER_TYPED_TEST_CASE_P(FooTest,<br>
- DoesBlah, HasPropertyA);<br>
+REGISTER_TYPED_TEST_SUITE_P(FooTest,<br>
+ DoesBlah, HasPropertyA);<br>
<br>
// Finally, you are free to instantiate the pattern with the types you<br>
// want. If you put the above code in a header file, you can #include<br>
@@ -154,19 +154,19 @@ REGISTER_TYPED_TEST_CASE_P(FooTest,<br>
//<br>
// To distinguish <br>
diff erent instances of the pattern, the first<br>
// argument to the INSTANTIATE_* macro is a prefix that will be added<br>
-// to the actual test case name. Remember to pick unique prefixes for<br>
+// to the actual test suite name. Remember to pick unique prefixes for<br>
// <br>
diff erent instances.<br>
typedef testing::Types<char, int, unsigned int> MyTypes;<br>
-INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);<br>
+INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);<br>
<br>
// If the type list contains only one type, you can write that type<br>
// directly without Types<...>:<br>
-// INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);<br>
+// INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, int);<br>
//<br>
-// Similar to the optional argument of TYPED_TEST_CASE above,<br>
-// INSTANTIATE_TEST_CASE_P takes an optional fourth argument which allows to<br>
+// Similar to the optional argument of TYPED_TEST_SUITE above,<br>
+// INSTANTIATE_TEST_SUITE_P takes an optional fourth argument which allows to<br>
// generate custom names.<br>
-// INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes, MyTypeNames);<br>
+// INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes, MyTypeNames);<br>
<br>
#endif // 0<br>
<br>
@@ -180,21 +180,18 @@ INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);<br>
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
//<br>
// Expands to the name of the typedef for the type parameters of the<br>
-// given test case.<br>
-# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_<br>
+// given test suite.<br>
+#define GTEST_TYPE_PARAMS_(TestSuiteName) gtest_type_params_##TestSuiteName##_<br>
<br>
// Expands to the name of the typedef for the NameGenerator, responsible for<br>
// creating the suffixes of the name.<br>
-#define GTEST_NAME_GENERATOR_(TestCaseName) \<br>
- gtest_type_params_##TestCaseName##_NameGenerator<br>
-<br>
-// The 'Types' template argument below must have spaces around it<br>
-// since some compilers may choke on '>>' when passing a template<br>
-// instance (e.g. Types<int>)<br>
-# define TYPED_TEST_CASE(CaseName, Types, ...) \<br>
- typedef ::testing::internal::TypeList< Types >::type GTEST_TYPE_PARAMS_( \<br>
- CaseName); \<br>
- typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \<br>
+#define GTEST_NAME_GENERATOR_(TestSuiteName) \<br>
+ gtest_type_params_##TestSuiteName##_NameGenerator<br>
+<br>
+#define TYPED_TEST_SUITE(CaseName, Types, ...) \<br>
+ typedef ::testing::internal::TypeList<Types>::type GTEST_TYPE_PARAMS_( \<br>
+ CaseName); \<br>
+ typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \<br>
GTEST_NAME_GENERATOR_(CaseName)<br>
<br>
# define TYPED_TEST(CaseName, TestName) \<br>
@@ -224,6 +221,13 @@ INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);<br>
void GTEST_TEST_CLASS_NAME_(CaseName, \<br>
TestName)<gtest_TypeParam_>::TestBody()<br>
<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+#define TYPED_TEST_CASE \<br>
+ static_assert(::testing::internal::TypedTestCaseIsDeprecated(), ""); \<br>
+ TYPED_TEST_SUITE<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
#endif // GTEST_HAS_TYPED_TEST<br>
<br>
// Implements type-parameterized tests.<br>
@@ -233,73 +237,93 @@ INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);<br>
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
//<br>
// Expands to the namespace name that the type-parameterized tests for<br>
-// the given type-parameterized test case are defined in. The exact<br>
+// the given type-parameterized test suite are defined in. The exact<br>
// name of the namespace is subject to change without notice.<br>
-# define GTEST_CASE_NAMESPACE_(TestCaseName) \<br>
- gtest_case_##TestCaseName##_<br>
+#define GTEST_SUITE_NAMESPACE_(TestSuiteName) gtest_suite_##TestSuiteName##_<br>
<br>
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
//<br>
// Expands to the name of the variable used to remember the names of<br>
-// the defined tests in the given test case.<br>
-# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \<br>
- gtest_typed_test_case_p_state_##TestCaseName##_<br>
+// the defined tests in the given test suite.<br>
+#define GTEST_TYPED_TEST_SUITE_P_STATE_(TestSuiteName) \<br>
+ gtest_typed_test_suite_p_state_##TestSuiteName##_<br>
<br>
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.<br>
//<br>
// Expands to the name of the variable used to remember the names of<br>
-// the registered tests in the given test case.<br>
-# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \<br>
- gtest_registered_test_names_##TestCaseName##_<br>
+// the registered tests in the given test suite.<br>
+#define GTEST_REGISTERED_TEST_NAMES_(TestSuiteName) \<br>
+ gtest_registered_test_names_##TestSuiteName##_<br>
<br>
// The variables defined in the type-parameterized test macros are<br>
// static as typically these macros are used in a .h file that can be<br>
// #included in multiple translation units linked together.<br>
-# define TYPED_TEST_CASE_P(CaseName) \<br>
- static ::testing::internal::TypedTestCasePState \<br>
- GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)<br>
-<br>
-# define TYPED_TEST_P(CaseName, TestName) \<br>
- namespace GTEST_CASE_NAMESPACE_(CaseName) { \<br>
- template <typename gtest_TypeParam_> \<br>
- class TestName : public CaseName<gtest_TypeParam_> { \<br>
- private: \<br>
- typedef CaseName<gtest_TypeParam_> TestFixture; \<br>
- typedef gtest_TypeParam_ TypeParam; \<br>
- virtual void TestBody(); \<br>
- }; \<br>
- static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \<br>
- GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\<br>
- __FILE__, __LINE__, #CaseName, #TestName); \<br>
- } \<br>
- template <typename gtest_TypeParam_> \<br>
- void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()<br>
-<br>
-# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \<br>
- namespace GTEST_CASE_NAMESPACE_(CaseName) { \<br>
- typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \<br>
- } \<br>
- static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) \<br>
- GTEST_ATTRIBUTE_UNUSED_ = \<br>
- GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames( \<br>
- __FILE__, __LINE__, #__VA_ARGS__)<br>
-<br>
-// The 'Types' template argument below must have spaces around it<br>
-// since some compilers may choke on '>>' when passing a template<br>
-// instance (e.g. Types<int>)<br>
-# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types, ...) \<br>
- static bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \<br>
- ::testing::internal::TypeParameterizedTestCase< \<br>
- CaseName, GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \<br>
- ::testing::internal::TypeList< Types >::type>:: \<br>
- Register(#Prefix, \<br>
- ::testing::internal::CodeLocation(__FILE__, __LINE__), \<br>
- >EST_TYPED_TEST_CASE_P_STATE_(CaseName), #CaseName, \<br>
- GTEST_REGISTERED_TEST_NAMES_(CaseName), \<br>
- ::testing::internal::GenerateNames< \<br>
- ::testing::internal::NameGeneratorSelector< \<br>
- __VA_ARGS__>::type, \<br>
- ::testing::internal::TypeList< Types >::type>())<br>
+#define TYPED_TEST_SUITE_P(SuiteName) \<br>
+ static ::testing::internal::TypedTestSuitePState \<br>
+ GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName)<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+#define TYPED_TEST_CASE_P \<br>
+ static_assert(::testing::internal::TypedTestCase_P_IsDeprecated(), ""); \<br>
+ TYPED_TEST_SUITE_P<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
+#define TYPED_TEST_P(SuiteName, TestName) \<br>
+ namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \<br>
+ template <typename gtest_TypeParam_> \<br>
+ class TestName : public SuiteName<gtest_TypeParam_> { \<br>
+ private: \<br>
+ typedef SuiteName<gtest_TypeParam_> TestFixture; \<br>
+ typedef gtest_TypeParam_ TypeParam; \<br>
+ virtual void TestBody(); \<br>
+ }; \<br>
+ static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \<br>
+ GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName( \<br>
+ __FILE__, __LINE__, #SuiteName, #TestName); \<br>
+ } \<br>
+ template <typename gtest_TypeParam_> \<br>
+ void GTEST_SUITE_NAMESPACE_( \<br>
+ SuiteName)::TestName<gtest_TypeParam_>::TestBody()<br>
+<br>
+#define REGISTER_TYPED_TEST_SUITE_P(SuiteName, ...) \<br>
+ namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \<br>
+ typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \<br>
+ } \<br>
+ static const char* const GTEST_REGISTERED_TEST_NAMES_( \<br>
+ SuiteName) GTEST_ATTRIBUTE_UNUSED_ = \<br>
+ GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).VerifyRegisteredTestNames( \<br>
+ __FILE__, __LINE__, #__VA_ARGS__)<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+#define REGISTER_TYPED_TEST_CASE_P \<br>
+ static_assert(::testing::internal::RegisterTypedTestCase_P_IsDeprecated(), \<br>
+ ""); \<br>
+ REGISTER_TYPED_TEST_SUITE_P<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
+#define INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, SuiteName, Types, ...) \<br>
+ static bool gtest_##Prefix##_##SuiteName GTEST_ATTRIBUTE_UNUSED_ = \<br>
+ ::testing::internal::TypeParameterizedTestSuite< \<br>
+ SuiteName, GTEST_SUITE_NAMESPACE_(SuiteName)::gtest_AllTests_, \<br>
+ ::testing::internal::TypeList<Types>::type>:: \<br>
+ Register(#Prefix, \<br>
+ ::testing::internal::CodeLocation(__FILE__, __LINE__), \<br>
+ >EST_TYPED_TEST_SUITE_P_STATE_(SuiteName), #SuiteName, \<br>
+ GTEST_REGISTERED_TEST_NAMES_(SuiteName), \<br>
+ ::testing::internal::GenerateNames< \<br>
+ ::testing::internal::NameGeneratorSelector< \<br>
+ __VA_ARGS__>::type, \<br>
+ ::testing::internal::TypeList<Types>::type>())<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+#define INSTANTIATE_TYPED_TEST_CASE_P \<br>
+ static_assert( \<br>
+ ::testing::internal::InstantiateTypedTestCase_P_IsDeprecated(), ""); \<br>
+ INSTANTIATE_TYPED_TEST_SUITE_P<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
#endif // GTEST_HAS_TYPED_TEST_P<br>
<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/gtest.h b/llvm/utils/unittest/googletest/include/gtest/gtest.h<br>
index 5df4b0a3a7127..dbe5b1c2c3f64 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest.h<br>
@@ -52,13 +52,17 @@<br>
#ifndef GTEST_INCLUDE_GTEST_GTEST_H_<br>
#define GTEST_INCLUDE_GTEST_GTEST_H_<br>
<br>
+#include <cstddef><br>
#include <limits><br>
+#include <memory><br>
#include <ostream><br>
+#include <type_traits><br>
#include <vector><br>
<br>
#include "gtest/internal/gtest-internal.h"<br>
#include "gtest/internal/gtest-string.h"<br>
#include "gtest/gtest-death-test.h"<br>
+#include "gtest/gtest-matchers.h"<br>
#include "gtest/gtest-message.h"<br>
#include "gtest/gtest-param-test.h"<br>
#include "gtest/gtest-printers.h"<br>
@@ -69,21 +73,6 @@<br>
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \<br>
/* class A needs to have dll-interface to be used by clients of class B */)<br>
<br>
-// Depending on the platform, <br>
diff erent string classes are available.<br>
-// On Linux, in addition to ::std::string, Google also makes use of<br>
-// class ::string, which has the same interface as ::std::string, but<br>
-// has a <br>
diff erent implementation.<br>
-//<br>
-// You can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that<br>
-// ::string is available AND is a distinct type to ::std::string, or<br>
-// define it to 0 to indicate otherwise.<br>
-//<br>
-// If ::std::string and ::string are the same class on your platform<br>
-// due to aliasing, you should define GTEST_HAS_GLOBAL_STRING to 0.<br>
-//<br>
-// If you do not define GTEST_HAS_GLOBAL_STRING, it is defined<br>
-// heuristically.<br>
-<br>
namespace testing {<br>
<br>
// Silence C4100 (unreferenced formal parameter) and 4805<br>
@@ -195,7 +184,12 @@ void ReportFailureInUnknownLocation(TestPartResult::Type result_type,<br>
// If we don't forward declare them the compiler might confuse the classes<br>
// in friendship clauses with same named classes on the scope.<br>
class Test;<br>
-class TestCase;<br>
+class TestSuite;<br>
+<br>
+// Old API is still available but deprecated<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+using TestCase = TestSuite;<br>
+#endif<br>
class TestInfo;<br>
class UnitTest;<br>
<br>
@@ -298,9 +292,10 @@ class GTEST_API_ AssertionResult {<br>
template <typename T><br>
explicit AssertionResult(<br>
const T& success,<br>
- typename internal::EnableIf<<br>
- !internal::ImplicitlyConvertible<T, AssertionResult>::value>::type*<br>
- /*enabler*/ = NULL)<br>
+ typename std::enable_if<<br>
+ !std::is_convertible<T, AssertionResult>::value>::type*<br>
+ /*enabler*/<br>
+ = nullptr)<br>
: success_(success) {}<br>
<br>
#if defined(_MSC_VER) && _MSC_VER < 1910<br>
@@ -313,7 +308,7 @@ class GTEST_API_ AssertionResult {<br>
return *this;<br>
}<br>
<br>
- // Returns true iff the assertion succeeded.<br>
+ // Returns true if and only if the assertion succeeded.<br>
operator bool() const { return success_; } // NOLINT<br>
<br>
// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.<br>
@@ -324,9 +319,8 @@ class GTEST_API_ AssertionResult {<br>
// assertion's expectation). When nothing has been streamed into the<br>
// object, returns an empty string.<br>
const char* message() const {<br>
- return message_.get() != NULL ? message_->c_str() : "";<br>
+ return message_.get() != nullptr ? message_->c_str() : "";<br>
}<br>
- // FIXME: Remove this after making sure no clients use it.<br>
// Deprecated; please use message() instead.<br>
const char* failure_message() const { return message(); }<br>
<br>
@@ -347,8 +341,7 @@ class GTEST_API_ AssertionResult {<br>
private:<br>
// Appends the contents of message to message_.<br>
void AppendMessage(const Message& a_message) {<br>
- if (message_.get() == NULL)<br>
- message_.reset(new ::std::string);<br>
+ if (message_.get() == nullptr) message_.reset(new ::std::string);<br>
message_->append(a_message.GetString().c_str());<br>
}<br>
<br>
@@ -361,7 +354,7 @@ class GTEST_API_ AssertionResult {<br>
// construct is not satisfied with the predicate's outcome.<br>
// Referenced via a pointer to avoid taking too much stack frame space<br>
// with test assertions.<br>
- internal::scoped_ptr< ::std::string> message_;<br>
+ std::unique_ptr< ::std::string> message_;<br>
};<br>
<br>
// Makes a successful assertion result.<br>
@@ -385,8 +378,8 @@ namespace testing {<br>
<br>
// The abstract class that all tests inherit from.<br>
//<br>
-// In Google Test, a unit test program contains one or many TestCases, and<br>
-// each TestCase contains one or many Tests.<br>
+// In Google Test, a unit test program contains one or many TestSuites, and<br>
+// each TestSuite contains one or many Tests.<br>
//<br>
// When you define a test using the TEST macro, you don't need to<br>
// explicitly derive from Test - the TEST macro automatically does<br>
@@ -410,49 +403,57 @@ class GTEST_API_ Test {<br>
public:<br>
friend class TestInfo;<br>
<br>
- // Defines types for pointers to functions that set up and tear down<br>
- // a test case.<br>
- typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;<br>
- typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;<br>
-<br>
// The d'tor is virtual as we intend to inherit from Test.<br>
virtual ~Test();<br>
<br>
// Sets up the stuff shared by all tests in this test case.<br>
//<br>
- // Google Test will call Foo::SetUpTestCase() before running the first<br>
+ // Google Test will call Foo::SetUpTestSuite() before running the first<br>
// test in test case Foo. Hence a sub-class can define its own<br>
- // SetUpTestCase() method to shadow the one defined in the super<br>
+ // SetUpTestSuite() method to shadow the one defined in the super<br>
// class.<br>
- static void SetUpTestCase() {}<br>
+ // Failures that happen during SetUpTestSuite are logged but otherwise<br>
+ // ignored.<br>
+ static void SetUpTestSuite() {}<br>
<br>
- // Tears down the stuff shared by all tests in this test case.<br>
+ // Tears down the stuff shared by all tests in this test suite.<br>
//<br>
- // Google Test will call Foo::TearDownTestCase() after running the last<br>
+ // Google Test will call Foo::TearDownTestSuite() after running the last<br>
// test in test case Foo. Hence a sub-class can define its own<br>
- // TearDownTestCase() method to shadow the one defined in the super<br>
+ // TearDownTestSuite() method to shadow the one defined in the super<br>
// class.<br>
+ // Failures that happen during TearDownTestSuite are logged but otherwise<br>
+ // ignored.<br>
+ static void TearDownTestSuite() {}<br>
+<br>
+ // Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
static void TearDownTestCase() {}<br>
+ static void SetUpTestCase() {}<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
- // Returns true iff the current test has a fatal failure.<br>
+ // Returns true if and only if the current test has a fatal failure.<br>
static bool HasFatalFailure();<br>
<br>
- // Returns true iff the current test has a non-fatal failure.<br>
+ // Returns true if and only if the current test has a non-fatal failure.<br>
static bool HasNonfatalFailure();<br>
<br>
- // Returns true iff the current test has a (either fatal or<br>
+ // Returns true if and only if the current test was skipped.<br>
+ static bool IsSkipped();<br>
+<br>
+ // Returns true if and only if the current test has a (either fatal or<br>
// non-fatal) failure.<br>
static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }<br>
<br>
- // Logs a property for the current test, test case, or for the entire<br>
+ // Logs a property for the current test, test suite, or for the entire<br>
// invocation of the test program when used outside of the context of a<br>
- // test case. Only the last value for a given key is remembered. These<br>
+ // test suite. Only the last value for a given key is remembered. These<br>
// are public static so they can be called from utility functions that are<br>
// not members of the test fixture. Calls to RecordProperty made during<br>
// lifespan of the test (from the moment its constructor starts to the<br>
// moment its destructor finishes) will be output in XML as attributes of<br>
// the <testcase> element. Properties recorded from fixture's<br>
- // SetUpTestCase or TearDownTestCase are logged as attributes of the<br>
+ // SetUpTestSuite or TearDownTestSuite are logged as attributes of the<br>
// corresponding <testsuite> element. Calls to RecordProperty made in the<br>
// global context (before or after invocation of RUN_ALL_TESTS and from<br>
// SetUp/TearDown method of Environment objects registered with Google<br>
@@ -471,8 +472,8 @@ class GTEST_API_ Test {<br>
virtual void TearDown();<br>
<br>
private:<br>
- // Returns true iff the current test has the same fixture class as<br>
- // the first test in the current test case.<br>
+ // Returns true if and only if the current test has the same fixture class<br>
+ // as the first test in the current test suite.<br>
static bool HasSameFixtureClass();<br>
<br>
// Runs the test after the test fixture has been set up.<br>
@@ -490,7 +491,7 @@ class GTEST_API_ Test {<br>
// internal method to avoid clashing with names used in user TESTs.<br>
void DeleteSelf_() { delete this; }<br>
<br>
- const internal::scoped_ptr< GTEST_FLAG_SAVER_ > gtest_flag_saver_;<br>
+ const std::unique_ptr<GTEST_FLAG_SAVER_> gtest_flag_saver_;<br>
<br>
// Often a user misspells SetUp() as Setup() and spends a long time<br>
// wondering why it is never called by Google Test. The declaration of<br>
@@ -509,7 +510,7 @@ class GTEST_API_ Test {<br>
// If you see an error about overriding the following function or<br>
// about it being private, you have mis-spelled SetUp() as Setup().<br>
struct Setup_should_be_spelled_SetUp {};<br>
- virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }<br>
+ virtual Setup_should_be_spelled_SetUp* Setup() { return nullptr; }<br>
<br>
// We disallow copying Tests.<br>
GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);<br>
@@ -573,21 +574,28 @@ class GTEST_API_ TestResult {<br>
// Returns the number of the test properties.<br>
int test_property_count() const;<br>
<br>
- // Returns true iff the test passed (i.e. no test part failed).<br>
- bool Passed() const { return !Failed(); }<br>
+ // Returns true if and only if the test passed (i.e. no test part failed).<br>
+ bool Passed() const { return !Skipped() && !Failed(); }<br>
+<br>
+ // Returns true if and only if the test was skipped.<br>
+ bool Skipped() const;<br>
<br>
- // Returns true iff the test failed.<br>
+ // Returns true if and only if the test failed.<br>
bool Failed() const;<br>
<br>
- // Returns true iff the test fatally failed.<br>
+ // Returns true if and only if the test fatally failed.<br>
bool HasFatalFailure() const;<br>
<br>
- // Returns true iff the test has a non-fatal failure.<br>
+ // Returns true if and only if the test has a non-fatal failure.<br>
bool HasNonfatalFailure() const;<br>
<br>
// Returns the elapsed time, in milliseconds.<br>
TimeInMillis elapsed_time() const { return elapsed_time_; }<br>
<br>
+ // Gets the time of the test case start, in ms from the start of the<br>
+ // UNIX epoch.<br>
+ TimeInMillis start_timestamp() const { return start_timestamp_; }<br>
+<br>
// Returns the i-th test part result among all the results. i can range from 0<br>
// to total_part_count() - 1. If i is not in that range, aborts the program.<br>
const TestPartResult& GetTestPartResult(int i) const;<br>
@@ -599,7 +607,7 @@ class GTEST_API_ TestResult {<br>
<br>
private:<br>
friend class TestInfo;<br>
- friend class TestCase;<br>
+ friend class TestSuite;<br>
friend class UnitTest;<br>
friend class internal::DefaultGlobalTestPartResultReporter;<br>
friend class internal::ExecDeathTest;<br>
@@ -618,6 +626,9 @@ class GTEST_API_ TestResult {<br>
return test_properties_;<br>
}<br>
<br>
+ // Sets the start time.<br>
+ void set_start_timestamp(TimeInMillis start) { start_timestamp_ = start; }<br>
+<br>
// Sets the elapsed time.<br>
void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }<br>
<br>
@@ -631,7 +642,7 @@ class GTEST_API_ TestResult {<br>
const TestProperty& test_property);<br>
<br>
// Adds a failure if the key is a reserved attribute of Google Test<br>
- // testcase tags. Returns true if the property is valid.<br>
+ // testsuite tags. Returns true if the property is valid.<br>
// FIXME: Validate attribute names are legal and human readable.<br>
static bool ValidateTestProperty(const std::string& xml_element,<br>
const TestProperty& test_property);<br>
@@ -661,6 +672,8 @@ class GTEST_API_ TestResult {<br>
std::vector<TestProperty> test_properties_;<br>
// Running count of death tests.<br>
int death_test_count_;<br>
+ // The start time, in milliseconds since UNIX Epoch.<br>
+ TimeInMillis start_timestamp_;<br>
// The elapsed time, in milliseconds.<br>
TimeInMillis elapsed_time_;<br>
<br>
@@ -670,7 +683,7 @@ class GTEST_API_ TestResult {<br>
<br>
// A TestInfo object stores the following information about a test:<br>
//<br>
-// Test case name<br>
+// Test suite name<br>
// Test name<br>
// Whether the test should be run<br>
// A function pointer that creates the test object when invoked<br>
@@ -685,8 +698,13 @@ class GTEST_API_ TestInfo {<br>
// don't inherit from TestInfo.<br>
~TestInfo();<br>
<br>
- // Returns the test case name.<br>
- const char* test_case_name() const { return test_case_name_.c_str(); }<br>
+ // Returns the test suite name.<br>
+ const char* test_suite_name() const { return test_suite_name_.c_str(); }<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ const char* test_case_name() const { return test_suite_name(); }<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
// Returns the test name.<br>
const char* name() const { return name_.c_str(); }<br>
@@ -694,17 +712,15 @@ class GTEST_API_ TestInfo {<br>
// Returns the name of the parameter type, or NULL if this is not a typed<br>
// or a type-parameterized test.<br>
const char* type_param() const {<br>
- if (type_param_.get() != NULL)<br>
- return type_param_->c_str();<br>
- return NULL;<br>
+ if (type_param_.get() != nullptr) return type_param_->c_str();<br>
+ return nullptr;<br>
}<br>
<br>
// Returns the text representation of the value parameter, or NULL if this<br>
// is not a value-parameterized test.<br>
const char* value_param() const {<br>
- if (value_param_.get() != NULL)<br>
- return value_param_->c_str();<br>
- return NULL;<br>
+ if (value_param_.get() != nullptr) return value_param_->c_str();<br>
+ return nullptr;<br>
}<br>
<br>
// Returns the file name where this test is defined.<br>
@@ -721,7 +737,7 @@ class GTEST_API_ TestInfo {<br>
// been specified) and its full name matches the user-specified filter.<br>
//<br>
// Google Test allows the user to filter the tests by their full names.<br>
- // The full name of a test Bar in test case Foo is defined as<br>
+ // The full name of a test Bar in test suite Foo is defined as<br>
// "Foo.Bar". Only the tests that match the filter will run.<br>
//<br>
// A filter is a colon-separated list of glob (not regex) patterns,<br>
@@ -734,7 +750,7 @@ class GTEST_API_ TestInfo {<br>
// contains the character 'A' or starts with "Foo.".<br>
bool should_run() const { return should_run_; }<br>
<br>
- // Returns true iff this test will appear in the XML report.<br>
+ // Returns true if and only if this test will appear in the XML report.<br>
bool is_reportable() const {<br>
// The XML report includes tests matching the filter, excluding those<br>
// run in other shards.<br>
@@ -749,24 +765,19 @@ class GTEST_API_ TestInfo {<br>
friend class internal::DefaultDeathTestFactory;<br>
#endif // GTEST_HAS_DEATH_TEST<br>
friend class Test;<br>
- friend class TestCase;<br>
+ friend class TestSuite;<br>
friend class internal::UnitTestImpl;<br>
friend class internal::StreamingListenerTest;<br>
friend TestInfo* internal::MakeAndRegisterTestInfo(<br>
- const char* test_case_name,<br>
- const char* name,<br>
- const char* type_param,<br>
- const char* value_param,<br>
- internal::CodeLocation code_location,<br>
- internal::TypeId fixture_class_id,<br>
- Test::SetUpTestCaseFunc set_up_tc,<br>
- Test::TearDownTestCaseFunc tear_down_tc,<br>
+ const char* test_suite_name, const char* name, const char* type_param,<br>
+ const char* value_param, internal::CodeLocation code_location,<br>
+ internal::TypeId fixture_class_id, internal::SetUpTestSuiteFunc set_up_tc,<br>
+ internal::TearDownTestSuiteFunc tear_down_tc,<br>
internal::TestFactoryBase* factory);<br>
<br>
// Constructs a TestInfo object. The newly constructed instance assumes<br>
// ownership of the factory object.<br>
- TestInfo(const std::string& test_case_name,<br>
- const std::string& name,<br>
+ TestInfo(const std::string& test_suite_name, const std::string& name,<br>
const char* a_type_param, // NULL if not a type-parameterized test<br>
const char* a_value_param, // NULL if not a value-parameterized test<br>
internal::CodeLocation a_code_location,<br>
@@ -788,21 +799,21 @@ class GTEST_API_ TestInfo {<br>
}<br>
<br>
// These fields are immutable properties of the test.<br>
- const std::string test_case_name_; // Test case name<br>
+ const std::string test_suite_name_; // test suite name<br>
const std::string name_; // Test name<br>
// Name of the parameter type, or NULL if this is not a typed or a<br>
// type-parameterized test.<br>
- const internal::scoped_ptr<const ::std::string> type_param_;<br>
+ const std::unique_ptr<const ::std::string> type_param_;<br>
// Text representation of the value parameter, or NULL if this is not a<br>
// value-parameterized test.<br>
- const internal::scoped_ptr<const ::std::string> value_param_;<br>
+ const std::unique_ptr<const ::std::string> value_param_;<br>
internal::CodeLocation location_;<br>
- const internal::TypeId fixture_class_id_; // ID of the test fixture class<br>
- bool should_run_; // True iff this test should run<br>
- bool is_disabled_; // True iff this test is disabled<br>
- bool matches_filter_; // True if this test matches the<br>
- // user-specified filter.<br>
- bool is_in_another_shard_; // Will be run in another shard.<br>
+ const internal::TypeId fixture_class_id_; // ID of the test fixture class<br>
+ bool should_run_; // True if and only if this test should run<br>
+ bool is_disabled_; // True if and only if this test is disabled<br>
+ bool matches_filter_; // True if this test matches the<br>
+ // user-specified filter.<br>
+ bool is_in_another_shard_; // Will be run in another shard.<br>
internal::TestFactoryBase* const factory_; // The factory that creates<br>
// the test object<br>
<br>
@@ -813,90 +824,96 @@ class GTEST_API_ TestInfo {<br>
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);<br>
};<br>
<br>
-// A test case, which consists of a vector of TestInfos.<br>
+// A test suite, which consists of a vector of TestInfos.<br>
//<br>
-// TestCase is not copyable.<br>
-class GTEST_API_ TestCase {<br>
+// TestSuite is not copyable.<br>
+class GTEST_API_ TestSuite {<br>
public:<br>
- // Creates a TestCase with the given name.<br>
+ // Creates a TestSuite with the given name.<br>
//<br>
- // TestCase does NOT have a default constructor. Always use this<br>
- // constructor to create a TestCase object.<br>
+ // TestSuite does NOT have a default constructor. Always use this<br>
+ // constructor to create a TestSuite object.<br>
//<br>
// Arguments:<br>
//<br>
- // name: name of the test case<br>
+ // name: name of the test suite<br>
// a_type_param: the name of the test's type parameter, or NULL if<br>
// this is not a type-parameterized test.<br>
- // set_up_tc: pointer to the function that sets up the test case<br>
- // tear_down_tc: pointer to the function that tears down the test case<br>
- TestCase(const char* name, const char* a_type_param,<br>
- Test::SetUpTestCaseFunc set_up_tc,<br>
- Test::TearDownTestCaseFunc tear_down_tc);<br>
+ // set_up_tc: pointer to the function that sets up the test suite<br>
+ // tear_down_tc: pointer to the function that tears down the test suite<br>
+ TestSuite(const char* name, const char* a_type_param,<br>
+ internal::SetUpTestSuiteFunc set_up_tc,<br>
+ internal::TearDownTestSuiteFunc tear_down_tc);<br>
<br>
- // Destructor of TestCase.<br>
- virtual ~TestCase();<br>
+ // Destructor of TestSuite.<br>
+ virtual ~TestSuite();<br>
<br>
- // Gets the name of the TestCase.<br>
+ // Gets the name of the TestSuite.<br>
const char* name() const { return name_.c_str(); }<br>
<br>
// Returns the name of the parameter type, or NULL if this is not a<br>
- // type-parameterized test case.<br>
+ // type-parameterized test suite.<br>
const char* type_param() const {<br>
- if (type_param_.get() != NULL)<br>
- return type_param_->c_str();<br>
- return NULL;<br>
+ if (type_param_.get() != nullptr) return type_param_->c_str();<br>
+ return nullptr;<br>
}<br>
<br>
- // Returns true if any test in this test case should run.<br>
+ // Returns true if any test in this test suite should run.<br>
bool should_run() const { return should_run_; }<br>
<br>
- // Gets the number of successful tests in this test case.<br>
+ // Gets the number of successful tests in this test suite.<br>
int successful_test_count() const;<br>
<br>
- // Gets the number of failed tests in this test case.<br>
+ // Gets the number of skipped tests in this test suite.<br>
+ int skipped_test_count() const;<br>
+<br>
+ // Gets the number of failed tests in this test suite.<br>
int failed_test_count() const;<br>
<br>
// Gets the number of disabled tests that will be reported in the XML report.<br>
int reportable_disabled_test_count() const;<br>
<br>
- // Gets the number of disabled tests in this test case.<br>
+ // Gets the number of disabled tests in this test suite.<br>
int disabled_test_count() const;<br>
<br>
// Gets the number of tests to be printed in the XML report.<br>
int reportable_test_count() const;<br>
<br>
- // Get the number of tests in this test case that should run.<br>
+ // Get the number of tests in this test suite that should run.<br>
int test_to_run_count() const;<br>
<br>
- // Gets the number of all tests in this test case.<br>
+ // Gets the number of all tests in this test suite.<br>
int total_test_count() const;<br>
<br>
- // Returns true iff the test case passed.<br>
+ // Returns true if and only if the test suite passed.<br>
bool Passed() const { return !Failed(); }<br>
<br>
- // Returns true iff the test case failed.<br>
+ // Returns true if and only if the test suite failed.<br>
bool Failed() const { return failed_test_count() > 0; }<br>
<br>
// Returns the elapsed time, in milliseconds.<br>
TimeInMillis elapsed_time() const { return elapsed_time_; }<br>
<br>
+ // Gets the time of the test suite start, in ms from the start of the<br>
+ // UNIX epoch.<br>
+ TimeInMillis start_timestamp() const { return start_timestamp_; }<br>
+<br>
// Returns the i-th test among all the tests. i can range from 0 to<br>
// total_test_count() - 1. If i is not in that range, returns NULL.<br>
const TestInfo* GetTestInfo(int i) const;<br>
<br>
// Returns the TestResult that holds test properties recorded during<br>
- // execution of SetUpTestCase and TearDownTestCase.<br>
+ // execution of SetUpTestSuite and TearDownTestSuite.<br>
const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }<br>
<br>
private:<br>
friend class Test;<br>
friend class internal::UnitTestImpl;<br>
<br>
- // Gets the (mutable) vector of TestInfos in this TestCase.<br>
+ // Gets the (mutable) vector of TestInfos in this TestSuite.<br>
std::vector<TestInfo*>& test_info_list() { return test_info_list_; }<br>
<br>
- // Gets the (immutable) vector of TestInfos in this TestCase.<br>
+ // Gets the (immutable) vector of TestInfos in this TestSuite.<br>
const std::vector<TestInfo*>& test_info_list() const {<br>
return test_info_list_;<br>
}<br>
@@ -908,51 +925,64 @@ class GTEST_API_ TestCase {<br>
// Sets the should_run member.<br>
void set_should_run(bool should) { should_run_ = should; }<br>
<br>
- // Adds a TestInfo to this test case. Will delete the TestInfo upon<br>
- // destruction of the TestCase object.<br>
+ // Adds a TestInfo to this test suite. Will delete the TestInfo upon<br>
+ // destruction of the TestSuite object.<br>
void AddTestInfo(TestInfo * test_info);<br>
<br>
- // Clears the results of all tests in this test case.<br>
+ // Clears the results of all tests in this test suite.<br>
void ClearResult();<br>
<br>
- // Clears the results of all tests in the given test case.<br>
- static void ClearTestCaseResult(TestCase* test_case) {<br>
- test_case->ClearResult();<br>
+ // Clears the results of all tests in the given test suite.<br>
+ static void ClearTestSuiteResult(TestSuite* test_suite) {<br>
+ test_suite->ClearResult();<br>
}<br>
<br>
- // Runs every test in this TestCase.<br>
+ // Runs every test in this TestSuite.<br>
void Run();<br>
<br>
- // Runs SetUpTestCase() for this TestCase. This wrapper is needed<br>
- // for catching exceptions thrown from SetUpTestCase().<br>
- void RunSetUpTestCase() { (*set_up_tc_)(); }<br>
+ // Runs SetUpTestSuite() for this TestSuite. This wrapper is needed<br>
+ // for catching exceptions thrown from SetUpTestSuite().<br>
+ void RunSetUpTestSuite() {<br>
+ if (set_up_tc_ != nullptr) {<br>
+ (*set_up_tc_)();<br>
+ }<br>
+ }<br>
<br>
- // Runs TearDownTestCase() for this TestCase. This wrapper is<br>
- // needed for catching exceptions thrown from TearDownTestCase().<br>
- void RunTearDownTestCase() { (*tear_down_tc_)(); }<br>
+ // Runs TearDownTestSuite() for this TestSuite. This wrapper is<br>
+ // needed for catching exceptions thrown from TearDownTestSuite().<br>
+ void RunTearDownTestSuite() {<br>
+ if (tear_down_tc_ != nullptr) {<br>
+ (*tear_down_tc_)();<br>
+ }<br>
+ }<br>
<br>
- // Returns true iff test passed.<br>
+ // Returns true if and only if test passed.<br>
static bool TestPassed(const TestInfo* test_info) {<br>
return test_info->should_run() && test_info->result()->Passed();<br>
}<br>
<br>
- // Returns true iff test failed.<br>
+ // Returns true if and only if test skipped.<br>
+ static bool TestSkipped(const TestInfo* test_info) {<br>
+ return test_info->should_run() && test_info->result()->Skipped();<br>
+ }<br>
+<br>
+ // Returns true if and only if test failed.<br>
static bool TestFailed(const TestInfo* test_info) {<br>
return test_info->should_run() && test_info->result()->Failed();<br>
}<br>
<br>
- // Returns true iff the test is disabled and will be reported in the XML<br>
- // report.<br>
+ // Returns true if and only if the test is disabled and will be reported in<br>
+ // the XML report.<br>
static bool TestReportableDisabled(const TestInfo* test_info) {<br>
return test_info->is_reportable() && test_info->is_disabled_;<br>
}<br>
<br>
- // Returns true iff test is disabled.<br>
+ // Returns true if and only if test is disabled.<br>
static bool TestDisabled(const TestInfo* test_info) {<br>
return test_info->is_disabled_;<br>
}<br>
<br>
- // Returns true iff this test will appear in the XML report.<br>
+ // Returns true if and only if this test will appear in the XML report.<br>
static bool TestReportable(const TestInfo* test_info) {<br>
return test_info->is_reportable();<br>
}<br>
@@ -962,17 +992,17 @@ class GTEST_API_ TestCase {<br>
return test_info->should_run();<br>
}<br>
<br>
- // Shuffles the tests in this test case.<br>
+ // Shuffles the tests in this test suite.<br>
void ShuffleTests(internal::Random* random);<br>
<br>
// Restores the test order to before the first shuffle.<br>
void UnshuffleTests();<br>
<br>
- // Name of the test case.<br>
+ // Name of the test suite.<br>
std::string name_;<br>
// Name of the parameter type, or NULL if this is not a typed or a<br>
// type-parameterized test.<br>
- const internal::scoped_ptr<const ::std::string> type_param_;<br>
+ const std::unique_ptr<const ::std::string> type_param_;<br>
// The vector of TestInfos in their original order. It owns the<br>
// elements in the vector.<br>
std::vector<TestInfo*> test_info_list_;<br>
@@ -980,20 +1010,22 @@ class GTEST_API_ TestCase {<br>
// shuffling and restoring the test order. The i-th element in this<br>
// vector is the index of the i-th test in the shuffled test list.<br>
std::vector<int> test_indices_;<br>
- // Pointer to the function that sets up the test case.<br>
- Test::SetUpTestCaseFunc set_up_tc_;<br>
- // Pointer to the function that tears down the test case.<br>
- Test::TearDownTestCaseFunc tear_down_tc_;<br>
- // True iff any test in this test case should run.<br>
+ // Pointer to the function that sets up the test suite.<br>
+ internal::SetUpTestSuiteFunc set_up_tc_;<br>
+ // Pointer to the function that tears down the test suite.<br>
+ internal::TearDownTestSuiteFunc tear_down_tc_;<br>
+ // True if and only if any test in this test suite should run.<br>
bool should_run_;<br>
+ // The start time, in milliseconds since UNIX Epoch.<br>
+ TimeInMillis start_timestamp_;<br>
// Elapsed time, in milliseconds.<br>
TimeInMillis elapsed_time_;<br>
- // Holds test properties recorded during execution of SetUpTestCase and<br>
- // TearDownTestCase.<br>
+ // Holds test properties recorded during execution of SetUpTestSuite and<br>
+ // TearDownTestSuite.<br>
TestResult ad_hoc_test_result_;<br>
<br>
- // We disallow copying TestCases.<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);<br>
+ // We disallow copying TestSuites.<br>
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestSuite);<br>
};<br>
<br>
// An Environment object is capable of setting up and tearing down an<br>
@@ -1024,7 +1056,7 @@ class Environment {<br>
// If you see an error about overriding the following function or<br>
// about it being private, you have mis-spelled SetUp() as Setup().<br>
struct Setup_should_be_spelled_SetUp {};<br>
- virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }<br>
+ virtual Setup_should_be_spelled_SetUp* Setup() { return nullptr; }<br>
};<br>
<br>
#if GTEST_HAS_EXCEPTIONS<br>
@@ -1060,8 +1092,13 @@ class TestEventListener {<br>
// Fired after environment set-up for each iteration of tests ends.<br>
virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;<br>
<br>
- // Fired before the test case starts.<br>
- virtual void OnTestCaseStart(const TestCase& test_case) = 0;<br>
+ // Fired before the test suite starts.<br>
+ virtual void OnTestSuiteStart(const TestSuite& /*test_suite*/) {}<br>
+<br>
+ // Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
// Fired before the test starts.<br>
virtual void OnTestStart(const TestInfo& test_info) = 0;<br>
@@ -1074,8 +1111,13 @@ class TestEventListener {<br>
// Fired after the test ends.<br>
virtual void OnTestEnd(const TestInfo& test_info) = 0;<br>
<br>
- // Fired after the test case ends.<br>
- virtual void OnTestCaseEnd(const TestCase& test_case) = 0;<br>
+ // Fired after the test suite ends.<br>
+ virtual void OnTestSuiteEnd(const TestSuite& /*test_suite*/) {}<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
// Fired before environment tear-down for each iteration of tests starts.<br>
virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;<br>
@@ -1098,21 +1140,30 @@ class TestEventListener {<br>
// above.<br>
class EmptyTestEventListener : public TestEventListener {<br>
public:<br>
- virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}<br>
- virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,<br>
- int /*iteration*/) {}<br>
- virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}<br>
- virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}<br>
- virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}<br>
- virtual void OnTestStart(const TestInfo& /*test_info*/) {}<br>
- virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}<br>
- virtual void OnTestEnd(const TestInfo& /*test_info*/) {}<br>
- virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}<br>
- virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}<br>
- virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}<br>
- virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,<br>
- int /*iteration*/) {}<br>
- virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}<br>
+ void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}<br>
+ void OnTestIterationStart(const UnitTest& /*unit_test*/,<br>
+ int /*iteration*/) override {}<br>
+ void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {}<br>
+ void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {}<br>
+ void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {}<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ void OnTestCaseStart(const TestCase& /*test_case*/) override {}<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
+ void OnTestStart(const TestInfo& /*test_info*/) override {}<br>
+ void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {}<br>
+ void OnTestEnd(const TestInfo& /*test_info*/) override {}<br>
+ void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {}<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ void OnTestCaseEnd(const TestCase& /*test_case*/) override {}<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
+ void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {}<br>
+ void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {}<br>
+ void OnTestIterationEnd(const UnitTest& /*unit_test*/,<br>
+ int /*iteration*/) override {}<br>
+ void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}<br>
};<br>
<br>
// TestEventListeners lets users add listeners to track events in Google Test.<br>
@@ -1152,7 +1203,7 @@ class GTEST_API_ TestEventListeners {<br>
}<br>
<br>
private:<br>
- friend class TestCase;<br>
+ friend class TestSuite;<br>
friend class TestInfo;<br>
friend class internal::DefaultGlobalTestPartResultReporter;<br>
friend class internal::NoExecDeathTest;<br>
@@ -1193,7 +1244,7 @@ class GTEST_API_ TestEventListeners {<br>
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);<br>
};<br>
<br>
-// A UnitTest consists of a vector of TestCases.<br>
+// A UnitTest consists of a vector of TestSuites.<br>
//<br>
// This is a singleton class. The only instance of UnitTest is<br>
// created when UnitTest::GetInstance() is first called. This<br>
@@ -1222,10 +1273,14 @@ class GTEST_API_ UnitTest {<br>
// was executed. The UnitTest object owns the string.<br>
const char* original_working_dir() const;<br>
<br>
- // Returns the TestCase object for the test that's currently running,<br>
+ // Returns the TestSuite object for the test that's currently running,<br>
// or NULL if no test is running.<br>
- const TestCase* current_test_case() const<br>
- GTEST_LOCK_EXCLUDED_(mutex_);<br>
+ const TestSuite* current_test_suite() const GTEST_LOCK_EXCLUDED_(mutex_);<br>
+<br>
+// Legacy API is still available but deprecated<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ const TestCase* current_test_case() const GTEST_LOCK_EXCLUDED_(mutex_);<br>
+#endif<br>
<br>
// Returns the TestInfo object for the test that's currently running,<br>
// or NULL if no test is running.<br>
@@ -1235,29 +1290,40 @@ class GTEST_API_ UnitTest {<br>
// Returns the random seed used at the start of the current test run.<br>
int random_seed() const;<br>
<br>
- // Returns the ParameterizedTestCaseRegistry object used to keep track of<br>
+ // Returns the ParameterizedTestSuiteRegistry object used to keep track of<br>
// value-parameterized tests and instantiate and register them.<br>
//<br>
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.<br>
- internal::ParameterizedTestCaseRegistry& parameterized_test_registry()<br>
+ internal::ParameterizedTestSuiteRegistry& parameterized_test_registry()<br>
GTEST_LOCK_EXCLUDED_(mutex_);<br>
<br>
- // Gets the number of successful test cases.<br>
- int successful_test_case_count() const;<br>
+ // Gets the number of successful test suites.<br>
+ int successful_test_suite_count() const;<br>
<br>
- // Gets the number of failed test cases.<br>
- int failed_test_case_count() const;<br>
+ // Gets the number of failed test suites.<br>
+ int failed_test_suite_count() const;<br>
<br>
- // Gets the number of all test cases.<br>
- int total_test_case_count() const;<br>
+ // Gets the number of all test suites.<br>
+ int total_test_suite_count() const;<br>
<br>
- // Gets the number of all test cases that contain at least one test<br>
+ // Gets the number of all test suites that contain at least one test<br>
// that should run.<br>
+ int test_suite_to_run_count() const;<br>
+<br>
+ // Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ int successful_test_case_count() const;<br>
+ int failed_test_case_count() const;<br>
+ int total_test_case_count() const;<br>
int test_case_to_run_count() const;<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
// Gets the number of successful tests.<br>
int successful_test_count() const;<br>
<br>
+ // Gets the number of skipped tests.<br>
+ int skipped_test_count() const;<br>
+<br>
// Gets the number of failed tests.<br>
int failed_test_count() const;<br>
<br>
@@ -1283,19 +1349,25 @@ class GTEST_API_ UnitTest {<br>
// Gets the elapsed time, in milliseconds.<br>
TimeInMillis elapsed_time() const;<br>
<br>
- // Returns true iff the unit test passed (i.e. all test cases passed).<br>
+ // Returns true if and only if the unit test passed (i.e. all test suites<br>
+ // passed).<br>
bool Passed() const;<br>
<br>
- // Returns true iff the unit test failed (i.e. some test case failed<br>
- // or something outside of all tests failed).<br>
+ // Returns true if and only if the unit test failed (i.e. some test suite<br>
+ // failed or something outside of all tests failed).<br>
bool Failed() const;<br>
<br>
- // Gets the i-th test case among all the test cases. i can range from 0 to<br>
- // total_test_case_count() - 1. If i is not in that range, returns NULL.<br>
+ // Gets the i-th test suite among all the test suites. i can range from 0 to<br>
+ // total_test_suite_count() - 1. If i is not in that range, returns NULL.<br>
+ const TestSuite* GetTestSuite(int i) const;<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
const TestCase* GetTestCase(int i) const;<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
// Returns the TestResult containing information on test failures and<br>
- // properties logged outside of individual test cases.<br>
+ // properties logged outside of individual test suites.<br>
const TestResult& ad_hoc_test_result() const;<br>
<br>
// Returns the list of event listeners that can be used to track events<br>
@@ -1326,15 +1398,15 @@ class GTEST_API_ UnitTest {<br>
GTEST_LOCK_EXCLUDED_(mutex_);<br>
<br>
// Adds a TestProperty to the current TestResult object when invoked from<br>
- // inside a test, to current TestCase's ad_hoc_test_result_ when invoked<br>
- // from SetUpTestCase or TearDownTestCase, or to the global property set<br>
+ // inside a test, to current TestSuite's ad_hoc_test_result_ when invoked<br>
+ // from SetUpTestSuite or TearDownTestSuite, or to the global property set<br>
// when invoked elsewhere. If the result already contains a property with<br>
// the same key, the value will be updated.<br>
void RecordProperty(const std::string& key, const std::string& value);<br>
<br>
- // Gets the i-th test case among all the test cases. i can range from 0 to<br>
- // total_test_case_count() - 1. If i is not in that range, returns NULL.<br>
- TestCase* GetMutableTestCase(int i);<br>
+ // Gets the i-th test suite among all the test suites. i can range from 0 to<br>
+ // total_test_suite_count() - 1. If i is not in that range, returns NULL.<br>
+ TestSuite* GetMutableTestSuite(int i);<br>
<br>
// Accessors for the implementation object.<br>
internal::UnitTestImpl* impl() { return impl_; }<br>
@@ -1419,6 +1491,10 @@ GTEST_API_ void InitGoogleTest(int* argc, char** argv);<br>
// UNICODE mode.<br>
GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);<br>
<br>
+// This overloaded version can be used on Arduino/embedded platforms where<br>
+// there is no argc/argv.<br>
+GTEST_API_ void InitGoogleTest();<br>
+<br>
namespace internal {<br>
<br>
// Separate the error generating code from the code path to reduce the stack<br>
@@ -1435,6 +1511,13 @@ AssertionResult CmpHelperEQFailure(const char* lhs_expression,<br>
false);<br>
}<br>
<br>
+// This block of code defines operator==/!=<br>
+// to block lexical scope lookup.<br>
+// It prevents using invalid operator==/!= defined at namespace scope.<br>
+struct faketype {};<br>
+inline bool operator==(faketype, faketype) { return true; }<br>
+inline bool operator!=(faketype, faketype) { return false; }<br>
+<br>
// The helper function for {ASSERT|EXPECT}_EQ.<br>
template <typename T1, typename T2><br>
AssertionResult CmpHelperEQ(const char* lhs_expression,<br>
@@ -1456,18 +1539,17 @@ GTEST_API_ AssertionResult CmpHelperEQ(const char* lhs_expression,<br>
BiggestInt lhs,<br>
BiggestInt rhs);<br>
<br>
-// The helper class for {ASSERT|EXPECT}_EQ. The template argument<br>
-// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()<br>
-// is a null pointer literal. The following default implementation is<br>
-// for lhs_is_null_literal being false.<br>
-template <bool lhs_is_null_literal><br>
class EqHelper {<br>
public:<br>
// This templatized version is for the general case.<br>
- template <typename T1, typename T2><br>
+ template <<br>
+ typename T1, typename T2,<br>
+ // Disable this overload for cases where one argument is a pointer<br>
+ // and the other is the null pointer constant.<br>
+ typename std::enable_if<!std::is_integral<T1>::value ||<br>
+ !std::is_pointer<T2>::value>::type* = nullptr><br>
static AssertionResult Compare(const char* lhs_expression,<br>
- const char* rhs_expression,<br>
- const T1& lhs,<br>
+ const char* rhs_expression, const T1& lhs,<br>
const T2& rhs) {<br>
return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);<br>
}<br>
@@ -1484,49 +1566,15 @@ class EqHelper {<br>
BiggestInt rhs) {<br>
return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);<br>
}<br>
-};<br>
<br>
-// This specialization is used when the first argument to ASSERT_EQ()<br>
-// is a null pointer literal, like NULL, false, or 0.<br>
-template <><br>
-class EqHelper<true> {<br>
- public:<br>
- // We define two overloaded versions of Compare(). The first<br>
- // version will be picked when the second argument to ASSERT_EQ() is<br>
- // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or<br>
- // EXPECT_EQ(false, a_bool).<br>
- template <typename T1, typename T2><br>
- static AssertionResult Compare(<br>
- const char* lhs_expression,<br>
- const char* rhs_expression,<br>
- const T1& lhs,<br>
- const T2& rhs,<br>
- // The following line prevents this overload from being considered if T2<br>
- // is not a pointer type. We need this because ASSERT_EQ(NULL, my_ptr)<br>
- // expands to Compare("", "", NULL, my_ptr), which requires a conversion<br>
- // to match the Secret* in the other overload, which would otherwise make<br>
- // this template match better.<br>
- typename EnableIf<!is_pointer<T2>::value>::type* = 0) {<br>
- return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);<br>
- }<br>
-<br>
- // This version will be picked when the second argument to ASSERT_EQ() is a<br>
- // pointer, e.g. ASSERT_EQ(NULL, a_pointer).<br>
template <typename T><br>
static AssertionResult Compare(<br>
- const char* lhs_expression,<br>
- const char* rhs_expression,<br>
- // We used to have a second template parameter instead of Secret*. That<br>
- // template parameter would deduce to 'long', making this a better match<br>
- // than the first overload even without the first overload's EnableIf.<br>
- // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to<br>
- // non-pointer argument" (even a deduced integral argument), so the old<br>
- // implementation caused warnings in user code.<br>
- Secret* /* lhs (NULL) */,<br>
- T* rhs) {<br>
+ const char* lhs_expression, const char* rhs_expression,<br>
+ // Handle cases where '0' is used as a null pointer literal.<br>
+ std::nullptr_t /* lhs */, T* rhs) {<br>
// We already know that 'lhs' is a null pointer.<br>
- return CmpHelperEQ(lhs_expression, rhs_expression,<br>
- static_cast<T*>(NULL), rhs);<br>
+ return CmpHelperEQ(lhs_expression, rhs_expression, static_cast<T*>(nullptr),<br>
+ rhs);<br>
}<br>
};<br>
<br>
@@ -1755,6 +1803,12 @@ class GTEST_API_ AssertHelper {<br>
GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);<br>
};<br>
<br>
+enum GTestColor { COLOR_DEFAULT, COLOR_RED, COLOR_GREEN, COLOR_YELLOW };<br>
+<br>
+GTEST_API_ GTEST_ATTRIBUTE_PRINTF_(2, 3) void ColoredPrintf(GTestColor color,<br>
+ const char* fmt,<br>
+ ...);<br>
+<br>
} // namespace internal<br>
<br>
// The pure interface class that all value-parameterized tests inherit from.<br>
@@ -1774,13 +1828,13 @@ class GTEST_API_ AssertHelper {<br>
// FooTest() {<br>
// // Can use GetParam() here.<br>
// }<br>
-// virtual ~FooTest() {<br>
+// ~FooTest() override {<br>
// // Can use GetParam() here.<br>
// }<br>
-// virtual void SetUp() {<br>
+// void SetUp() override {<br>
// // Can use GetParam() here.<br>
// }<br>
-// virtual void TearDown {<br>
+// void TearDown override {<br>
// // Can use GetParam() here.<br>
// }<br>
// };<br>
@@ -1789,7 +1843,7 @@ class GTEST_API_ AssertHelper {<br>
// Foo foo;<br>
// ASSERT_TRUE(foo.DoesBar(GetParam()));<br>
// }<br>
-// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));<br>
+// INSTANTIATE_TEST_SUITE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));<br>
<br>
template <typename T><br>
class WithParamInterface {<br>
@@ -1798,12 +1852,9 @@ class WithParamInterface {<br>
virtual ~WithParamInterface() {}<br>
<br>
// The current parameter value. Is also available in the test fixture's<br>
- // constructor. This member function is non-static, even though it only<br>
- // references static data, to reduce the opportunity for incorrect uses<br>
- // like writing 'WithParamInterface<bool>::GetParam()' for a test that<br>
- // uses a fixture whose parameter type is int.<br>
- const ParamType& GetParam() const {<br>
- GTEST_CHECK_(parameter_ != NULL)<br>
+ // constructor.<br>
+ static const ParamType& GetParam() {<br>
+ GTEST_CHECK_(parameter_ != nullptr)<br>
<< "GetParam() can only be called inside a value-parameterized test "<br>
<< "-- did you intend to write TEST_P instead of TEST_F?";<br>
return *parameter_;<br>
@@ -1824,7 +1875,7 @@ class WithParamInterface {<br>
};<br>
<br>
template <typename T><br>
-const T* WithParamInterface<T>::parameter_ = NULL;<br>
+const T* WithParamInterface<T>::parameter_ = nullptr;<br>
<br>
// Most value-parameterized classes can ignore the existence of<br>
// WithParamInterface, and can just inherit from ::testing::TestWithParam.<br>
@@ -1835,6 +1886,11 @@ class TestWithParam : public Test, public WithParamInterface<T> {<br>
<br>
// Macros for indicating success/failure in test code.<br>
<br>
+// Skips test in runtime.<br>
+// Skipping test aborts current function.<br>
+// Skipped tests are neither successful nor failed.<br>
+#define GTEST_SKIP() GTEST_SKIP_("Skipped")<br>
+<br>
// ADD_FAILURE unconditionally adds a failure to the current test.<br>
// SUCCEED generates a success - it doesn't automatically make the<br>
// current test successful, as a test is only successful when it has<br>
@@ -1864,6 +1920,11 @@ class TestWithParam : public Test, public WithParamInterface<T> {<br>
// Generates a fatal failure with a generic message.<br>
#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")<br>
<br>
+// Like GTEST_FAIL(), but at the given source file location.<br>
+#define GTEST_FAIL_AT(file, line) \<br>
+ GTEST_MESSAGE_AT_(file, line, "Failed", \<br>
+ ::testing::TestPartResult::kFatalFailure)<br>
+<br>
// Define this macro to 1 to omit the definition of FAIL(), which is a<br>
// generic name and clashes with some other libraries.<br>
#if !GTEST_DONT_DEFINE_FAIL<br>
@@ -1964,9 +2025,7 @@ class TestWithParam : public Test, public WithParamInterface<T> {<br>
// ASSERT_GT(records.size(), 0) << "There is no record left.";<br>
<br>
#define EXPECT_EQ(val1, val2) \<br>
- EXPECT_PRED_FORMAT2(::testing::internal:: \<br>
- EqHelper<GTEST_IS_NULL_LITERAL_(val1)>::Compare, \<br>
- val1, val2)<br>
+ EXPECT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2)<br>
#define EXPECT_NE(val1, val2) \<br>
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)<br>
#define EXPECT_LE(val1, val2) \<br>
@@ -1979,9 +2038,7 @@ class TestWithParam : public Test, public WithParamInterface<T> {<br>
EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)<br>
<br>
#define GTEST_ASSERT_EQ(val1, val2) \<br>
- ASSERT_PRED_FORMAT2(::testing::internal:: \<br>
- EqHelper<GTEST_IS_NULL_LITERAL_(val1)>::Compare, \<br>
- val1, val2)<br>
+ ASSERT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2)<br>
#define GTEST_ASSERT_NE(val1, val2) \<br>
ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)<br>
#define GTEST_ASSERT_LE(val1, val2) \<br>
@@ -2172,12 +2229,6 @@ class GTEST_API_ ScopedTrace {<br>
PushTrace(file, line, message ? message : "(null)");<br>
}<br>
<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
- ScopedTrace(const char* file, int line, const ::string& message) {<br>
- PushTrace(file, line, message);<br>
- }<br>
-#endif<br>
-<br>
ScopedTrace(const char* file, int line, const std::string& message) {<br>
PushTrace(file, line, message);<br>
}<br>
@@ -2215,10 +2266,9 @@ class GTEST_API_ ScopedTrace {<br>
::testing::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\<br>
__FILE__, __LINE__, (message))<br>
<br>
-<br>
// Compile-time assertion for type equality.<br>
-// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are<br>
-// the same type. The value it returns is not interesting.<br>
+// StaticAssertTypeEq<type1, type2>() compiles if and only if type1 and type2<br>
+// are the same type. The value it returns is not interesting.<br>
//<br>
// Instead of making StaticAssertTypeEq a class template, we make it a<br>
// function template that invokes a helper class template. This<br>
@@ -2247,18 +2297,19 @@ class GTEST_API_ ScopedTrace {<br>
//<br>
// to cause a compiler error.<br>
template <typename T1, typename T2><br>
-bool StaticAssertTypeEq() {<br>
- (void)internal::StaticAssertTypeEqHelper<T1, T2>();<br>
+constexpr bool StaticAssertTypeEq() noexcept {<br>
+ static_assert(std::is_same<T1, T2>::value,<br>
+ "type1 and type2 are not the same type");<br>
return true;<br>
}<br>
<br>
// Defines a test.<br>
//<br>
-// The first parameter is the name of the test case, and the second<br>
-// parameter is the name of the test within the test case.<br>
+// The first parameter is the name of the test suite, and the second<br>
+// parameter is the name of the test within the test suite.<br>
//<br>
-// The convention is to end the test case name with "Test". For<br>
-// example, a test case for the Foo class can be named FooTest.<br>
+// The convention is to end the test suite name with "Test". For<br>
+// example, a test suite for the Foo class can be named FooTest.<br>
//<br>
// Test code should appear between braces after an invocation of<br>
// this macro. Example:<br>
@@ -2277,28 +2328,28 @@ bool StaticAssertTypeEq() {<br>
// code. GetTestTypeId() is guaranteed to always return the same<br>
// value, as it always calls GetTypeId<>() from the Google Test<br>
// framework.<br>
-#define GTEST_TEST(test_case_name, test_name)\<br>
- GTEST_TEST_(test_case_name, test_name, \<br>
- ::testing::Test, ::testing::internal::GetTestTypeId())<br>
+#define GTEST_TEST(test_suite_name, test_name) \<br>
+ GTEST_TEST_(test_suite_name, test_name, ::testing::Test, \<br>
+ ::testing::internal::GetTestTypeId())<br>
<br>
// Define this macro to 1 to omit the definition of TEST(), which<br>
// is a generic name and clashes with some other libraries.<br>
#if !GTEST_DONT_DEFINE_TEST<br>
-# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)<br>
+#define TEST(test_suite_name, test_name) GTEST_TEST(test_suite_name, test_name)<br>
#endif<br>
<br>
// Defines a test that uses a test fixture.<br>
//<br>
// The first parameter is the name of the test fixture class, which<br>
-// also doubles as the test case name. The second parameter is the<br>
-// name of the test within the test case.<br>
+// also doubles as the test suite name. The second parameter is the<br>
+// name of the test within the test suite.<br>
//<br>
// A test fixture class must be declared earlier. The user should put<br>
// the test code between braces after using this macro. Example:<br>
//<br>
// class FooTest : public testing::Test {<br>
// protected:<br>
-// virtual void SetUp() { b_.AddElement(3); }<br>
+// void SetUp() override { b_.AddElement(3); }<br>
//<br>
// Foo a_;<br>
// Foo b_;<br>
@@ -2312,7 +2363,8 @@ bool StaticAssertTypeEq() {<br>
// EXPECT_EQ(a_.size(), 0);<br>
// EXPECT_EQ(b_.size(), 1);<br>
// }<br>
-<br>
+//<br>
+// GOOGLETEST_CM0011 DO NOT DELETE<br>
#define TEST_F(test_fixture, test_name)\<br>
GTEST_TEST_(test_fixture, test_name, test_fixture, \<br>
::testing::internal::GetTypeId<test_fixture>())<br>
@@ -2325,6 +2377,86 @@ GTEST_API_ std::string TempDir();<br>
# pragma warning(pop)<br>
#endif<br>
<br>
+// Dynamically registers a test with the framework.<br>
+//<br>
+// This is an advanced API only to be used when the `TEST` macros are<br>
+// insufficient. The macros should be preferred when possible, as they avoid<br>
+// most of the complexity of calling this function.<br>
+//<br>
+// The `factory` argument is a factory callable (move-constructible) object or<br>
+// function pointer that creates a new instance of the Test object. It<br>
+// handles ownership to the caller. The signature of the callable is<br>
+// `Fixture*()`, where `Fixture` is the test fixture class for the test. All<br>
+// tests registered with the same `test_suite_name` must return the same<br>
+// fixture type. This is checked at runtime.<br>
+//<br>
+// The framework will infer the fixture class from the factory and will call<br>
+// the `SetUpTestSuite` and `TearDownTestSuite` for it.<br>
+//<br>
+// Must be called before `RUN_ALL_TESTS()` is invoked, otherwise behavior is<br>
+// undefined.<br>
+//<br>
+// Use case example:<br>
+//<br>
+// class MyFixture : public ::testing::Test {<br>
+// public:<br>
+// // All of these optional, just like in regular macro usage.<br>
+// static void SetUpTestSuite() { ... }<br>
+// static void TearDownTestSuite() { ... }<br>
+// void SetUp() override { ... }<br>
+// void TearDown() override { ... }<br>
+// };<br>
+//<br>
+// class MyTest : public MyFixture {<br>
+// public:<br>
+// explicit MyTest(int data) : data_(data) {}<br>
+// void TestBody() override { ... }<br>
+//<br>
+// private:<br>
+// int data_;<br>
+// };<br>
+//<br>
+// void RegisterMyTests(const std::vector<int>& values) {<br>
+// for (int v : values) {<br>
+// ::testing::RegisterTest(<br>
+// "MyFixture", ("Test" + std::to_string(v)).c_str(), nullptr,<br>
+// std::to_string(v).c_str(),<br>
+// __FILE__, __LINE__,<br>
+// // Important to use the fixture type as the return type here.<br>
+// [=]() -> MyFixture* { return new MyTest(v); });<br>
+// }<br>
+// }<br>
+// ...<br>
+// int main(int argc, char** argv) {<br>
+// std::vector<int> values_to_test = LoadValuesFromConfig();<br>
+// RegisterMyTests(values_to_test);<br>
+// ...<br>
+// return RUN_ALL_TESTS();<br>
+// }<br>
+//<br>
+template <int&... ExplicitParameterBarrier, typename Factory><br>
+TestInfo* RegisterTest(const char* test_suite_name, const char* test_name,<br>
+ const char* type_param, const char* value_param,<br>
+ const char* file, int line, Factory factory) {<br>
+ using TestT = typename std::remove_pointer<decltype(factory())>::type;<br>
+<br>
+ class FactoryImpl : public internal::TestFactoryBase {<br>
+ public:<br>
+ explicit FactoryImpl(Factory f) : factory_(std::move(f)) {}<br>
+ Test* CreateTest() override { return factory_(); }<br>
+<br>
+ private:<br>
+ Factory factory_;<br>
+ };<br>
+<br>
+ return internal::MakeAndRegisterTestInfo(<br>
+ test_suite_name, test_name, type_param, value_param,<br>
+ internal::CodeLocation(file, line), internal::GetTypeId<TestT>(),<br>
+ internal::SuiteApiResolver<TestT>::GetSetUpCaseOrSuite(file, line),<br>
+ internal::SuiteApiResolver<TestT>::GetTearDownCaseOrSuite(file, line),<br>
+ new FactoryImpl{std::move(factory)});<br>
+}<br>
+<br>
} // namespace testing<br>
<br>
// Use this function in main() to run all tests. It returns 0 if all<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/gtest_pred_impl.h b/llvm/utils/unittest/googletest/include/gtest/gtest_pred_impl.h<br>
index 0c1105cb8eb2e..d514255c733b7 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest_pred_impl.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest_pred_impl.h<br>
@@ -27,11 +27,10 @@<br>
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
<br>
-// This file is AUTOMATICALLY GENERATED on 01/02/2018 by command<br>
+// This file is AUTOMATICALLY GENERATED on 01/02/2019 by command<br>
// 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND!<br>
//<br>
// Implements a family of generic predicate assertion macros.<br>
-<br>
// GOOGLETEST_CM0001 DO NOT DELETE<br>
<br>
#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_<br>
@@ -67,6 +66,8 @@ namespace testing {<br>
// We also define the EXPECT_* variations.<br>
//<br>
// For now we only support predicates whose arity is at most 5.<br>
+// Please email <a href="mailto:googletestframework@googlegroups.com" target="_blank">googletestframework@googlegroups.com</a> if you need<br>
+// support for higher arities.<br>
<br>
// GTEST_ASSERT_ is the basic statement to which all of the assertions<br>
// in this file reduce. Don't use this in your code.<br>
@@ -89,9 +90,10 @@ AssertionResult AssertPred1Helper(const char* pred_text,<br>
const T1& v1) {<br>
if (pred(v1)) return AssertionSuccess();<br>
<br>
- return AssertionFailure() << pred_text << "("<br>
- << e1 << ") evaluates to false, where"<br>
- << "\n" << e1 << " evaluates to " << v1;<br>
+ return AssertionFailure()<br>
+ << pred_text << "(" << e1 << ") evaluates to false, where"<br>
+ << "\n"<br>
+ << e1 << " evaluates to " << ::testing::PrintToString(v1);<br>
}<br>
<br>
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.<br>
@@ -133,11 +135,12 @@ AssertionResult AssertPred2Helper(const char* pred_text,<br>
const T2& v2) {<br>
if (pred(v1, v2)) return AssertionSuccess();<br>
<br>
- return AssertionFailure() << pred_text << "("<br>
- << e1 << ", "<br>
- << e2 << ") evaluates to false, where"<br>
- << "\n" << e1 << " evaluates to " << v1<br>
- << "\n" << e2 << " evaluates to " << v2;<br>
+ return AssertionFailure()<br>
+ << pred_text << "(" << e1 << ", " << e2<br>
+ << ") evaluates to false, where"<br>
+ << "\n"<br>
+ << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n"<br>
+ << e2 << " evaluates to " << ::testing::PrintToString(v2);<br>
}<br>
<br>
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.<br>
@@ -184,13 +187,13 @@ AssertionResult AssertPred3Helper(const char* pred_text,<br>
const T3& v3) {<br>
if (pred(v1, v2, v3)) return AssertionSuccess();<br>
<br>
- return AssertionFailure() << pred_text << "("<br>
- << e1 << ", "<br>
- << e2 << ", "<br>
- << e3 << ") evaluates to false, where"<br>
- << "\n" << e1 << " evaluates to " << v1<br>
- << "\n" << e2 << " evaluates to " << v2<br>
- << "\n" << e3 << " evaluates to " << v3;<br>
+ return AssertionFailure()<br>
+ << pred_text << "(" << e1 << ", " << e2 << ", " << e3<br>
+ << ") evaluates to false, where"<br>
+ << "\n"<br>
+ << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n"<br>
+ << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n"<br>
+ << e3 << " evaluates to " << ::testing::PrintToString(v3);<br>
}<br>
<br>
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.<br>
@@ -242,15 +245,14 @@ AssertionResult AssertPred4Helper(const char* pred_text,<br>
const T4& v4) {<br>
if (pred(v1, v2, v3, v4)) return AssertionSuccess();<br>
<br>
- return AssertionFailure() << pred_text << "("<br>
- << e1 << ", "<br>
- << e2 << ", "<br>
- << e3 << ", "<br>
- << e4 << ") evaluates to false, where"<br>
- << "\n" << e1 << " evaluates to " << v1<br>
- << "\n" << e2 << " evaluates to " << v2<br>
- << "\n" << e3 << " evaluates to " << v3<br>
- << "\n" << e4 << " evaluates to " << v4;<br>
+ return AssertionFailure()<br>
+ << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4<br>
+ << ") evaluates to false, where"<br>
+ << "\n"<br>
+ << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n"<br>
+ << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n"<br>
+ << e3 << " evaluates to " << ::testing::PrintToString(v3) << "\n"<br>
+ << e4 << " evaluates to " << ::testing::PrintToString(v4);<br>
}<br>
<br>
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.<br>
@@ -307,17 +309,15 @@ AssertionResult AssertPred5Helper(const char* pred_text,<br>
const T5& v5) {<br>
if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();<br>
<br>
- return AssertionFailure() << pred_text << "("<br>
- << e1 << ", "<br>
- << e2 << ", "<br>
- << e3 << ", "<br>
- << e4 << ", "<br>
- << e5 << ") evaluates to false, where"<br>
- << "\n" << e1 << " evaluates to " << v1<br>
- << "\n" << e2 << " evaluates to " << v2<br>
- << "\n" << e3 << " evaluates to " << v3<br>
- << "\n" << e4 << " evaluates to " << v4<br>
- << "\n" << e5 << " evaluates to " << v5;<br>
+ return AssertionFailure()<br>
+ << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4<br>
+ << ", " << e5 << ") evaluates to false, where"<br>
+ << "\n"<br>
+ << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n"<br>
+ << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n"<br>
+ << e3 << " evaluates to " << ::testing::PrintToString(v3) << "\n"<br>
+ << e4 << " evaluates to " << ::testing::PrintToString(v4) << "\n"<br>
+ << e5 << " evaluates to " << ::testing::PrintToString(v5);<br>
}<br>
<br>
// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-death-test-internal.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-death-test-internal.h<br>
index 4db41f8767356..12bb05011f96b 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-death-test-internal.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-death-test-internal.h<br>
@@ -36,9 +36,11 @@<br>
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_<br>
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_<br>
<br>
+#include "gtest/gtest-matchers.h"<br>
#include "gtest/internal/gtest-internal.h"<br>
<br>
#include <stdio.h><br>
+#include <memory><br>
<br>
namespace testing {<br>
namespace internal {<br>
@@ -78,7 +80,7 @@ class GTEST_API_ DeathTest {<br>
// argument is set. If the death test should be skipped, the pointer<br>
// is set to NULL; otherwise, it is set to the address of a new concrete<br>
// DeathTest object that controls the execution of the current test.<br>
- static bool Create(const char* statement, const RE* regex,<br>
+ static bool Create(const char* statement, Matcher<const std::string&> matcher,<br>
const char* file, int line, DeathTest** test);<br>
DeathTest();<br>
virtual ~DeathTest() { }<br>
@@ -144,21 +146,44 @@ GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251<br>
class DeathTestFactory {<br>
public:<br>
virtual ~DeathTestFactory() { }<br>
- virtual bool Create(const char* statement, const RE* regex,<br>
- const char* file, int line, DeathTest** test) = 0;<br>
+ virtual bool Create(const char* statement,<br>
+ Matcher<const std::string&> matcher, const char* file,<br>
+ int line, DeathTest** test) = 0;<br>
};<br>
<br>
// A concrete DeathTestFactory implementation for normal use.<br>
class DefaultDeathTestFactory : public DeathTestFactory {<br>
public:<br>
- virtual bool Create(const char* statement, const RE* regex,<br>
- const char* file, int line, DeathTest** test);<br>
+ bool Create(const char* statement, Matcher<const std::string&> matcher,<br>
+ const char* file, int line, DeathTest** test) override;<br>
};<br>
<br>
// Returns true if exit_status describes a process that was terminated<br>
// by a signal, or exited normally with a nonzero exit code.<br>
GTEST_API_ bool ExitedUnsuccessfully(int exit_status);<br>
<br>
+// A string passed to EXPECT_DEATH (etc.) is caught by one of these overloads<br>
+// and interpreted as a regex (rather than an Eq matcher) for legacy<br>
+// compatibility.<br>
+inline Matcher<const ::std::string&> MakeDeathTestMatcher(<br>
+ ::testing::internal::RE regex) {<br>
+ return ContainsRegex(regex.pattern());<br>
+}<br>
+inline Matcher<const ::std::string&> MakeDeathTestMatcher(const char* regex) {<br>
+ return ContainsRegex(regex);<br>
+}<br>
+inline Matcher<const ::std::string&> MakeDeathTestMatcher(<br>
+ const ::std::string& regex) {<br>
+ return ContainsRegex(regex);<br>
+}<br>
+<br>
+// If a Matcher<const ::std::string&> is passed to EXPECT_DEATH (etc.), it's<br>
+// used directly.<br>
+inline Matcher<const ::std::string&> MakeDeathTestMatcher(<br>
+ Matcher<const ::std::string&> matcher) {<br>
+ return matcher;<br>
+}<br>
+<br>
// Traps C++ exceptions escaping statement and reports them as test<br>
// failures. Note that trapping SEH exceptions is not implemented here.<br>
# if GTEST_HAS_EXCEPTIONS<br>
@@ -186,36 +211,36 @@ GTEST_API_ bool ExitedUnsuccessfully(int exit_status);<br>
<br>
// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,<br>
// ASSERT_EXIT*, and EXPECT_EXIT*.<br>
-# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \<br>
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \<br>
- if (::testing::internal::AlwaysTrue()) { \<br>
- const ::testing::internal::RE& gtest_regex = (regex); \<br>
- ::testing::internal::DeathTest* gtest_dt; \<br>
- if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \<br>
- __FILE__, __LINE__, >est_dt)) { \<br>
- goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \<br>
- } \<br>
- if (gtest_dt != NULL) { \<br>
- ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \<br>
- gtest_dt_ptr(gtest_dt); \<br>
- switch (gtest_dt->AssumeRole()) { \<br>
- case ::testing::internal::DeathTest::OVERSEE_TEST: \<br>
- if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \<br>
- goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \<br>
- } \<br>
- break; \<br>
- case ::testing::internal::DeathTest::EXECUTE_TEST: { \<br>
- ::testing::internal::DeathTest::ReturnSentinel \<br>
- gtest_sentinel(gtest_dt); \<br>
- GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \<br>
- gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \<br>
- break; \<br>
- } \<br>
- } \<br>
- } \<br>
- } else \<br>
- GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \<br>
- fail(::testing::internal::DeathTest::LastMessage())<br>
+#define GTEST_DEATH_TEST_(statement, predicate, regex_or_matcher, fail) \<br>
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \<br>
+ if (::testing::internal::AlwaysTrue()) { \<br>
+ ::testing::internal::DeathTest* gtest_dt; \<br>
+ if (!::testing::internal::DeathTest::Create( \<br>
+ #statement, \<br>
+ ::testing::internal::MakeDeathTestMatcher(regex_or_matcher), \<br>
+ __FILE__, __LINE__, >est_dt)) { \<br>
+ goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \<br>
+ } \<br>
+ if (gtest_dt != nullptr) { \<br>
+ std::unique_ptr< ::testing::internal::DeathTest> gtest_dt_ptr(gtest_dt); \<br>
+ switch (gtest_dt->AssumeRole()) { \<br>
+ case ::testing::internal::DeathTest::OVERSEE_TEST: \<br>
+ if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \<br>
+ goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \<br>
+ } \<br>
+ break; \<br>
+ case ::testing::internal::DeathTest::EXECUTE_TEST: { \<br>
+ ::testing::internal::DeathTest::ReturnSentinel gtest_sentinel( \<br>
+ gtest_dt); \<br>
+ GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \<br>
+ gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \<br>
+ break; \<br>
+ } \<br>
+ } \<br>
+ } \<br>
+ } else \<br>
+ GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__) \<br>
+ : fail(::testing::internal::DeathTest::LastMessage())<br>
// The symbol "fail" here expands to something into which a message<br>
// can be streamed.<br>
<br>
@@ -224,14 +249,13 @@ GTEST_API_ bool ExitedUnsuccessfully(int exit_status);<br>
// must accept a streamed message even though the message is never printed.<br>
// The regex object is not evaluated, but it is used to prevent "unused"<br>
// warnings and to avoid an expression that doesn't compile in debug mode.<br>
-#define GTEST_EXECUTE_STATEMENT_(statement, regex) \<br>
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \<br>
- if (::testing::internal::AlwaysTrue()) { \<br>
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \<br>
- } else if (!::testing::internal::AlwaysTrue()) { \<br>
- const ::testing::internal::RE& gtest_regex = (regex); \<br>
- static_cast<void>(gtest_regex); \<br>
- } else \<br>
+#define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher) \<br>
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \<br>
+ if (::testing::internal::AlwaysTrue()) { \<br>
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \<br>
+ } else if (!::testing::internal::AlwaysTrue()) { \<br>
+ ::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \<br>
+ } else \<br>
::testing::Message()<br>
<br>
// A class representing the parsed contents of the<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-filepath.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-filepath.h<br>
index ae38d95bf844f..c11b101516e53 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-filepath.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-filepath.h<br>
@@ -110,7 +110,7 @@ class GTEST_API_ FilePath {<br>
const FilePath& base_name,<br>
const char* extension);<br>
<br>
- // Returns true iff the path is "".<br>
+ // Returns true if and only if the path is "".<br>
bool IsEmpty() const { return pathname_.empty(); }<br>
<br>
// If input name has a trailing separator character, removes it and returns<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-internal.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-internal.h<br>
index b762f61fc53c3..94c816a28bdb1 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-internal.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-internal.h<br>
@@ -58,6 +58,7 @@<br>
#include <map><br>
#include <set><br>
#include <string><br>
+#include <type_traits><br>
#include <vector><br>
<br>
#include "gtest/gtest-message.h"<br>
@@ -79,7 +80,6 @@<br>
// Stringifies its argument.<br>
#define GTEST_STRINGIFY_(name) #name<br>
<br>
-class ProtocolMessage;<br>
namespace proto2 { class Message; }<br>
<br>
namespace testing {<br>
@@ -91,7 +91,7 @@ class Message; // Represents a failure message.<br>
class Test; // Represents a test.<br>
class TestInfo; // Information about a test.<br>
class TestPartResult; // Result of a test part.<br>
-class UnitTest; // A collection of test cases.<br>
+class UnitTest; // A collection of test suites.<br>
<br>
template <typename T><br>
::std::string PrintToString(const T& value);<br>
@@ -106,34 +106,22 @@ class UnitTestImpl; // Opaque implementation of UnitTest<br>
// stack trace.<br>
GTEST_API_ extern const char kStackTraceMarker[];<br>
<br>
-// Two overloaded helpers for checking at compile time whether an<br>
-// expression is a null pointer literal (i.e. NULL or any 0-valued<br>
-// compile-time integral constant). Their return values have<br>
-// <br>
diff erent sizes, so we can use sizeof() to test which version is<br>
-// picked by the compiler. These helpers have no implementations, as<br>
-// we only need their signatures.<br>
-//<br>
-// Given IsNullLiteralHelper(x), the compiler will pick the first<br>
-// version if x can be implicitly converted to Secret*, and pick the<br>
-// second version otherwise. Since Secret is a secret and incomplete<br>
-// type, the only expression a user can write that has type Secret* is<br>
-// a null pointer literal. Therefore, we know that x is a null<br>
-// pointer literal if and only if the first version is picked by the<br>
-// compiler.<br>
-char IsNullLiteralHelper(Secret* p);<br>
-char (&IsNullLiteralHelper(...))[2]; // NOLINT<br>
-<br>
-// A compile-time bool constant that is true if and only if x is a<br>
-// null pointer literal (i.e. NULL or any 0-valued compile-time<br>
-// integral constant).<br>
-#ifdef GTEST_ELLIPSIS_NEEDS_POD_<br>
-// We lose support for NULL detection where the compiler doesn't like<br>
-// passing non-POD classes through ellipsis (...).<br>
-# define GTEST_IS_NULL_LITERAL_(x) false<br>
-#else<br>
-# define GTEST_IS_NULL_LITERAL_(x) \<br>
- (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)<br>
-#endif // GTEST_ELLIPSIS_NEEDS_POD_<br>
+// An IgnoredValue object can be implicitly constructed from ANY value.<br>
+class IgnoredValue {<br>
+ struct Sink {};<br>
+ public:<br>
+ // This constructor template allows any value to be implicitly<br>
+ // converted to IgnoredValue. The object has no data member and<br>
+ // doesn't try to remember anything about the argument. We<br>
+ // deliberately omit the 'explicit' keyword in order to allow the<br>
+ // conversion to be implicit.<br>
+ // Disable the conversion if T already has a magical conversion operator.<br>
+ // Otherwise we get ambiguity.<br>
+ template <typename T,<br>
+ typename std::enable_if<!std::is_convertible<T, Sink>::value,<br>
+ int>::type = 0><br>
+ IgnoredValue(const T& /* ignored */) {} // NOLINT(runtime/explicit)<br>
+};<br>
<br>
// Appends the user-supplied message to the Google-Test-generated message.<br>
GTEST_API_ std::string AppendUserMessage(<br>
@@ -201,7 +189,7 @@ GTEST_API_ std::string DiffStrings(const std::string& left,<br>
// expected_value: "5"<br>
// actual_value: "6"<br>
//<br>
-// The ignoring_case parameter is true iff the assertion is a<br>
+// The ignoring_case parameter is true if and only if the assertion is a<br>
// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will<br>
// be inserted into the message.<br>
GTEST_API_ AssertionResult EqFailure(const char* expected_expression,<br>
@@ -330,15 +318,15 @@ class FloatingPoint {<br>
// Returns the sign bit of this number.<br>
Bits sign_bit() const { return kSignBitMask & u_.bits_; }<br>
<br>
- // Returns true iff this is NAN (not a number).<br>
+ // Returns true if and only if this is NAN (not a number).<br>
bool is_nan() const {<br>
// It's a NAN if the exponent bits are all ones and the fraction<br>
// bits are not entirely zeros.<br>
return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);<br>
}<br>
<br>
- // Returns true iff this number is at most kMaxUlps ULP's away from<br>
- // rhs. In particular, this function:<br>
+ // Returns true if and only if this number is at most kMaxUlps ULP's away<br>
+ // from rhs. In particular, this function:<br>
//<br>
// - returns false if either number is (or both are) NAN.<br>
// - treats really large numbers as almost equal to infinity.<br>
@@ -409,7 +397,7 @@ typedef FloatingPoint<float> Float;<br>
typedef FloatingPoint<double> Double;<br>
<br>
// In order to catch the mistake of putting tests that use <br>
diff erent<br>
-// test fixture classes in the same test case, we need to assign<br>
+// test fixture classes in the same test suite, we need to assign<br>
// unique IDs to fixture classes and compare them. The TypeId type is<br>
// used to hold such IDs. The user should treat TypeId as an opaque<br>
// type: the only operation allowed on TypeId values is to compare<br>
@@ -469,7 +457,7 @@ class TestFactoryBase {<br>
template <class TestClass><br>
class TestFactoryImpl : public TestFactoryBase {<br>
public:<br>
- virtual Test* CreateTest() { return new TestClass; }<br>
+ Test* CreateTest() override { return new TestClass; }<br>
};<br>
<br>
#if GTEST_OS_WINDOWS<br>
@@ -485,9 +473,9 @@ GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,<br>
<br>
#endif // GTEST_OS_WINDOWS<br>
<br>
-// Types of SetUpTestCase() and TearDownTestCase() functions.<br>
-typedef void (*SetUpTestCaseFunc)();<br>
-typedef void (*TearDownTestCaseFunc)();<br>
+// Types of SetUpTestSuite() and TearDownTestSuite() functions.<br>
+using SetUpTestSuiteFunc = void (*)();<br>
+using TearDownTestSuiteFunc = void (*)();<br>
<br>
struct CodeLocation {<br>
CodeLocation(const std::string& a_file, int a_line)<br>
@@ -497,12 +485,64 @@ struct CodeLocation {<br>
int line;<br>
};<br>
<br>
+// Helper to identify which setup function for TestCase / TestSuite to call.<br>
+// Only one function is allowed, either TestCase or TestSute but not both.<br>
+<br>
+// Utility functions to help SuiteApiResolver<br>
+using SetUpTearDownSuiteFuncType = void (*)();<br>
+<br>
+inline SetUpTearDownSuiteFuncType GetNotDefaultOrNull(<br>
+ SetUpTearDownSuiteFuncType a, SetUpTearDownSuiteFuncType def) {<br>
+ return a == def ? nullptr : a;<br>
+}<br>
+<br>
+template <typename T><br>
+// Note that SuiteApiResolver inherits from T because<br>
+// SetUpTestSuite()/TearDownTestSuite() could be protected. Ths way<br>
+// SuiteApiResolver can access them.<br>
+struct SuiteApiResolver : T {<br>
+ // testing::Test is only forward declared at this point. So we make it a<br>
+ // dependend class for the compiler to be OK with it.<br>
+ using Test =<br>
+ typename std::conditional<sizeof(T) != 0, ::testing::Test, void>::type;<br>
+<br>
+ static SetUpTearDownSuiteFuncType GetSetUpCaseOrSuite(const char* filename,<br>
+ int line_num) {<br>
+ SetUpTearDownSuiteFuncType test_case_fp =<br>
+ GetNotDefaultOrNull(&T::SetUpTestCase, &Test::SetUpTestCase);<br>
+ SetUpTearDownSuiteFuncType test_suite_fp =<br>
+ GetNotDefaultOrNull(&T::SetUpTestSuite, &Test::SetUpTestSuite);<br>
+<br>
+ GTEST_CHECK_(!test_case_fp || !test_suite_fp)<br>
+ << "Test can not provide both SetUpTestSuite and SetUpTestCase, please "<br>
+ "make sure there is only one present at "<br>
+ << filename << ":" << line_num;<br>
+<br>
+ return test_case_fp != nullptr ? test_case_fp : test_suite_fp;<br>
+ }<br>
+<br>
+ static SetUpTearDownSuiteFuncType GetTearDownCaseOrSuite(const char* filename,<br>
+ int line_num) {<br>
+ SetUpTearDownSuiteFuncType test_case_fp =<br>
+ GetNotDefaultOrNull(&T::TearDownTestCase, &Test::TearDownTestCase);<br>
+ SetUpTearDownSuiteFuncType test_suite_fp =<br>
+ GetNotDefaultOrNull(&T::TearDownTestSuite, &Test::TearDownTestSuite);<br>
+<br>
+ GTEST_CHECK_(!test_case_fp || !test_suite_fp)<br>
+ << "Test can not provide both TearDownTestSuite and TearDownTestCase,"<br>
+ " please make sure there is only one present at"<br>
+ << filename << ":" << line_num;<br>
+<br>
+ return test_case_fp != nullptr ? test_case_fp : test_suite_fp;<br>
+ }<br>
+};<br>
+<br>
// Creates a new TestInfo object and registers it with Google Test;<br>
// returns the created object.<br>
//<br>
// Arguments:<br>
//<br>
-// test_case_name: name of the test case<br>
+// test_suite_name: name of the test suite<br>
// name: name of the test<br>
// type_param the name of the test's type parameter, or NULL if<br>
// this is not a typed or a type-parameterized test.<br>
@@ -510,21 +550,16 @@ struct CodeLocation {<br>
// or NULL if this is not a type-parameterized test.<br>
// code_location: code location where the test is defined<br>
// fixture_class_id: ID of the test fixture class<br>
-// set_up_tc: pointer to the function that sets up the test case<br>
-// tear_down_tc: pointer to the function that tears down the test case<br>
+// set_up_tc: pointer to the function that sets up the test suite<br>
+// tear_down_tc: pointer to the function that tears down the test suite<br>
// factory: pointer to the factory that creates a test object.<br>
// The newly created TestInfo instance will assume<br>
// ownership of the factory object.<br>
GTEST_API_ TestInfo* MakeAndRegisterTestInfo(<br>
- const char* test_case_name,<br>
- const char* name,<br>
- const char* type_param,<br>
- const char* value_param,<br>
- CodeLocation code_location,<br>
- TypeId fixture_class_id,<br>
- SetUpTestCaseFunc set_up_tc,<br>
- TearDownTestCaseFunc tear_down_tc,<br>
- TestFactoryBase* factory);<br>
+ const char* test_suite_name, const char* name, const char* type_param,<br>
+ const char* value_param, CodeLocation code_location,<br>
+ TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc,<br>
+ TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory);<br>
<br>
// If *pstr starts with the given prefix, modifies *pstr to be right<br>
// past the prefix and returns true; otherwise leaves *pstr unchanged<br>
@@ -536,19 +571,20 @@ GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);<br>
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \<br>
/* class A needs to have dll-interface to be used by clients of class B */)<br>
<br>
-// State of the definition of a type-parameterized test case.<br>
-class GTEST_API_ TypedTestCasePState {<br>
+// State of the definition of a type-parameterized test suite.<br>
+class GTEST_API_ TypedTestSuitePState {<br>
public:<br>
- TypedTestCasePState() : registered_(false) {}<br>
+ TypedTestSuitePState() : registered_(false) {}<br>
<br>
// Adds the given test name to defined_test_names_ and return true<br>
- // if the test case hasn't been registered; otherwise aborts the<br>
+ // if the test suite hasn't been registered; otherwise aborts the<br>
// program.<br>
bool AddTestName(const char* file, int line, const char* case_name,<br>
const char* test_name) {<br>
if (registered_) {<br>
- fprintf(stderr, "%s Test %s must be defined before "<br>
- "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",<br>
+ fprintf(stderr,<br>
+ "%s Test %s must be defined before "<br>
+ "REGISTER_TYPED_TEST_SUITE_P(%s, ...).\n",<br>
FormatFileLocation(file, line).c_str(), test_name, case_name);<br>
fflush(stderr);<br>
posix::Abort();<br>
@@ -581,14 +617,19 @@ class GTEST_API_ TypedTestCasePState {<br>
RegisteredTestsMap registered_tests_;<br>
};<br>
<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+using TypedTestCasePState = TypedTestSuitePState;<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251<br>
<br>
// Skips to the first non-space char after the first comma in 'str';<br>
// returns NULL if no comma is found in 'str'.<br>
inline const char* SkipComma(const char* str) {<br>
const char* comma = strchr(str, ',');<br>
- if (comma == NULL) {<br>
- return NULL;<br>
+ if (comma == nullptr) {<br>
+ return nullptr;<br>
}<br>
while (IsSpace(*(++comma))) {}<br>
return comma;<br>
@@ -598,7 +639,7 @@ inline const char* SkipComma(const char* str) {<br>
// the entire string if it contains no comma.<br>
inline std::string GetPrefixUntilComma(const char* str) {<br>
const char* comma = strchr(str, ',');<br>
- return comma == NULL ? str : std::string(str, comma);<br>
+ return comma == nullptr ? str : std::string(str, comma);<br>
}<br>
<br>
// Splits a given string on a given delimiter, populating a given<br>
@@ -648,7 +689,7 @@ template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types><br>
class TypeParameterizedTest {<br>
public:<br>
// 'index' is the index of the test in the type list 'Types'<br>
- // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,<br>
+ // specified in INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, TestSuite,<br>
// Types). Valid values for 'index' are [0, N - 1] where N is the<br>
// length of Types.<br>
static bool Register(const char* prefix, const CodeLocation& code_location,<br>
@@ -663,13 +704,17 @@ class TypeParameterizedTest {<br>
// list.<br>
MakeAndRegisterTestInfo(<br>
(std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name +<br>
- "/" + type_names[index])<br>
+ "/" + type_names[static_cast<size_t>(index)])<br>
.c_str(),<br>
StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(),<br>
GetTypeName<Type>().c_str(),<br>
- NULL, // No value parameter.<br>
- code_location, GetTypeId<FixtureClass>(), TestClass::SetUpTestCase,<br>
- TestClass::TearDownTestCase, new TestFactoryImpl<TestClass>);<br>
+ nullptr, // No value parameter.<br>
+ code_location, GetTypeId<FixtureClass>(),<br>
+ SuiteApiResolver<TestClass>::GetSetUpCaseOrSuite(<br>
+ code_location.file.c_str(), code_location.line),<br>
+ SuiteApiResolver<TestClass>::GetTearDownCaseOrSuite(<br>
+ code_location.file.c_str(), code_location.line),<br>
+ new TestFactoryImpl<TestClass>);<br>
<br>
// Next, recurses (at compile time) with the tail of the type list.<br>
return TypeParameterizedTest<Fixture, TestSel,<br>
@@ -695,15 +740,15 @@ class TypeParameterizedTest<Fixture, TestSel, Types0> {<br>
}<br>
};<br>
<br>
-// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()<br>
+// TypeParameterizedTestSuite<Fixture, Tests, Types>::Register()<br>
// registers *all combinations* of 'Tests' and 'Types' with Google<br>
// Test. The return value is insignificant - we just need to return<br>
// something such that we can call this function in a namespace scope.<br>
template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types><br>
-class TypeParameterizedTestCase {<br>
+class TypeParameterizedTestSuite {<br>
public:<br>
static bool Register(const char* prefix, CodeLocation code_location,<br>
- const TypedTestCasePState* state, const char* case_name,<br>
+ const TypedTestSuitePState* state, const char* case_name,<br>
const char* test_names,<br>
const std::vector<std::string>& type_names =<br>
GenerateNames<DefaultNameGenerator, Types>()) {<br>
@@ -726,20 +771,20 @@ class TypeParameterizedTestCase {<br>
prefix, test_location, case_name, test_names, 0, type_names);<br>
<br>
// Next, recurses (at compile time) with the tail of the test list.<br>
- return TypeParameterizedTestCase<Fixture, typename Tests::Tail,<br>
- Types>::Register(prefix, code_location,<br>
- state, case_name,<br>
- SkipComma(test_names),<br>
- type_names);<br>
+ return TypeParameterizedTestSuite<Fixture, typename Tests::Tail,<br>
+ Types>::Register(prefix, code_location,<br>
+ state, case_name,<br>
+ SkipComma(test_names),<br>
+ type_names);<br>
}<br>
};<br>
<br>
// The base case for the compile time recursion.<br>
template <GTEST_TEMPLATE_ Fixture, typename Types><br>
-class TypeParameterizedTestCase<Fixture, Templates0, Types> {<br>
+class TypeParameterizedTestSuite<Fixture, Templates0, Types> {<br>
public:<br>
static bool Register(const char* /*prefix*/, const CodeLocation&,<br>
- const TypedTestCasePState* /*state*/,<br>
+ const TypedTestSuitePState* /*state*/,<br>
const char* /*case_name*/, const char* /*test_names*/,<br>
const std::vector<std::string>& =<br>
std::vector<std::string>() /*type_names*/) {<br>
@@ -802,120 +847,16 @@ class GTEST_API_ Random {<br>
GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);<br>
};<br>
<br>
-// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a<br>
-// compiler error iff T1 and T2 are <br>
diff erent types.<br>
-template <typename T1, typename T2><br>
-struct CompileAssertTypesEqual;<br>
-<br>
-template <typename T><br>
-struct CompileAssertTypesEqual<T, T> {<br>
-};<br>
-<br>
-// Removes the reference from a type if it is a reference type,<br>
-// otherwise leaves it unchanged. This is the same as<br>
-// tr1::remove_reference, which is not widely available yet.<br>
-template <typename T><br>
-struct RemoveReference { typedef T type; }; // NOLINT<br>
-template <typename T><br>
-struct RemoveReference<T&> { typedef T type; }; // NOLINT<br>
-<br>
-// A handy wrapper around RemoveReference that works when the argument<br>
-// T depends on template parameters.<br>
-#define GTEST_REMOVE_REFERENCE_(T) \<br>
- typename ::testing::internal::RemoveReference<T>::type<br>
-<br>
-// Removes const from a type if it is a const type, otherwise leaves<br>
-// it unchanged. This is the same as tr1::remove_const, which is not<br>
-// widely available yet.<br>
-template <typename T><br>
-struct RemoveConst { typedef T type; }; // NOLINT<br>
-template <typename T><br>
-struct RemoveConst<const T> { typedef T type; }; // NOLINT<br>
-<br>
-// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above<br>
-// definition to fail to remove the const in 'const int[3]' and 'const<br>
-// char[3][4]'. The following specialization works around the bug.<br>
-template <typename T, size_t N><br>
-struct RemoveConst<const T[N]> {<br>
- typedef typename RemoveConst<T>::type type[N];<br>
-};<br>
-<br>
-#if defined(_MSC_VER) && _MSC_VER < 1400<br>
-// This is the only specialization that allows VC++ 7.1 to remove const in<br>
-// 'const int[3] and 'const int[3][4]'. However, it causes trouble with GCC<br>
-// and thus needs to be conditionally compiled.<br>
-template <typename T, size_t N><br>
-struct RemoveConst<T[N]> {<br>
- typedef typename RemoveConst<T>::type type[N];<br>
-};<br>
-#endif<br>
-<br>
-// A handy wrapper around RemoveConst that works when the argument<br>
-// T depends on template parameters.<br>
-#define GTEST_REMOVE_CONST_(T) \<br>
- typename ::testing::internal::RemoveConst<T>::type<br>
-<br>
// Turns const U&, U&, const U, and U all into U.<br>
#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \<br>
- GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))<br>
-<br>
-// ImplicitlyConvertible<From, To>::value is a compile-time bool<br>
-// constant that's true iff type From can be implicitly converted to<br>
-// type To.<br>
-template <typename From, typename To><br>
-class ImplicitlyConvertible {<br>
- private:<br>
- // We need the following helper functions only for their types.<br>
- // They have no implementations.<br>
-<br>
- // MakeFrom() is an expression whose type is From. We cannot simply<br>
- // use From(), as the type From may not have a public default<br>
- // constructor.<br>
- static typename AddReference<From>::type MakeFrom();<br>
-<br>
- // These two functions are overloaded. Given an expression<br>
- // Helper(x), the compiler will pick the first version if x can be<br>
- // implicitly converted to type To; otherwise it will pick the<br>
- // second version.<br>
- //<br>
- // The first version returns a value of size 1, and the second<br>
- // version returns a value of size 2. Therefore, by checking the<br>
- // size of Helper(x), which can be done at compile time, we can tell<br>
- // which version of Helper() is used, and hence whether x can be<br>
- // implicitly converted to type To.<br>
- static char Helper(To);<br>
- static char (&Helper(...))[2]; // NOLINT<br>
-<br>
- // We have to put the 'public' section after the 'private' section,<br>
- // or MSVC refuses to compile the code.<br>
- public:<br>
-#if defined(__BORLANDC__)<br>
- // C++Builder cannot use member overload resolution during template<br>
- // instantiation. The simplest workaround is to use its C++0x type traits<br>
- // functions (C++Builder 2009 and above only).<br>
- static const bool value = __is_convertible(From, To);<br>
-#else<br>
- // MSVC warns about implicitly converting from double to int for<br>
- // possible loss of data, so we need to temporarily disable the<br>
- // warning.<br>
- GTEST_DISABLE_MSC_WARNINGS_PUSH_(4244)<br>
- static const bool value =<br>
- sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;<br>
- GTEST_DISABLE_MSC_WARNINGS_POP_()<br>
-#endif // __BORLANDC__<br>
-};<br>
-template <typename From, typename To><br>
-const bool ImplicitlyConvertible<From, To>::value;<br>
+ typename std::remove_const<typename std::remove_reference<T>::type>::type<br>
<br>
// IsAProtocolMessage<T>::value is a compile-time bool constant that's<br>
-// true iff T is type ProtocolMessage, proto2::Message, or a subclass<br>
-// of those.<br>
+// true if and only if T is type proto2::Message or a subclass of it.<br>
template <typename T><br>
struct IsAProtocolMessage<br>
: public bool_constant<<br>
- ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||<br>
- ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {<br>
-};<br>
+ std::is_convertible<const T*, const ::proto2::Message*>::value> {};<br>
<br>
// When the compiler sees expression IsContainerTest<C>(0), if C is an<br>
// STL-style container class, the first overload of IsContainerTest<br>
@@ -942,7 +883,6 @@ struct IsAProtocolMessage<br>
// IsContainerTest(typename C::const_iterator*) and<br>
// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.<br>
typedef int IsContainer;<br>
-#if GTEST_LANG_CXX11<br>
template <class C,<br>
class Iterator = decltype(::std::declval<const C&>().begin()),<br>
class = decltype(::std::declval<const C&>().end()),<br>
@@ -952,14 +892,6 @@ template <class C,<br>
IsContainer IsContainerTest(int /* dummy */) {<br>
return 0;<br>
}<br>
-#else<br>
-template <class C><br>
-IsContainer IsContainerTest(int /* dummy */,<br>
- typename C::iterator* /* it */ = NULL,<br>
- typename C::const_iterator* /* const_it */ = NULL) {<br>
- return 0;<br>
-}<br>
-#endif // GTEST_LANG_CXX11<br>
<br>
typedef char IsNotContainer;<br>
template <class C><br>
@@ -980,47 +912,30 @@ struct IsHashTable {<br>
static char test(...);<br>
<br>
public:<br>
- static const bool value = sizeof(test<T>(0, 0)) == sizeof(int);<br>
+ static const bool value = sizeof(test<T>(nullptr, nullptr)) == sizeof(int);<br>
};<br>
<br>
template <typename T><br>
const bool IsHashTable<T>::value;<br>
<br>
-template<typename T><br>
-struct VoidT {<br>
- typedef void value_type;<br>
-};<br>
-<br>
-template <typename T, typename = void><br>
-struct HasValueType : false_type {};<br>
-template <typename T><br>
-struct HasValueType<T, VoidT<typename T::value_type> > : true_type {<br>
-};<br>
-<br>
template <typename C,<br>
- bool = sizeof(IsContainerTest<C>(0)) == sizeof(IsContainer),<br>
- bool = HasValueType<C>::value><br>
+ bool = sizeof(IsContainerTest<C>(0)) == sizeof(IsContainer)><br>
struct IsRecursiveContainerImpl;<br>
<br>
-template <typename C, bool HV><br>
-struct IsRecursiveContainerImpl<C, false, HV> : public false_type {};<br>
+template <typename C><br>
+struct IsRecursiveContainerImpl<C, false> : public std::false_type {};<br>
<br>
// Since the IsRecursiveContainerImpl depends on the IsContainerTest we need to<br>
// obey the same inconsistencies as the IsContainerTest, namely check if<br>
// something is a container is relying on only const_iterator in C++11 and<br>
// is relying on both const_iterator and iterator otherwise<br>
template <typename C><br>
-struct IsRecursiveContainerImpl<C, true, false> : public false_type {};<br>
-<br>
-template <typename C><br>
-struct IsRecursiveContainerImpl<C, true, true> {<br>
- #if GTEST_LANG_CXX11<br>
- typedef typename IteratorTraits<typename C::const_iterator>::value_type<br>
- value_type;<br>
-#else<br>
- typedef typename IteratorTraits<typename C::iterator>::value_type value_type;<br>
-#endif<br>
- typedef is_same<value_type, C> type;<br>
+struct IsRecursiveContainerImpl<C, true> {<br>
+ using value_type = decltype(*std::declval<typename C::const_iterator>());<br>
+ using type =<br>
+ std::is_same<typename std::remove_const<<br>
+ typename std::remove_reference<value_type>::type>::type,<br>
+ C>;<br>
};<br>
<br>
// IsRecursiveContainer<Type> is a unary compile-time predicate that<br>
@@ -1032,13 +947,6 @@ struct IsRecursiveContainerImpl<C, true, true> {<br>
template <typename C><br>
struct IsRecursiveContainer : public IsRecursiveContainerImpl<C>::type {};<br>
<br>
-// EnableIf<condition>::type is void when 'Cond' is true, and<br>
-// undefined when 'Cond' is false. To use SFINAE to make a function<br>
-// overload only apply when a particular expression is true, add<br>
-// "typename EnableIf<expression>::type* = 0" as the last parameter.<br>
-template<bool> struct EnableIf;<br>
-template<> struct EnableIf<true> { typedef void type; }; // NOLINT<br>
-<br>
// Utilities for native arrays.<br>
<br>
// ArrayEq() compares two k-dimensional native arrays using the<br>
@@ -1161,10 +1069,9 @@ class NativeArray {<br>
}<br>
<br>
private:<br>
- enum {<br>
- kCheckTypeIsNotConstOrAReference = StaticAssertTypeEqHelper<<br>
- Element, GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>::value<br>
- };<br>
+ static_assert(!std::is_const<Element>::value, "Type must not be const");<br>
+ static_assert(!std::is_reference<Element>::value,<br>
+ "Type must not be a reference");<br>
<br>
// Initializes this object with a copy of the input.<br>
void InitCopy(const Element* array, size_t a_size) {<br>
@@ -1189,6 +1096,139 @@ class NativeArray {<br>
GTEST_DISALLOW_ASSIGN_(NativeArray);<br>
};<br>
<br>
+// Backport of std::index_sequence.<br>
+template <size_t... Is><br>
+struct IndexSequence {<br>
+ using type = IndexSequence;<br>
+};<br>
+<br>
+// Double the IndexSequence, and one if plus_one is true.<br>
+template <bool plus_one, typename T, size_t sizeofT><br>
+struct DoubleSequence;<br>
+template <size_t... I, size_t sizeofT><br>
+struct DoubleSequence<true, IndexSequence<I...>, sizeofT> {<br>
+ using type = IndexSequence<I..., (sizeofT + I)..., 2 * sizeofT>;<br>
+};<br>
+template <size_t... I, size_t sizeofT><br>
+struct DoubleSequence<false, IndexSequence<I...>, sizeofT> {<br>
+ using type = IndexSequence<I..., (sizeofT + I)...>;<br>
+};<br>
+<br>
+// Backport of std::make_index_sequence.<br>
+// It uses O(ln(N)) instantiation depth.<br>
+template <size_t N><br>
+struct MakeIndexSequence<br>
+ : DoubleSequence<N % 2 == 1, typename MakeIndexSequence<N / 2>::type,<br>
+ N / 2>::type {};<br>
+<br>
+template <><br>
+struct MakeIndexSequence<0> : IndexSequence<> {};<br>
+<br>
+// FIXME: This implementation of ElemFromList is O(1) in instantiation depth,<br>
+// but it is O(N^2) in total instantiations. Not sure if this is the best<br>
+// tradeoff, as it will make it somewhat slow to compile.<br>
+template <typename T, size_t, size_t><br>
+struct ElemFromListImpl {};<br>
+<br>
+template <typename T, size_t I><br>
+struct ElemFromListImpl<T, I, I> {<br>
+ using type = T;<br>
+};<br>
+<br>
+// Get the Nth element from T...<br>
+// It uses O(1) instantiation depth.<br>
+template <size_t N, typename I, typename... T><br>
+struct ElemFromList;<br>
+<br>
+template <size_t N, size_t... I, typename... T><br>
+struct ElemFromList<N, IndexSequence<I...>, T...><br>
+ : ElemFromListImpl<T, N, I>... {};<br>
+<br>
+template <typename... T><br>
+class FlatTuple;<br>
+<br>
+template <typename Derived, size_t I><br>
+struct FlatTupleElemBase;<br>
+<br>
+template <typename... T, size_t I><br>
+struct FlatTupleElemBase<FlatTuple<T...>, I> {<br>
+ using value_type =<br>
+ typename ElemFromList<I, typename MakeIndexSequence<sizeof...(T)>::type,<br>
+ T...>::type;<br>
+ FlatTupleElemBase() = default;<br>
+ explicit FlatTupleElemBase(value_type t) : value(std::move(t)) {}<br>
+ value_type value;<br>
+};<br>
+<br>
+template <typename Derived, typename Idx><br>
+struct FlatTupleBase;<br>
+<br>
+template <size_t... Idx, typename... T><br>
+struct FlatTupleBase<FlatTuple<T...>, IndexSequence<Idx...>><br>
+ : FlatTupleElemBase<FlatTuple<T...>, Idx>... {<br>
+ using Indices = IndexSequence<Idx...>;<br>
+ FlatTupleBase() = default;<br>
+ explicit FlatTupleBase(T... t)<br>
+ : FlatTupleElemBase<FlatTuple<T...>, Idx>(std::move(t))... {}<br>
+};<br>
+<br>
+// Analog to std::tuple but with <br>
diff erent tradeoffs.<br>
+// This class minimizes the template instantiation depth, thus allowing more<br>
+// elements that std::tuple would. std::tuple has been seen to require an<br>
+// instantiation depth of more than 10x the number of elements in some<br>
+// implementations.<br>
+// FlatTuple and ElemFromList are not recursive and have a fixed depth<br>
+// regardless of T...<br>
+// MakeIndexSequence, on the other hand, it is recursive but with an<br>
+// instantiation depth of O(ln(N)).<br>
+template <typename... T><br>
+class FlatTuple<br>
+ : private FlatTupleBase<FlatTuple<T...>,<br>
+ typename MakeIndexSequence<sizeof...(T)>::type> {<br>
+ using Indices = typename FlatTuple::FlatTupleBase::Indices;<br>
+<br>
+ public:<br>
+ FlatTuple() = default;<br>
+ explicit FlatTuple(T... t) : FlatTuple::FlatTupleBase(std::move(t)...) {}<br>
+<br>
+ template <size_t I><br>
+ const typename ElemFromList<I, Indices, T...>::type& Get() const {<br>
+ return static_cast<const FlatTupleElemBase<FlatTuple, I>*>(this)->value;<br>
+ }<br>
+<br>
+ template <size_t I><br>
+ typename ElemFromList<I, Indices, T...>::type& Get() {<br>
+ return static_cast<FlatTupleElemBase<FlatTuple, I>*>(this)->value;<br>
+ }<br>
+};<br>
+<br>
+// Utility functions to be called with static_assert to induce deprecation<br>
+// warnings.<br>
+GTEST_INTERNAL_DEPRECATED(<br>
+ "INSTANTIATE_TEST_CASE_P is deprecated, please use "<br>
+ "INSTANTIATE_TEST_SUITE_P")<br>
+constexpr bool InstantiateTestCase_P_IsDeprecated() { return true; }<br>
+<br>
+GTEST_INTERNAL_DEPRECATED(<br>
+ "TYPED_TEST_CASE_P is deprecated, please use "<br>
+ "TYPED_TEST_SUITE_P")<br>
+constexpr bool TypedTestCase_P_IsDeprecated() { return true; }<br>
+<br>
+GTEST_INTERNAL_DEPRECATED(<br>
+ "TYPED_TEST_CASE is deprecated, please use "<br>
+ "TYPED_TEST_SUITE")<br>
+constexpr bool TypedTestCaseIsDeprecated() { return true; }<br>
+<br>
+GTEST_INTERNAL_DEPRECATED(<br>
+ "REGISTER_TYPED_TEST_CASE_P is deprecated, please use "<br>
+ "REGISTER_TYPED_TEST_SUITE_P")<br>
+constexpr bool RegisterTypedTestCase_P_IsDeprecated() { return true; }<br>
+<br>
+GTEST_INTERNAL_DEPRECATED(<br>
+ "INSTANTIATE_TYPED_TEST_CASE_P is deprecated, please use "<br>
+ "INSTANTIATE_TYPED_TEST_SUITE_P")<br>
+constexpr bool InstantiateTypedTestCase_P_IsDeprecated() { return true; }<br>
+<br>
} // namespace internal<br>
} // namespace testing<br>
<br>
@@ -1208,7 +1248,10 @@ class NativeArray {<br>
#define GTEST_SUCCESS_(message) \<br>
GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)<br>
<br>
-// Suppress MSVC warning 4702 (unreachable code) for the code following<br>
+#define GTEST_SKIP_(message) \<br>
+ return GTEST_MESSAGE_(message, ::testing::TestPartResult::kSkip)<br>
+<br>
+// Suppress MSVC warning 4072 (unreachable code) for the code following<br>
// statement if it returns or throws (or doesn't return or throw in some<br>
// situations).<br>
#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \<br>
@@ -1300,31 +1343,38 @@ class NativeArray {<br>
" Actual: it does.")<br>
<br>
// Expands to the name of the class that implements the given test.<br>
-#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \<br>
- test_case_name##_##test_name##_Test<br>
+#define GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \<br>
+ test_suite_name##_##test_name##_Test<br>
<br>
// Helper macro for defining tests.<br>
-#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\<br>
-class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\<br>
- public:\<br>
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\<br>
- private:\<br>
- virtual void TestBody();\<br>
- static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(\<br>
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\<br>
-};\<br>
-\<br>
-::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\<br>
- ::test_info_ =\<br>
- ::testing::internal::MakeAndRegisterTestInfo(\<br>
- #test_case_name, #test_name, NULL, NULL, \<br>
- ::testing::internal::CodeLocation(__FILE__, __LINE__), \<br>
- (parent_id), \<br>
- parent_class::SetUpTestCase, \<br>
- parent_class::TearDownTestCase, \<br>
- new ::testing::internal::TestFactoryImpl<\<br>
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\<br>
-void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()<br>
+#define GTEST_TEST_(test_suite_name, test_name, parent_class, parent_id) \<br>
+ static_assert(sizeof(GTEST_STRINGIFY_(test_suite_name)) > 1, \<br>
+ "test_suite_name must not be empty"); \<br>
+ static_assert(sizeof(GTEST_STRINGIFY_(test_name)) > 1, \<br>
+ "test_name must not be empty"); \<br>
+ class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \<br>
+ : public parent_class { \<br>
+ public: \<br>
+ GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \<br>
+ \<br>
+ private: \<br>
+ virtual void TestBody(); \<br>
+ static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_; \<br>
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \<br>
+ test_name)); \<br>
+ }; \<br>
+ \<br>
+ ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_suite_name, \<br>
+ test_name)::test_info_ = \<br>
+ ::testing::internal::MakeAndRegisterTestInfo( \<br>
+ #test_suite_name, #test_name, nullptr, nullptr, \<br>
+ ::testing::internal::CodeLocation(__FILE__, __LINE__), (parent_id), \<br>
+ ::testing::internal::SuiteApiResolver< \<br>
+ parent_class>::GetSetUpCaseOrSuite(__FILE__, __LINE__), \<br>
+ ::testing::internal::SuiteApiResolver< \<br>
+ parent_class>::GetTearDownCaseOrSuite(__FILE__, __LINE__), \<br>
+ new ::testing::internal::TestFactoryImpl<GTEST_TEST_CLASS_NAME_( \<br>
+ test_suite_name, test_name)>); \<br>
+ void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody()<br>
<br>
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-linked_ptr.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-linked_ptr.h<br>
deleted file mode 100644<br>
index 082b87289ae17..0000000000000<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-linked_ptr.h<br>
+++ /dev/null<br>
@@ -1,243 +0,0 @@<br>
-// Copyright 2003 Google Inc.<br>
-// All rights reserved.<br>
-//<br>
-// Redistribution and use in source and binary forms, with or without<br>
-// modification, are permitted provided that the following conditions are<br>
-// met:<br>
-//<br>
-// * Redistributions of source code must retain the above copyright<br>
-// notice, this list of conditions and the following disclaimer.<br>
-// * Redistributions in binary form must reproduce the above<br>
-// copyright notice, this list of conditions and the following disclaimer<br>
-// in the documentation and/or other materials provided with the<br>
-// distribution.<br>
-// * Neither the name of Google Inc. nor the names of its<br>
-// contributors may be used to endorse or promote products derived from<br>
-// this software without specific prior written permission.<br>
-//<br>
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
-//<br>
-// A "smart" pointer type with reference tracking. Every pointer to a<br>
-// particular object is kept on a circular linked list. When the last pointer<br>
-// to an object is destroyed or reassigned, the object is deleted.<br>
-//<br>
-// Used properly, this deletes the object when the last reference goes away.<br>
-// There are several caveats:<br>
-// - Like all reference counting schemes, cycles lead to leaks.<br>
-// - Each smart pointer is actually two pointers (8 bytes instead of 4).<br>
-// - Every time a pointer is assigned, the entire list of pointers to that<br>
-// object is traversed. This class is therefore NOT SUITABLE when there<br>
-// will often be more than two or three pointers to a particular object.<br>
-// - References are only tracked as long as linked_ptr<> objects are copied.<br>
-// If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS<br>
-// will happen (double deletion).<br>
-//<br>
-// A good use of this class is storing object references in STL containers.<br>
-// You can safely put linked_ptr<> in a vector<>.<br>
-// Other uses may not be as good.<br>
-//<br>
-// Note: If you use an incomplete type with linked_ptr<>, the class<br>
-// *containing* linked_ptr<> must have a constructor and destructor (even<br>
-// if they do nothing!).<br>
-//<br>
-// Bill Gibbons suggested we use something like this.<br>
-//<br>
-// Thread Safety:<br>
-// Unlike other linked_ptr implementations, in this implementation<br>
-// a linked_ptr object is thread-safe in the sense that:<br>
-// - it's safe to copy linked_ptr objects concurrently,<br>
-// - it's safe to copy *from* a linked_ptr and read its underlying<br>
-// raw pointer (e.g. via get()) concurrently, and<br>
-// - it's safe to write to two linked_ptrs that point to the same<br>
-// shared object concurrently.<br>
-// FIXME: rename this to safe_linked_ptr to avoid<br>
-// confusion with normal linked_ptr.<br>
-<br>
-// GOOGLETEST_CM0001 DO NOT DELETE<br>
-<br>
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_<br>
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_<br>
-<br>
-#include <stdlib.h><br>
-#include <assert.h><br>
-<br>
-#include "gtest/internal/gtest-port.h"<br>
-<br>
-namespace testing {<br>
-namespace internal {<br>
-<br>
-// Protects copying of all linked_ptr objects.<br>
-GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);<br>
-<br>
-// This is used internally by all instances of linked_ptr<>. It needs to be<br>
-// a non-template class because <br>
diff erent types of linked_ptr<> can refer to<br>
-// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).<br>
-// So, it needs to be possible for <br>
diff erent types of linked_ptr to participate<br>
-// in the same circular linked list, so we need a single class type here.<br>
-//<br>
-// DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr<T>.<br>
-class linked_ptr_internal {<br>
- public:<br>
- // Create a new circle that includes only this instance.<br>
- void join_new() {<br>
- next_ = this;<br>
- }<br>
-<br>
- // Many linked_ptr operations may change p.link_ for some linked_ptr<br>
- // variable p in the same circle as this object. Therefore we need<br>
- // to prevent two such operations from occurring concurrently.<br>
- //<br>
- // Note that <br>
diff erent types of linked_ptr objects can coexist in a<br>
- // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and<br>
- // linked_ptr<Derived2>). Therefore we must use a single mutex to<br>
- // protect all linked_ptr objects. This can create serious<br>
- // contention in production code, but is acceptable in a testing<br>
- // framework.<br>
-<br>
- // Join an existing circle.<br>
- void join(linked_ptr_internal const* ptr)<br>
- GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {<br>
- MutexLock lock(&g_linked_ptr_mutex);<br>
-<br>
- linked_ptr_internal const* p = ptr;<br>
- while (p->next_ != ptr) {<br>
- assert(p->next_ != this &&<br>
- "Trying to join() a linked ring we are already in. "<br>
- "Is GMock thread safety enabled?");<br>
- p = p->next_;<br>
- }<br>
- p->next_ = this;<br>
- next_ = ptr;<br>
- }<br>
-<br>
- // Leave whatever circle we're part of. Returns true if we were the<br>
- // last member of the circle. Once this is done, you can join() another.<br>
- bool depart()<br>
- GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {<br>
- MutexLock lock(&g_linked_ptr_mutex);<br>
-<br>
- if (next_ == this) return true;<br>
- linked_ptr_internal const* p = next_;<br>
- while (p->next_ != this) {<br>
- assert(p->next_ != next_ &&<br>
- "Trying to depart() a linked ring we are not in. "<br>
- "Is GMock thread safety enabled?");<br>
- p = p->next_;<br>
- }<br>
- p->next_ = next_;<br>
- return false;<br>
- }<br>
-<br>
- private:<br>
- mutable linked_ptr_internal const* next_;<br>
-};<br>
-<br>
-template <typename T><br>
-class linked_ptr {<br>
- public:<br>
- typedef T element_type;<br>
-<br>
- // Take over ownership of a raw pointer. This should happen as soon as<br>
- // possible after the object is created.<br>
- explicit linked_ptr(T* ptr = NULL) { capture(ptr); }<br>
- ~linked_ptr() { depart(); }<br>
-<br>
- // Copy an existing linked_ptr<>, adding ourselves to the list of references.<br>
- template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }<br>
- linked_ptr(linked_ptr const& ptr) { // NOLINT<br>
- assert(&ptr != this);<br>
- copy(&ptr);<br>
- }<br>
-<br>
- // Assignment releases the old value and acquires the new.<br>
- template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {<br>
- depart();<br>
- copy(&ptr);<br>
- return *this;<br>
- }<br>
-<br>
- linked_ptr& operator=(linked_ptr const& ptr) {<br>
- if (&ptr != this) {<br>
- depart();<br>
- copy(&ptr);<br>
- }<br>
- return *this;<br>
- }<br>
-<br>
- // Smart pointer members.<br>
- void reset(T* ptr = NULL) {<br>
- depart();<br>
- capture(ptr);<br>
- }<br>
- T* get() const { return value_; }<br>
- T* operator->() const { return value_; }<br>
- T& operator*() const { return *value_; }<br>
-<br>
- bool operator==(T* p) const { return value_ == p; }<br>
- bool operator!=(T* p) const { return value_ != p; }<br>
- template <typename U><br>
- bool operator==(linked_ptr<U> const& ptr) const {<br>
- return value_ == ptr.get();<br>
- }<br>
- template <typename U><br>
- bool operator!=(linked_ptr<U> const& ptr) const {<br>
- return value_ != ptr.get();<br>
- }<br>
-<br>
- private:<br>
- template <typename U><br>
- friend class linked_ptr;<br>
-<br>
- T* value_;<br>
- linked_ptr_internal link_;<br>
-<br>
- void depart() {<br>
- if (link_.depart()) delete value_;<br>
- }<br>
-<br>
- void capture(T* ptr) {<br>
- value_ = ptr;<br>
- link_.join_new();<br>
- }<br>
-<br>
- template <typename U> void copy(linked_ptr<U> const* ptr) {<br>
- value_ = ptr->get();<br>
- if (value_)<br>
- link_.join(&ptr->link_);<br>
- else<br>
- link_.join_new();<br>
- }<br>
-};<br>
-<br>
-template<typename T> inline<br>
-bool operator==(T* ptr, const linked_ptr<T>& x) {<br>
- return ptr == x.get();<br>
-}<br>
-<br>
-template<typename T> inline<br>
-bool operator!=(T* ptr, const linked_ptr<T>& x) {<br>
- return ptr != x.get();<br>
-}<br>
-<br>
-// A function to convert T* into linked_ptr<T><br>
-// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation<br>
-// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))<br>
-template <typename T><br>
-linked_ptr<T> make_linked_ptr(T* ptr) {<br>
- return linked_ptr<T>(ptr);<br>
-}<br>
-<br>
-} // namespace internal<br>
-} // namespace testing<br>
-<br>
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util-generated.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util-generated.h<br>
deleted file mode 100644<br>
index a6f49b256ab52..0000000000000<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util-generated.h<br>
+++ /dev/null<br>
@@ -1,5565 +0,0 @@<br>
-// This file was GENERATED by command:<br>
-// pump.py gtest-param-util-generated.h.pump<br>
-// DO NOT EDIT BY HAND!!!<br>
-<br>
-// Copyright 2008 Google Inc.<br>
-// All Rights Reserved.<br>
-//<br>
-// Redistribution and use in source and binary forms, with or without<br>
-// modification, are permitted provided that the following conditions are<br>
-// met:<br>
-//<br>
-// * Redistributions of source code must retain the above copyright<br>
-// notice, this list of conditions and the following disclaimer.<br>
-// * Redistributions in binary form must reproduce the above<br>
-// copyright notice, this list of conditions and the following disclaimer<br>
-// in the documentation and/or other materials provided with the<br>
-// distribution.<br>
-// * Neither the name of Google Inc. nor the names of its<br>
-// contributors may be used to endorse or promote products derived from<br>
-// this software without specific prior written permission.<br>
-//<br>
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
-<br>
-<br>
-// Type and function utilities for implementing parameterized tests.<br>
-// This file is generated by a SCRIPT. DO NOT EDIT BY HAND!<br>
-//<br>
-// Currently Google Test supports at most 50 arguments in Values,<br>
-// and at most 10 arguments in Combine. Please contact<br>
-// <a href="mailto:googletestframework@googlegroups.com" target="_blank">googletestframework@googlegroups.com</a> if you need more.<br>
-// Please note that the number of arguments to Combine is limited<br>
-// by the maximum arity of the implementation of tuple which is<br>
-// currently set at 10.<br>
-<br>
-// GOOGLETEST_CM0001 DO NOT DELETE<br>
-<br>
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_<br>
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_<br>
-<br>
-#include "gtest/internal/gtest-param-util.h"<br>
-#include "gtest/internal/gtest-port.h"<br>
-<br>
-#ifdef __clang__<br>
-#if __has_warning("-Wdeprecated-copy")<br>
-#pragma clang diagnostic push<br>
-#pragma clang diagnostic ignored "-Wdeprecated-copy"<br>
-#endif<br>
-#endif<br>
-<br>
-namespace testing {<br>
-<br>
-// Forward declarations of ValuesIn(), which is implemented in<br>
-// include/gtest/gtest-param-test.h.<br>
-template <typename ForwardIterator><br>
-internal::ParamGenerator<<br>
- typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type><br>
-ValuesIn(ForwardIterator begin, ForwardIterator end);<br>
-<br>
-template <typename T, size_t N><br>
-internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);<br>
-<br>
-template <class Container><br>
-internal::ParamGenerator<typename Container::value_type> ValuesIn(<br>
- const Container& container);<br>
-<br>
-namespace internal {<br>
-<br>
-// Used in the Values() function to provide polymorphic capabilities.<br>
-template <typename T1><br>
-class ValueArray1 {<br>
- public:<br>
- explicit ValueArray1(T1 v1) : v1_(v1) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray1(const ValueArray1& other) : v1_(other.v1_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray1& other);<br>
-<br>
- const T1 v1_;<br>
-};<br>
-<br>
-template <typename T1, typename T2><br>
-class ValueArray2 {<br>
- public:<br>
- ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray2(const ValueArray2& other) : v1_(other.v1_), v2_(other.v2_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray2& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3><br>
-class ValueArray3 {<br>
- public:<br>
- ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray3(const ValueArray3& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray3& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4><br>
-class ValueArray4 {<br>
- public:<br>
- ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),<br>
- v4_(v4) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray4(const ValueArray4& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray4& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5><br>
-class ValueArray5 {<br>
- public:<br>
- ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),<br>
- v4_(v4), v5_(v5) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray5(const ValueArray5& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray5& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6><br>
-class ValueArray6 {<br>
- public:<br>
- ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),<br>
- v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray6(const ValueArray6& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray6& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7><br>
-class ValueArray7 {<br>
- public:<br>
- ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),<br>
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray7(const ValueArray7& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray7& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8><br>
-class ValueArray8 {<br>
- public:<br>
- ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,<br>
- T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
- v8_(v8) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray8(const ValueArray8& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray8& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9><br>
-class ValueArray9 {<br>
- public:<br>
- ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,<br>
- T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
- v8_(v8), v9_(v9) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray9(const ValueArray9& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray9& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10><br>
-class ValueArray10 {<br>
- public:<br>
- ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
- v8_(v8), v9_(v9), v10_(v10) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray10(const ValueArray10& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray10& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11><br>
-class ValueArray11 {<br>
- public:<br>
- ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),<br>
- v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray11(const ValueArray11& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray11& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12><br>
-class ValueArray12 {<br>
- public:<br>
- ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),<br>
- v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray12(const ValueArray12& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray12& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13><br>
-class ValueArray13 {<br>
- public:<br>
- ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),<br>
- v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),<br>
- v12_(v12), v13_(v13) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray13(const ValueArray13& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray13& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14><br>
-class ValueArray14 {<br>
- public:<br>
- ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),<br>
- v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
- v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray14(const ValueArray14& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray14& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15><br>
-class ValueArray15 {<br>
- public:<br>
- ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),<br>
- v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray15(const ValueArray15& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray15& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16><br>
-class ValueArray16 {<br>
- public:<br>
- ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),<br>
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),<br>
- v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),<br>
- v16_(v16) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray16(const ValueArray16& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray16& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17><br>
-class ValueArray17 {<br>
- public:<br>
- ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,<br>
- T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
- v15_(v15), v16_(v16), v17_(v17) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray17(const ValueArray17& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray17& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18><br>
-class ValueArray18 {<br>
- public:<br>
- ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
- v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray18(const ValueArray18& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray18& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19><br>
-class ValueArray19 {<br>
- public:<br>
- ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),<br>
- v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),<br>
- v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray19(const ValueArray19& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray19& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20><br>
-class ValueArray20 {<br>
- public:<br>
- ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),<br>
- v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),<br>
- v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),<br>
- v19_(v19), v20_(v20) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray20(const ValueArray20& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray20& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21><br>
-class ValueArray21 {<br>
- public:<br>
- ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),<br>
- v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),<br>
- v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),<br>
- v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray21(const ValueArray21& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray21& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22><br>
-class ValueArray22 {<br>
- public:<br>
- ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),<br>
- v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray22(const ValueArray22& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray22& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23><br>
-class ValueArray23 {<br>
- public:<br>
- ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),<br>
- v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),<br>
- v23_(v23) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray23(const ValueArray23& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray23& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24><br>
-class ValueArray24 {<br>
- public:<br>
- ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),<br>
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),<br>
- v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),<br>
- v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),<br>
- v22_(v22), v23_(v23), v24_(v24) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray24(const ValueArray24& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray24& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25><br>
-class ValueArray25 {<br>
- public:<br>
- ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,<br>
- T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray25(const ValueArray25& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray25& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26><br>
-class ValueArray26 {<br>
- public:<br>
- ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray26(const ValueArray26& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray26& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27><br>
-class ValueArray27 {<br>
- public:<br>
- ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),<br>
- v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),<br>
- v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),<br>
- v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),<br>
- v26_(v26), v27_(v27) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray27(const ValueArray27& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray27& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28><br>
-class ValueArray28 {<br>
- public:<br>
- ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),<br>
- v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),<br>
- v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),<br>
- v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),<br>
- v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray28(const ValueArray28& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray28& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29><br>
-class ValueArray29 {<br>
- public:<br>
- ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),<br>
- v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),<br>
- v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),<br>
- v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),<br>
- v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray29(const ValueArray29& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray29& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30><br>
-class ValueArray30 {<br>
- public:<br>
- ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),<br>
- v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),<br>
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),<br>
- v29_(v29), v30_(v30) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray30(const ValueArray30& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray30& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31><br>
-class ValueArray31 {<br>
- public:<br>
- ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),<br>
- v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),<br>
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),<br>
- v29_(v29), v30_(v30), v31_(v31) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray31(const ValueArray31& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray31& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32><br>
-class ValueArray32 {<br>
- public:<br>
- ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),<br>
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),<br>
- v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),<br>
- v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),<br>
- v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),<br>
- v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray32(const ValueArray32& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray32& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33><br>
-class ValueArray33 {<br>
- public:<br>
- ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,<br>
- T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),<br>
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),<br>
- v33_(v33) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray33(const ValueArray33& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray33& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34><br>
-class ValueArray34 {<br>
- public:<br>
- ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),<br>
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),<br>
- v33_(v33), v34_(v34) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray34(const ValueArray34& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray34& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35><br>
-class ValueArray35 {<br>
- public:<br>
- ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),<br>
- v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),<br>
- v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),<br>
- v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),<br>
- v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),<br>
- v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray35(const ValueArray35& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray35& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36><br>
-class ValueArray36 {<br>
- public:<br>
- ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),<br>
- v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),<br>
- v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),<br>
- v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),<br>
- v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),<br>
- v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
- static_cast<T>(v36_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray36(const ValueArray36& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_), v36_(other.v36_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray36& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
- const T36 v36_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37><br>
-class ValueArray37 {<br>
- public:<br>
- ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),<br>
- v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),<br>
- v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),<br>
- v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),<br>
- v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),<br>
- v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),<br>
- v36_(v36), v37_(v37) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
- static_cast<T>(v36_), static_cast<T>(v37_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray37(const ValueArray37& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_), v36_(other.v36_), v37_(other.v37_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray37& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
- const T36 v36_;<br>
- const T37 v37_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38><br>
-class ValueArray38 {<br>
- public:<br>
- ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),<br>
- v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),<br>
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),<br>
- v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),<br>
- v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
- static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray38(const ValueArray38& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray38& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
- const T36 v36_;<br>
- const T37 v37_;<br>
- const T38 v38_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39><br>
-class ValueArray39 {<br>
- public:<br>
- ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),<br>
- v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),<br>
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),<br>
- v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),<br>
- v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
- static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
- static_cast<T>(v39_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray39(const ValueArray39& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
- v39_(other.v39_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray39& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
- const T36 v36_;<br>
- const T37 v37_;<br>
- const T38 v38_;<br>
- const T39 v39_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40><br>
-class ValueArray40 {<br>
- public:<br>
- ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),<br>
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),<br>
- v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),<br>
- v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),<br>
- v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),<br>
- v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),<br>
- v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),<br>
- v40_(v40) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
- static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
- static_cast<T>(v39_), static_cast<T>(v40_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray40(const ValueArray40& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
- v39_(other.v39_), v40_(other.v40_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray40& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
- const T36 v36_;<br>
- const T37 v37_;<br>
- const T38 v38_;<br>
- const T39 v39_;<br>
- const T40 v40_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41><br>
-class ValueArray41 {<br>
- public:<br>
- ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,<br>
- T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),<br>
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),<br>
- v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),<br>
- v39_(v39), v40_(v40), v41_(v41) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
- static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
- static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray41(const ValueArray41& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
- v39_(other.v39_), v40_(other.v40_), v41_(other.v41_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray41& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
- const T36 v36_;<br>
- const T37 v37_;<br>
- const T38 v38_;<br>
- const T39 v39_;<br>
- const T40 v40_;<br>
- const T41 v41_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42><br>
-class ValueArray42 {<br>
- public:<br>
- ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
- T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),<br>
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),<br>
- v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),<br>
- v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
- static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
- static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
- static_cast<T>(v42_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray42(const ValueArray42& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
- v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray42& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
- const T36 v36_;<br>
- const T37 v37_;<br>
- const T38 v38_;<br>
- const T39 v39_;<br>
- const T40 v40_;<br>
- const T41 v41_;<br>
- const T42 v42_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43><br>
-class ValueArray43 {<br>
- public:<br>
- ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
- T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),<br>
- v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),<br>
- v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),<br>
- v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),<br>
- v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),<br>
- v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),<br>
- v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
- static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
- static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
- static_cast<T>(v42_), static_cast<T>(v43_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray43(const ValueArray43& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
- v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
- v43_(other.v43_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray43& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
- const T36 v36_;<br>
- const T37 v37_;<br>
- const T38 v38_;<br>
- const T39 v39_;<br>
- const T40 v40_;<br>
- const T41 v41_;<br>
- const T42 v42_;<br>
- const T43 v43_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43, typename T44><br>
-class ValueArray44 {<br>
- public:<br>
- ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
- T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),<br>
- v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),<br>
- v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),<br>
- v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),<br>
- v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),<br>
- v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),<br>
- v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),<br>
- v43_(v43), v44_(v44) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
- static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
- static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
- static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray44(const ValueArray44& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
- v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
- v43_(other.v43_), v44_(other.v44_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray44& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
- const T36 v36_;<br>
- const T37 v37_;<br>
- const T38 v38_;<br>
- const T39 v39_;<br>
- const T40 v40_;<br>
- const T41 v41_;<br>
- const T42 v42_;<br>
- const T43 v43_;<br>
- const T44 v44_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43, typename T44, typename T45><br>
-class ValueArray45 {<br>
- public:<br>
- ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
- T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),<br>
- v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),<br>
- v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),<br>
- v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),<br>
- v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),<br>
- v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),<br>
- v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),<br>
- v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
- static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
- static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
- static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),<br>
- static_cast<T>(v45_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray45(const ValueArray45& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
- v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
- v43_(other.v43_), v44_(other.v44_), v45_(other.v45_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray45& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
- const T36 v36_;<br>
- const T37 v37_;<br>
- const T38 v38_;<br>
- const T39 v39_;<br>
- const T40 v40_;<br>
- const T41 v41_;<br>
- const T42 v42_;<br>
- const T43 v43_;<br>
- const T44 v44_;<br>
- const T45 v45_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43, typename T44, typename T45,<br>
- typename T46><br>
-class ValueArray46 {<br>
- public:<br>
- ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
- T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),<br>
- v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),<br>
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),<br>
- v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),<br>
- v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),<br>
- v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
- static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
- static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
- static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),<br>
- static_cast<T>(v45_), static_cast<T>(v46_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray46(const ValueArray46& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
- v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
- v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray46& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
- const T36 v36_;<br>
- const T37 v37_;<br>
- const T38 v38_;<br>
- const T39 v39_;<br>
- const T40 v40_;<br>
- const T41 v41_;<br>
- const T42 v42_;<br>
- const T43 v43_;<br>
- const T44 v44_;<br>
- const T45 v45_;<br>
- const T46 v46_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43, typename T44, typename T45,<br>
- typename T46, typename T47><br>
-class ValueArray47 {<br>
- public:<br>
- ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
- T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),<br>
- v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),<br>
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),<br>
- v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),<br>
- v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),<br>
- v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),<br>
- v47_(v47) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
- static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
- static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
- static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),<br>
- static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray47(const ValueArray47& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
- v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
- v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_),<br>
- v47_(other.v47_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray47& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
- const T36 v36_;<br>
- const T37 v37_;<br>
- const T38 v38_;<br>
- const T39 v39_;<br>
- const T40 v40_;<br>
- const T41 v41_;<br>
- const T42 v42_;<br>
- const T43 v43_;<br>
- const T44 v44_;<br>
- const T45 v45_;<br>
- const T46 v46_;<br>
- const T47 v47_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43, typename T44, typename T45,<br>
- typename T46, typename T47, typename T48><br>
-class ValueArray48 {<br>
- public:<br>
- ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
- T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),<br>
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),<br>
- v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),<br>
- v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),<br>
- v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),<br>
- v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),<br>
- v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),<br>
- v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),<br>
- v46_(v46), v47_(v47), v48_(v48) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
- static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
- static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
- static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),<br>
- static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),<br>
- static_cast<T>(v48_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray48(const ValueArray48& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
- v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
- v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_),<br>
- v47_(other.v47_), v48_(other.v48_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray48& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
- const T36 v36_;<br>
- const T37 v37_;<br>
- const T38 v38_;<br>
- const T39 v39_;<br>
- const T40 v40_;<br>
- const T41 v41_;<br>
- const T42 v42_;<br>
- const T43 v43_;<br>
- const T44 v44_;<br>
- const T45 v45_;<br>
- const T46 v46_;<br>
- const T47 v47_;<br>
- const T48 v48_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43, typename T44, typename T45,<br>
- typename T46, typename T47, typename T48, typename T49><br>
-class ValueArray49 {<br>
- public:<br>
- ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
- T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,<br>
- T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),<br>
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),<br>
- v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),<br>
- v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),<br>
- v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
- static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
- static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
- static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),<br>
- static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),<br>
- static_cast<T>(v48_), static_cast<T>(v49_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray49(const ValueArray49& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
- v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
- v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_),<br>
- v47_(other.v47_), v48_(other.v48_), v49_(other.v49_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray49& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
- const T36 v36_;<br>
- const T37 v37_;<br>
- const T38 v38_;<br>
- const T39 v39_;<br>
- const T40 v40_;<br>
- const T41 v41_;<br>
- const T42 v42_;<br>
- const T43 v43_;<br>
- const T44 v44_;<br>
- const T45 v45_;<br>
- const T46 v46_;<br>
- const T47 v47_;<br>
- const T48 v48_;<br>
- const T49 v49_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10,<br>
- typename T11, typename T12, typename T13, typename T14, typename T15,<br>
- typename T16, typename T17, typename T18, typename T19, typename T20,<br>
- typename T21, typename T22, typename T23, typename T24, typename T25,<br>
- typename T26, typename T27, typename T28, typename T29, typename T30,<br>
- typename T31, typename T32, typename T33, typename T34, typename T35,<br>
- typename T36, typename T37, typename T38, typename T39, typename T40,<br>
- typename T41, typename T42, typename T43, typename T44, typename T45,<br>
- typename T46, typename T47, typename T48, typename T49, typename T50><br>
-class ValueArray50 {<br>
- public:<br>
- ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
- T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,<br>
- T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),<br>
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),<br>
- v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),<br>
- v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),<br>
- v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}<br>
-<br>
- template <typename T><br>
- operator ParamGenerator<T>() const {<br>
- const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
- static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
- static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
- static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
- static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
- static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
- static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
- static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
- static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
- static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
- static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
- static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
- static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
- static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
- static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),<br>
- static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),<br>
- static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};<br>
- return ValuesIn(array);<br>
- }<br>
-<br>
- ValueArray50(const ValueArray50& other) : v1_(other.v1_), v2_(other.v2_),<br>
- v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
- v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
- v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
- v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
- v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
- v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
- v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
- v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
- v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
- v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
- v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_),<br>
- v47_(other.v47_), v48_(other.v48_), v49_(other.v49_), v50_(other.v50_) {}<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const ValueArray50& other);<br>
-<br>
- const T1 v1_;<br>
- const T2 v2_;<br>
- const T3 v3_;<br>
- const T4 v4_;<br>
- const T5 v5_;<br>
- const T6 v6_;<br>
- const T7 v7_;<br>
- const T8 v8_;<br>
- const T9 v9_;<br>
- const T10 v10_;<br>
- const T11 v11_;<br>
- const T12 v12_;<br>
- const T13 v13_;<br>
- const T14 v14_;<br>
- const T15 v15_;<br>
- const T16 v16_;<br>
- const T17 v17_;<br>
- const T18 v18_;<br>
- const T19 v19_;<br>
- const T20 v20_;<br>
- const T21 v21_;<br>
- const T22 v22_;<br>
- const T23 v23_;<br>
- const T24 v24_;<br>
- const T25 v25_;<br>
- const T26 v26_;<br>
- const T27 v27_;<br>
- const T28 v28_;<br>
- const T29 v29_;<br>
- const T30 v30_;<br>
- const T31 v31_;<br>
- const T32 v32_;<br>
- const T33 v33_;<br>
- const T34 v34_;<br>
- const T35 v35_;<br>
- const T36 v36_;<br>
- const T37 v37_;<br>
- const T38 v38_;<br>
- const T39 v39_;<br>
- const T40 v40_;<br>
- const T41 v41_;<br>
- const T42 v42_;<br>
- const T43 v43_;<br>
- const T44 v44_;<br>
- const T45 v45_;<br>
- const T46 v46_;<br>
- const T47 v47_;<br>
- const T48 v48_;<br>
- const T49 v49_;<br>
- const T50 v50_;<br>
-};<br>
-<br>
-# if GTEST_HAS_COMBINE<br>
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
-//<br>
-// Generates values from the Cartesian product of values produced<br>
-// by the argument generators.<br>
-//<br>
-template <typename T1, typename T2><br>
-class CartesianProductGenerator2<br>
- : public ParamGeneratorInterface< ::testing::tuple<T1, T2> > {<br>
- public:<br>
- typedef ::testing::tuple<T1, T2> ParamType;<br>
-<br>
- CartesianProductGenerator2(const ParamGenerator<T1>& g1,<br>
- const ParamGenerator<T2>& g2)<br>
- : g1_(g1), g2_(g2) {}<br>
- virtual ~CartesianProductGenerator2() {}<br>
-<br>
- virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* End() const {<br>
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());<br>
- }<br>
-<br>
- private:<br>
- class Iterator : public ParamIteratorInterface<ParamType> {<br>
- public:<br>
- Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
- const ParamGenerator<T1>& g1,<br>
- const typename ParamGenerator<T1>::iterator& current1,<br>
- const ParamGenerator<T2>& g2,<br>
- const typename ParamGenerator<T2>::iterator& current2)<br>
- : base_(base),<br>
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2) {<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ~Iterator() {}<br>
-<br>
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
- return base_;<br>
- }<br>
- // Advance should not be called on beyond-of-range iterators<br>
- // so no component iterators must be beyond end of range, either.<br>
- virtual void Advance() {<br>
- assert(!AtEnd());<br>
- ++current2_;<br>
- if (current2_ == end2_) {<br>
- current2_ = begin2_;<br>
- ++current1_;<br>
- }<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
- return new Iterator(*this);<br>
- }<br>
- virtual const ParamType* Current() const { return current_value_.get(); }<br>
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
- // Having the same base generator guarantees that the other<br>
- // iterator is of the same type and we can downcast.<br>
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
- << "The program attempted to compare iterators "<br>
- << "from <br>
diff erent generators." << std::endl;<br>
- const Iterator* typed_other =<br>
- CheckedDowncastToActualType<const Iterator>(&other);<br>
- // We must report iterators equal if they both point beyond their<br>
- // respective ranges. That can happen in a variety of fashions,<br>
- // so we have to consult AtEnd().<br>
- return (AtEnd() && typed_other->AtEnd()) ||<br>
- (<br>
- current1_ == typed_other->current1_ &&<br>
- current2_ == typed_other->current2_);<br>
- }<br>
-<br>
- private:<br>
- Iterator(const Iterator& other)<br>
- : base_(other.base_),<br>
- begin1_(other.begin1_),<br>
- end1_(other.end1_),<br>
- current1_(other.current1_),<br>
- begin2_(other.begin2_),<br>
- end2_(other.end2_),<br>
- current2_(other.current2_) {<br>
- ComputeCurrentValue();<br>
- }<br>
-<br>
- void ComputeCurrentValue() {<br>
- if (!AtEnd())<br>
- current_value_.reset(new ParamType(*current1_, *current2_));<br>
- }<br>
- bool AtEnd() const {<br>
- // We must report iterator past the end of the range when either of the<br>
- // component iterators has reached the end of its range.<br>
- return<br>
- current1_ == end1_ ||<br>
- current2_ == end2_;<br>
- }<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const Iterator& other);<br>
-<br>
- const ParamGeneratorInterface<ParamType>* const base_;<br>
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
- // current[i]_ is the actual traversing iterator.<br>
- const typename ParamGenerator<T1>::iterator begin1_;<br>
- const typename ParamGenerator<T1>::iterator end1_;<br>
- typename ParamGenerator<T1>::iterator current1_;<br>
- const typename ParamGenerator<T2>::iterator begin2_;<br>
- const typename ParamGenerator<T2>::iterator end2_;<br>
- typename ParamGenerator<T2>::iterator current2_;<br>
- linked_ptr<ParamType> current_value_;<br>
- }; // class CartesianProductGenerator2::Iterator<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductGenerator2& other);<br>
-<br>
- const ParamGenerator<T1> g1_;<br>
- const ParamGenerator<T2> g2_;<br>
-}; // class CartesianProductGenerator2<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3><br>
-class CartesianProductGenerator3<br>
- : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3> > {<br>
- public:<br>
- typedef ::testing::tuple<T1, T2, T3> ParamType;<br>
-<br>
- CartesianProductGenerator3(const ParamGenerator<T1>& g1,<br>
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)<br>
- : g1_(g1), g2_(g2), g3_(g3) {}<br>
- virtual ~CartesianProductGenerator3() {}<br>
-<br>
- virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
- g3_.begin());<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* End() const {<br>
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());<br>
- }<br>
-<br>
- private:<br>
- class Iterator : public ParamIteratorInterface<ParamType> {<br>
- public:<br>
- Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
- const ParamGenerator<T1>& g1,<br>
- const typename ParamGenerator<T1>::iterator& current1,<br>
- const ParamGenerator<T2>& g2,<br>
- const typename ParamGenerator<T2>::iterator& current2,<br>
- const ParamGenerator<T3>& g3,<br>
- const typename ParamGenerator<T3>::iterator& current3)<br>
- : base_(base),<br>
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3) {<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ~Iterator() {}<br>
-<br>
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
- return base_;<br>
- }<br>
- // Advance should not be called on beyond-of-range iterators<br>
- // so no component iterators must be beyond end of range, either.<br>
- virtual void Advance() {<br>
- assert(!AtEnd());<br>
- ++current3_;<br>
- if (current3_ == end3_) {<br>
- current3_ = begin3_;<br>
- ++current2_;<br>
- }<br>
- if (current2_ == end2_) {<br>
- current2_ = begin2_;<br>
- ++current1_;<br>
- }<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
- return new Iterator(*this);<br>
- }<br>
- virtual const ParamType* Current() const { return current_value_.get(); }<br>
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
- // Having the same base generator guarantees that the other<br>
- // iterator is of the same type and we can downcast.<br>
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
- << "The program attempted to compare iterators "<br>
- << "from <br>
diff erent generators." << std::endl;<br>
- const Iterator* typed_other =<br>
- CheckedDowncastToActualType<const Iterator>(&other);<br>
- // We must report iterators equal if they both point beyond their<br>
- // respective ranges. That can happen in a variety of fashions,<br>
- // so we have to consult AtEnd().<br>
- return (AtEnd() && typed_other->AtEnd()) ||<br>
- (<br>
- current1_ == typed_other->current1_ &&<br>
- current2_ == typed_other->current2_ &&<br>
- current3_ == typed_other->current3_);<br>
- }<br>
-<br>
- private:<br>
- Iterator(const Iterator& other)<br>
- : base_(other.base_),<br>
- begin1_(other.begin1_),<br>
- end1_(other.end1_),<br>
- current1_(other.current1_),<br>
- begin2_(other.begin2_),<br>
- end2_(other.end2_),<br>
- current2_(other.current2_),<br>
- begin3_(other.begin3_),<br>
- end3_(other.end3_),<br>
- current3_(other.current3_) {<br>
- ComputeCurrentValue();<br>
- }<br>
-<br>
- void ComputeCurrentValue() {<br>
- if (!AtEnd())<br>
- current_value_.reset(new ParamType(*current1_, *current2_, *current3_));<br>
- }<br>
- bool AtEnd() const {<br>
- // We must report iterator past the end of the range when either of the<br>
- // component iterators has reached the end of its range.<br>
- return<br>
- current1_ == end1_ ||<br>
- current2_ == end2_ ||<br>
- current3_ == end3_;<br>
- }<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const Iterator& other);<br>
-<br>
- const ParamGeneratorInterface<ParamType>* const base_;<br>
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
- // current[i]_ is the actual traversing iterator.<br>
- const typename ParamGenerator<T1>::iterator begin1_;<br>
- const typename ParamGenerator<T1>::iterator end1_;<br>
- typename ParamGenerator<T1>::iterator current1_;<br>
- const typename ParamGenerator<T2>::iterator begin2_;<br>
- const typename ParamGenerator<T2>::iterator end2_;<br>
- typename ParamGenerator<T2>::iterator current2_;<br>
- const typename ParamGenerator<T3>::iterator begin3_;<br>
- const typename ParamGenerator<T3>::iterator end3_;<br>
- typename ParamGenerator<T3>::iterator current3_;<br>
- linked_ptr<ParamType> current_value_;<br>
- }; // class CartesianProductGenerator3::Iterator<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductGenerator3& other);<br>
-<br>
- const ParamGenerator<T1> g1_;<br>
- const ParamGenerator<T2> g2_;<br>
- const ParamGenerator<T3> g3_;<br>
-}; // class CartesianProductGenerator3<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4><br>
-class CartesianProductGenerator4<br>
- : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4> > {<br>
- public:<br>
- typedef ::testing::tuple<T1, T2, T3, T4> ParamType;<br>
-<br>
- CartesianProductGenerator4(const ParamGenerator<T1>& g1,<br>
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,<br>
- const ParamGenerator<T4>& g4)<br>
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}<br>
- virtual ~CartesianProductGenerator4() {}<br>
-<br>
- virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
- g3_.begin(), g4_, g4_.begin());<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* End() const {<br>
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),<br>
- g4_, g4_.end());<br>
- }<br>
-<br>
- private:<br>
- class Iterator : public ParamIteratorInterface<ParamType> {<br>
- public:<br>
- Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
- const ParamGenerator<T1>& g1,<br>
- const typename ParamGenerator<T1>::iterator& current1,<br>
- const ParamGenerator<T2>& g2,<br>
- const typename ParamGenerator<T2>::iterator& current2,<br>
- const ParamGenerator<T3>& g3,<br>
- const typename ParamGenerator<T3>::iterator& current3,<br>
- const ParamGenerator<T4>& g4,<br>
- const typename ParamGenerator<T4>::iterator& current4)<br>
- : base_(base),<br>
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),<br>
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4) {<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ~Iterator() {}<br>
-<br>
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
- return base_;<br>
- }<br>
- // Advance should not be called on beyond-of-range iterators<br>
- // so no component iterators must be beyond end of range, either.<br>
- virtual void Advance() {<br>
- assert(!AtEnd());<br>
- ++current4_;<br>
- if (current4_ == end4_) {<br>
- current4_ = begin4_;<br>
- ++current3_;<br>
- }<br>
- if (current3_ == end3_) {<br>
- current3_ = begin3_;<br>
- ++current2_;<br>
- }<br>
- if (current2_ == end2_) {<br>
- current2_ = begin2_;<br>
- ++current1_;<br>
- }<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
- return new Iterator(*this);<br>
- }<br>
- virtual const ParamType* Current() const { return current_value_.get(); }<br>
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
- // Having the same base generator guarantees that the other<br>
- // iterator is of the same type and we can downcast.<br>
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
- << "The program attempted to compare iterators "<br>
- << "from <br>
diff erent generators." << std::endl;<br>
- const Iterator* typed_other =<br>
- CheckedDowncastToActualType<const Iterator>(&other);<br>
- // We must report iterators equal if they both point beyond their<br>
- // respective ranges. That can happen in a variety of fashions,<br>
- // so we have to consult AtEnd().<br>
- return (AtEnd() && typed_other->AtEnd()) ||<br>
- (<br>
- current1_ == typed_other->current1_ &&<br>
- current2_ == typed_other->current2_ &&<br>
- current3_ == typed_other->current3_ &&<br>
- current4_ == typed_other->current4_);<br>
- }<br>
-<br>
- private:<br>
- Iterator(const Iterator& other)<br>
- : base_(other.base_),<br>
- begin1_(other.begin1_),<br>
- end1_(other.end1_),<br>
- current1_(other.current1_),<br>
- begin2_(other.begin2_),<br>
- end2_(other.end2_),<br>
- current2_(other.current2_),<br>
- begin3_(other.begin3_),<br>
- end3_(other.end3_),<br>
- current3_(other.current3_),<br>
- begin4_(other.begin4_),<br>
- end4_(other.end4_),<br>
- current4_(other.current4_) {<br>
- ComputeCurrentValue();<br>
- }<br>
-<br>
- void ComputeCurrentValue() {<br>
- if (!AtEnd())<br>
- current_value_.reset(new ParamType(*current1_, *current2_, *current3_,<br>
- *current4_));<br>
- }<br>
- bool AtEnd() const {<br>
- // We must report iterator past the end of the range when either of the<br>
- // component iterators has reached the end of its range.<br>
- return<br>
- current1_ == end1_ ||<br>
- current2_ == end2_ ||<br>
- current3_ == end3_ ||<br>
- current4_ == end4_;<br>
- }<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const Iterator& other);<br>
-<br>
- const ParamGeneratorInterface<ParamType>* const base_;<br>
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
- // current[i]_ is the actual traversing iterator.<br>
- const typename ParamGenerator<T1>::iterator begin1_;<br>
- const typename ParamGenerator<T1>::iterator end1_;<br>
- typename ParamGenerator<T1>::iterator current1_;<br>
- const typename ParamGenerator<T2>::iterator begin2_;<br>
- const typename ParamGenerator<T2>::iterator end2_;<br>
- typename ParamGenerator<T2>::iterator current2_;<br>
- const typename ParamGenerator<T3>::iterator begin3_;<br>
- const typename ParamGenerator<T3>::iterator end3_;<br>
- typename ParamGenerator<T3>::iterator current3_;<br>
- const typename ParamGenerator<T4>::iterator begin4_;<br>
- const typename ParamGenerator<T4>::iterator end4_;<br>
- typename ParamGenerator<T4>::iterator current4_;<br>
- linked_ptr<ParamType> current_value_;<br>
- }; // class CartesianProductGenerator4::Iterator<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductGenerator4& other);<br>
-<br>
- const ParamGenerator<T1> g1_;<br>
- const ParamGenerator<T2> g2_;<br>
- const ParamGenerator<T3> g3_;<br>
- const ParamGenerator<T4> g4_;<br>
-}; // class CartesianProductGenerator4<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5><br>
-class CartesianProductGenerator5<br>
- : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5> > {<br>
- public:<br>
- typedef ::testing::tuple<T1, T2, T3, T4, T5> ParamType;<br>
-<br>
- CartesianProductGenerator5(const ParamGenerator<T1>& g1,<br>
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,<br>
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)<br>
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}<br>
- virtual ~CartesianProductGenerator5() {}<br>
-<br>
- virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* End() const {<br>
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),<br>
- g4_, g4_.end(), g5_, g5_.end());<br>
- }<br>
-<br>
- private:<br>
- class Iterator : public ParamIteratorInterface<ParamType> {<br>
- public:<br>
- Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
- const ParamGenerator<T1>& g1,<br>
- const typename ParamGenerator<T1>::iterator& current1,<br>
- const ParamGenerator<T2>& g2,<br>
- const typename ParamGenerator<T2>::iterator& current2,<br>
- const ParamGenerator<T3>& g3,<br>
- const typename ParamGenerator<T3>::iterator& current3,<br>
- const ParamGenerator<T4>& g4,<br>
- const typename ParamGenerator<T4>::iterator& current4,<br>
- const ParamGenerator<T5>& g5,<br>
- const typename ParamGenerator<T5>::iterator& current5)<br>
- : base_(base),<br>
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),<br>
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),<br>
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5) {<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ~Iterator() {}<br>
-<br>
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
- return base_;<br>
- }<br>
- // Advance should not be called on beyond-of-range iterators<br>
- // so no component iterators must be beyond end of range, either.<br>
- virtual void Advance() {<br>
- assert(!AtEnd());<br>
- ++current5_;<br>
- if (current5_ == end5_) {<br>
- current5_ = begin5_;<br>
- ++current4_;<br>
- }<br>
- if (current4_ == end4_) {<br>
- current4_ = begin4_;<br>
- ++current3_;<br>
- }<br>
- if (current3_ == end3_) {<br>
- current3_ = begin3_;<br>
- ++current2_;<br>
- }<br>
- if (current2_ == end2_) {<br>
- current2_ = begin2_;<br>
- ++current1_;<br>
- }<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
- return new Iterator(*this);<br>
- }<br>
- virtual const ParamType* Current() const { return current_value_.get(); }<br>
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
- // Having the same base generator guarantees that the other<br>
- // iterator is of the same type and we can downcast.<br>
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
- << "The program attempted to compare iterators "<br>
- << "from <br>
diff erent generators." << std::endl;<br>
- const Iterator* typed_other =<br>
- CheckedDowncastToActualType<const Iterator>(&other);<br>
- // We must report iterators equal if they both point beyond their<br>
- // respective ranges. That can happen in a variety of fashions,<br>
- // so we have to consult AtEnd().<br>
- return (AtEnd() && typed_other->AtEnd()) ||<br>
- (<br>
- current1_ == typed_other->current1_ &&<br>
- current2_ == typed_other->current2_ &&<br>
- current3_ == typed_other->current3_ &&<br>
- current4_ == typed_other->current4_ &&<br>
- current5_ == typed_other->current5_);<br>
- }<br>
-<br>
- private:<br>
- Iterator(const Iterator& other)<br>
- : base_(other.base_),<br>
- begin1_(other.begin1_),<br>
- end1_(other.end1_),<br>
- current1_(other.current1_),<br>
- begin2_(other.begin2_),<br>
- end2_(other.end2_),<br>
- current2_(other.current2_),<br>
- begin3_(other.begin3_),<br>
- end3_(other.end3_),<br>
- current3_(other.current3_),<br>
- begin4_(other.begin4_),<br>
- end4_(other.end4_),<br>
- current4_(other.current4_),<br>
- begin5_(other.begin5_),<br>
- end5_(other.end5_),<br>
- current5_(other.current5_) {<br>
- ComputeCurrentValue();<br>
- }<br>
-<br>
- void ComputeCurrentValue() {<br>
- if (!AtEnd())<br>
- current_value_.reset(new ParamType(*current1_, *current2_, *current3_,<br>
- *current4_, *current5_));<br>
- }<br>
- bool AtEnd() const {<br>
- // We must report iterator past the end of the range when either of the<br>
- // component iterators has reached the end of its range.<br>
- return<br>
- current1_ == end1_ ||<br>
- current2_ == end2_ ||<br>
- current3_ == end3_ ||<br>
- current4_ == end4_ ||<br>
- current5_ == end5_;<br>
- }<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const Iterator& other);<br>
-<br>
- const ParamGeneratorInterface<ParamType>* const base_;<br>
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
- // current[i]_ is the actual traversing iterator.<br>
- const typename ParamGenerator<T1>::iterator begin1_;<br>
- const typename ParamGenerator<T1>::iterator end1_;<br>
- typename ParamGenerator<T1>::iterator current1_;<br>
- const typename ParamGenerator<T2>::iterator begin2_;<br>
- const typename ParamGenerator<T2>::iterator end2_;<br>
- typename ParamGenerator<T2>::iterator current2_;<br>
- const typename ParamGenerator<T3>::iterator begin3_;<br>
- const typename ParamGenerator<T3>::iterator end3_;<br>
- typename ParamGenerator<T3>::iterator current3_;<br>
- const typename ParamGenerator<T4>::iterator begin4_;<br>
- const typename ParamGenerator<T4>::iterator end4_;<br>
- typename ParamGenerator<T4>::iterator current4_;<br>
- const typename ParamGenerator<T5>::iterator begin5_;<br>
- const typename ParamGenerator<T5>::iterator end5_;<br>
- typename ParamGenerator<T5>::iterator current5_;<br>
- linked_ptr<ParamType> current_value_;<br>
- }; // class CartesianProductGenerator5::Iterator<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductGenerator5& other);<br>
-<br>
- const ParamGenerator<T1> g1_;<br>
- const ParamGenerator<T2> g2_;<br>
- const ParamGenerator<T3> g3_;<br>
- const ParamGenerator<T4> g4_;<br>
- const ParamGenerator<T5> g5_;<br>
-}; // class CartesianProductGenerator5<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6><br>
-class CartesianProductGenerator6<br>
- : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5,<br>
- T6> > {<br>
- public:<br>
- typedef ::testing::tuple<T1, T2, T3, T4, T5, T6> ParamType;<br>
-<br>
- CartesianProductGenerator6(const ParamGenerator<T1>& g1,<br>
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,<br>
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,<br>
- const ParamGenerator<T6>& g6)<br>
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}<br>
- virtual ~CartesianProductGenerator6() {}<br>
-<br>
- virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* End() const {<br>
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),<br>
- g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());<br>
- }<br>
-<br>
- private:<br>
- class Iterator : public ParamIteratorInterface<ParamType> {<br>
- public:<br>
- Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
- const ParamGenerator<T1>& g1,<br>
- const typename ParamGenerator<T1>::iterator& current1,<br>
- const ParamGenerator<T2>& g2,<br>
- const typename ParamGenerator<T2>::iterator& current2,<br>
- const ParamGenerator<T3>& g3,<br>
- const typename ParamGenerator<T3>::iterator& current3,<br>
- const ParamGenerator<T4>& g4,<br>
- const typename ParamGenerator<T4>::iterator& current4,<br>
- const ParamGenerator<T5>& g5,<br>
- const typename ParamGenerator<T5>::iterator& current5,<br>
- const ParamGenerator<T6>& g6,<br>
- const typename ParamGenerator<T6>::iterator& current6)<br>
- : base_(base),<br>
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),<br>
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),<br>
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5),<br>
- begin6_(g6.begin()), end6_(g6.end()), current6_(current6) {<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ~Iterator() {}<br>
-<br>
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
- return base_;<br>
- }<br>
- // Advance should not be called on beyond-of-range iterators<br>
- // so no component iterators must be beyond end of range, either.<br>
- virtual void Advance() {<br>
- assert(!AtEnd());<br>
- ++current6_;<br>
- if (current6_ == end6_) {<br>
- current6_ = begin6_;<br>
- ++current5_;<br>
- }<br>
- if (current5_ == end5_) {<br>
- current5_ = begin5_;<br>
- ++current4_;<br>
- }<br>
- if (current4_ == end4_) {<br>
- current4_ = begin4_;<br>
- ++current3_;<br>
- }<br>
- if (current3_ == end3_) {<br>
- current3_ = begin3_;<br>
- ++current2_;<br>
- }<br>
- if (current2_ == end2_) {<br>
- current2_ = begin2_;<br>
- ++current1_;<br>
- }<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
- return new Iterator(*this);<br>
- }<br>
- virtual const ParamType* Current() const { return current_value_.get(); }<br>
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
- // Having the same base generator guarantees that the other<br>
- // iterator is of the same type and we can downcast.<br>
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
- << "The program attempted to compare iterators "<br>
- << "from <br>
diff erent generators." << std::endl;<br>
- const Iterator* typed_other =<br>
- CheckedDowncastToActualType<const Iterator>(&other);<br>
- // We must report iterators equal if they both point beyond their<br>
- // respective ranges. That can happen in a variety of fashions,<br>
- // so we have to consult AtEnd().<br>
- return (AtEnd() && typed_other->AtEnd()) ||<br>
- (<br>
- current1_ == typed_other->current1_ &&<br>
- current2_ == typed_other->current2_ &&<br>
- current3_ == typed_other->current3_ &&<br>
- current4_ == typed_other->current4_ &&<br>
- current5_ == typed_other->current5_ &&<br>
- current6_ == typed_other->current6_);<br>
- }<br>
-<br>
- private:<br>
- Iterator(const Iterator& other)<br>
- : base_(other.base_),<br>
- begin1_(other.begin1_),<br>
- end1_(other.end1_),<br>
- current1_(other.current1_),<br>
- begin2_(other.begin2_),<br>
- end2_(other.end2_),<br>
- current2_(other.current2_),<br>
- begin3_(other.begin3_),<br>
- end3_(other.end3_),<br>
- current3_(other.current3_),<br>
- begin4_(other.begin4_),<br>
- end4_(other.end4_),<br>
- current4_(other.current4_),<br>
- begin5_(other.begin5_),<br>
- end5_(other.end5_),<br>
- current5_(other.current5_),<br>
- begin6_(other.begin6_),<br>
- end6_(other.end6_),<br>
- current6_(other.current6_) {<br>
- ComputeCurrentValue();<br>
- }<br>
-<br>
- void ComputeCurrentValue() {<br>
- if (!AtEnd())<br>
- current_value_.reset(new ParamType(*current1_, *current2_, *current3_,<br>
- *current4_, *current5_, *current6_));<br>
- }<br>
- bool AtEnd() const {<br>
- // We must report iterator past the end of the range when either of the<br>
- // component iterators has reached the end of its range.<br>
- return<br>
- current1_ == end1_ ||<br>
- current2_ == end2_ ||<br>
- current3_ == end3_ ||<br>
- current4_ == end4_ ||<br>
- current5_ == end5_ ||<br>
- current6_ == end6_;<br>
- }<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const Iterator& other);<br>
-<br>
- const ParamGeneratorInterface<ParamType>* const base_;<br>
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
- // current[i]_ is the actual traversing iterator.<br>
- const typename ParamGenerator<T1>::iterator begin1_;<br>
- const typename ParamGenerator<T1>::iterator end1_;<br>
- typename ParamGenerator<T1>::iterator current1_;<br>
- const typename ParamGenerator<T2>::iterator begin2_;<br>
- const typename ParamGenerator<T2>::iterator end2_;<br>
- typename ParamGenerator<T2>::iterator current2_;<br>
- const typename ParamGenerator<T3>::iterator begin3_;<br>
- const typename ParamGenerator<T3>::iterator end3_;<br>
- typename ParamGenerator<T3>::iterator current3_;<br>
- const typename ParamGenerator<T4>::iterator begin4_;<br>
- const typename ParamGenerator<T4>::iterator end4_;<br>
- typename ParamGenerator<T4>::iterator current4_;<br>
- const typename ParamGenerator<T5>::iterator begin5_;<br>
- const typename ParamGenerator<T5>::iterator end5_;<br>
- typename ParamGenerator<T5>::iterator current5_;<br>
- const typename ParamGenerator<T6>::iterator begin6_;<br>
- const typename ParamGenerator<T6>::iterator end6_;<br>
- typename ParamGenerator<T6>::iterator current6_;<br>
- linked_ptr<ParamType> current_value_;<br>
- }; // class CartesianProductGenerator6::Iterator<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductGenerator6& other);<br>
-<br>
- const ParamGenerator<T1> g1_;<br>
- const ParamGenerator<T2> g2_;<br>
- const ParamGenerator<T3> g3_;<br>
- const ParamGenerator<T4> g4_;<br>
- const ParamGenerator<T5> g5_;<br>
- const ParamGenerator<T6> g6_;<br>
-}; // class CartesianProductGenerator6<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7><br>
-class CartesianProductGenerator7<br>
- : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,<br>
- T7> > {<br>
- public:<br>
- typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;<br>
-<br>
- CartesianProductGenerator7(const ParamGenerator<T1>& g1,<br>
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,<br>
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,<br>
- const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)<br>
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}<br>
- virtual ~CartesianProductGenerator7() {}<br>
-<br>
- virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,<br>
- g7_.begin());<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* End() const {<br>
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),<br>
- g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());<br>
- }<br>
-<br>
- private:<br>
- class Iterator : public ParamIteratorInterface<ParamType> {<br>
- public:<br>
- Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
- const ParamGenerator<T1>& g1,<br>
- const typename ParamGenerator<T1>::iterator& current1,<br>
- const ParamGenerator<T2>& g2,<br>
- const typename ParamGenerator<T2>::iterator& current2,<br>
- const ParamGenerator<T3>& g3,<br>
- const typename ParamGenerator<T3>::iterator& current3,<br>
- const ParamGenerator<T4>& g4,<br>
- const typename ParamGenerator<T4>::iterator& current4,<br>
- const ParamGenerator<T5>& g5,<br>
- const typename ParamGenerator<T5>::iterator& current5,<br>
- const ParamGenerator<T6>& g6,<br>
- const typename ParamGenerator<T6>::iterator& current6,<br>
- const ParamGenerator<T7>& g7,<br>
- const typename ParamGenerator<T7>::iterator& current7)<br>
- : base_(base),<br>
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),<br>
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),<br>
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5),<br>
- begin6_(g6.begin()), end6_(g6.end()), current6_(current6),<br>
- begin7_(g7.begin()), end7_(g7.end()), current7_(current7) {<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ~Iterator() {}<br>
-<br>
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
- return base_;<br>
- }<br>
- // Advance should not be called on beyond-of-range iterators<br>
- // so no component iterators must be beyond end of range, either.<br>
- virtual void Advance() {<br>
- assert(!AtEnd());<br>
- ++current7_;<br>
- if (current7_ == end7_) {<br>
- current7_ = begin7_;<br>
- ++current6_;<br>
- }<br>
- if (current6_ == end6_) {<br>
- current6_ = begin6_;<br>
- ++current5_;<br>
- }<br>
- if (current5_ == end5_) {<br>
- current5_ = begin5_;<br>
- ++current4_;<br>
- }<br>
- if (current4_ == end4_) {<br>
- current4_ = begin4_;<br>
- ++current3_;<br>
- }<br>
- if (current3_ == end3_) {<br>
- current3_ = begin3_;<br>
- ++current2_;<br>
- }<br>
- if (current2_ == end2_) {<br>
- current2_ = begin2_;<br>
- ++current1_;<br>
- }<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
- return new Iterator(*this);<br>
- }<br>
- virtual const ParamType* Current() const { return current_value_.get(); }<br>
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
- // Having the same base generator guarantees that the other<br>
- // iterator is of the same type and we can downcast.<br>
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
- << "The program attempted to compare iterators "<br>
- << "from <br>
diff erent generators." << std::endl;<br>
- const Iterator* typed_other =<br>
- CheckedDowncastToActualType<const Iterator>(&other);<br>
- // We must report iterators equal if they both point beyond their<br>
- // respective ranges. That can happen in a variety of fashions,<br>
- // so we have to consult AtEnd().<br>
- return (AtEnd() && typed_other->AtEnd()) ||<br>
- (<br>
- current1_ == typed_other->current1_ &&<br>
- current2_ == typed_other->current2_ &&<br>
- current3_ == typed_other->current3_ &&<br>
- current4_ == typed_other->current4_ &&<br>
- current5_ == typed_other->current5_ &&<br>
- current6_ == typed_other->current6_ &&<br>
- current7_ == typed_other->current7_);<br>
- }<br>
-<br>
- private:<br>
- Iterator(const Iterator& other)<br>
- : base_(other.base_),<br>
- begin1_(other.begin1_),<br>
- end1_(other.end1_),<br>
- current1_(other.current1_),<br>
- begin2_(other.begin2_),<br>
- end2_(other.end2_),<br>
- current2_(other.current2_),<br>
- begin3_(other.begin3_),<br>
- end3_(other.end3_),<br>
- current3_(other.current3_),<br>
- begin4_(other.begin4_),<br>
- end4_(other.end4_),<br>
- current4_(other.current4_),<br>
- begin5_(other.begin5_),<br>
- end5_(other.end5_),<br>
- current5_(other.current5_),<br>
- begin6_(other.begin6_),<br>
- end6_(other.end6_),<br>
- current6_(other.current6_),<br>
- begin7_(other.begin7_),<br>
- end7_(other.end7_),<br>
- current7_(other.current7_) {<br>
- ComputeCurrentValue();<br>
- }<br>
-<br>
- void ComputeCurrentValue() {<br>
- if (!AtEnd())<br>
- current_value_.reset(new ParamType(*current1_, *current2_, *current3_,<br>
- *current4_, *current5_, *current6_, *current7_));<br>
- }<br>
- bool AtEnd() const {<br>
- // We must report iterator past the end of the range when either of the<br>
- // component iterators has reached the end of its range.<br>
- return<br>
- current1_ == end1_ ||<br>
- current2_ == end2_ ||<br>
- current3_ == end3_ ||<br>
- current4_ == end4_ ||<br>
- current5_ == end5_ ||<br>
- current6_ == end6_ ||<br>
- current7_ == end7_;<br>
- }<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const Iterator& other);<br>
-<br>
- const ParamGeneratorInterface<ParamType>* const base_;<br>
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
- // current[i]_ is the actual traversing iterator.<br>
- const typename ParamGenerator<T1>::iterator begin1_;<br>
- const typename ParamGenerator<T1>::iterator end1_;<br>
- typename ParamGenerator<T1>::iterator current1_;<br>
- const typename ParamGenerator<T2>::iterator begin2_;<br>
- const typename ParamGenerator<T2>::iterator end2_;<br>
- typename ParamGenerator<T2>::iterator current2_;<br>
- const typename ParamGenerator<T3>::iterator begin3_;<br>
- const typename ParamGenerator<T3>::iterator end3_;<br>
- typename ParamGenerator<T3>::iterator current3_;<br>
- const typename ParamGenerator<T4>::iterator begin4_;<br>
- const typename ParamGenerator<T4>::iterator end4_;<br>
- typename ParamGenerator<T4>::iterator current4_;<br>
- const typename ParamGenerator<T5>::iterator begin5_;<br>
- const typename ParamGenerator<T5>::iterator end5_;<br>
- typename ParamGenerator<T5>::iterator current5_;<br>
- const typename ParamGenerator<T6>::iterator begin6_;<br>
- const typename ParamGenerator<T6>::iterator end6_;<br>
- typename ParamGenerator<T6>::iterator current6_;<br>
- const typename ParamGenerator<T7>::iterator begin7_;<br>
- const typename ParamGenerator<T7>::iterator end7_;<br>
- typename ParamGenerator<T7>::iterator current7_;<br>
- linked_ptr<ParamType> current_value_;<br>
- }; // class CartesianProductGenerator7::Iterator<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductGenerator7& other);<br>
-<br>
- const ParamGenerator<T1> g1_;<br>
- const ParamGenerator<T2> g2_;<br>
- const ParamGenerator<T3> g3_;<br>
- const ParamGenerator<T4> g4_;<br>
- const ParamGenerator<T5> g5_;<br>
- const ParamGenerator<T6> g6_;<br>
- const ParamGenerator<T7> g7_;<br>
-}; // class CartesianProductGenerator7<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8><br>
-class CartesianProductGenerator8<br>
- : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,<br>
- T7, T8> > {<br>
- public:<br>
- typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;<br>
-<br>
- CartesianProductGenerator8(const ParamGenerator<T1>& g1,<br>
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,<br>
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,<br>
- const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,<br>
- const ParamGenerator<T8>& g8)<br>
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),<br>
- g8_(g8) {}<br>
- virtual ~CartesianProductGenerator8() {}<br>
-<br>
- virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,<br>
- g7_.begin(), g8_, g8_.begin());<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* End() const {<br>
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),<br>
- g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,<br>
- g8_.end());<br>
- }<br>
-<br>
- private:<br>
- class Iterator : public ParamIteratorInterface<ParamType> {<br>
- public:<br>
- Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
- const ParamGenerator<T1>& g1,<br>
- const typename ParamGenerator<T1>::iterator& current1,<br>
- const ParamGenerator<T2>& g2,<br>
- const typename ParamGenerator<T2>::iterator& current2,<br>
- const ParamGenerator<T3>& g3,<br>
- const typename ParamGenerator<T3>::iterator& current3,<br>
- const ParamGenerator<T4>& g4,<br>
- const typename ParamGenerator<T4>::iterator& current4,<br>
- const ParamGenerator<T5>& g5,<br>
- const typename ParamGenerator<T5>::iterator& current5,<br>
- const ParamGenerator<T6>& g6,<br>
- const typename ParamGenerator<T6>::iterator& current6,<br>
- const ParamGenerator<T7>& g7,<br>
- const typename ParamGenerator<T7>::iterator& current7,<br>
- const ParamGenerator<T8>& g8,<br>
- const typename ParamGenerator<T8>::iterator& current8)<br>
- : base_(base),<br>
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),<br>
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),<br>
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5),<br>
- begin6_(g6.begin()), end6_(g6.end()), current6_(current6),<br>
- begin7_(g7.begin()), end7_(g7.end()), current7_(current7),<br>
- begin8_(g8.begin()), end8_(g8.end()), current8_(current8) {<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ~Iterator() {}<br>
-<br>
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
- return base_;<br>
- }<br>
- // Advance should not be called on beyond-of-range iterators<br>
- // so no component iterators must be beyond end of range, either.<br>
- virtual void Advance() {<br>
- assert(!AtEnd());<br>
- ++current8_;<br>
- if (current8_ == end8_) {<br>
- current8_ = begin8_;<br>
- ++current7_;<br>
- }<br>
- if (current7_ == end7_) {<br>
- current7_ = begin7_;<br>
- ++current6_;<br>
- }<br>
- if (current6_ == end6_) {<br>
- current6_ = begin6_;<br>
- ++current5_;<br>
- }<br>
- if (current5_ == end5_) {<br>
- current5_ = begin5_;<br>
- ++current4_;<br>
- }<br>
- if (current4_ == end4_) {<br>
- current4_ = begin4_;<br>
- ++current3_;<br>
- }<br>
- if (current3_ == end3_) {<br>
- current3_ = begin3_;<br>
- ++current2_;<br>
- }<br>
- if (current2_ == end2_) {<br>
- current2_ = begin2_;<br>
- ++current1_;<br>
- }<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
- return new Iterator(*this);<br>
- }<br>
- virtual const ParamType* Current() const { return current_value_.get(); }<br>
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
- // Having the same base generator guarantees that the other<br>
- // iterator is of the same type and we can downcast.<br>
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
- << "The program attempted to compare iterators "<br>
- << "from <br>
diff erent generators." << std::endl;<br>
- const Iterator* typed_other =<br>
- CheckedDowncastToActualType<const Iterator>(&other);<br>
- // We must report iterators equal if they both point beyond their<br>
- // respective ranges. That can happen in a variety of fashions,<br>
- // so we have to consult AtEnd().<br>
- return (AtEnd() && typed_other->AtEnd()) ||<br>
- (<br>
- current1_ == typed_other->current1_ &&<br>
- current2_ == typed_other->current2_ &&<br>
- current3_ == typed_other->current3_ &&<br>
- current4_ == typed_other->current4_ &&<br>
- current5_ == typed_other->current5_ &&<br>
- current6_ == typed_other->current6_ &&<br>
- current7_ == typed_other->current7_ &&<br>
- current8_ == typed_other->current8_);<br>
- }<br>
-<br>
- private:<br>
- Iterator(const Iterator& other)<br>
- : base_(other.base_),<br>
- begin1_(other.begin1_),<br>
- end1_(other.end1_),<br>
- current1_(other.current1_),<br>
- begin2_(other.begin2_),<br>
- end2_(other.end2_),<br>
- current2_(other.current2_),<br>
- begin3_(other.begin3_),<br>
- end3_(other.end3_),<br>
- current3_(other.current3_),<br>
- begin4_(other.begin4_),<br>
- end4_(other.end4_),<br>
- current4_(other.current4_),<br>
- begin5_(other.begin5_),<br>
- end5_(other.end5_),<br>
- current5_(other.current5_),<br>
- begin6_(other.begin6_),<br>
- end6_(other.end6_),<br>
- current6_(other.current6_),<br>
- begin7_(other.begin7_),<br>
- end7_(other.end7_),<br>
- current7_(other.current7_),<br>
- begin8_(other.begin8_),<br>
- end8_(other.end8_),<br>
- current8_(other.current8_) {<br>
- ComputeCurrentValue();<br>
- }<br>
-<br>
- void ComputeCurrentValue() {<br>
- if (!AtEnd())<br>
- current_value_.reset(new ParamType(*current1_, *current2_, *current3_,<br>
- *current4_, *current5_, *current6_, *current7_, *current8_));<br>
- }<br>
- bool AtEnd() const {<br>
- // We must report iterator past the end of the range when either of the<br>
- // component iterators has reached the end of its range.<br>
- return<br>
- current1_ == end1_ ||<br>
- current2_ == end2_ ||<br>
- current3_ == end3_ ||<br>
- current4_ == end4_ ||<br>
- current5_ == end5_ ||<br>
- current6_ == end6_ ||<br>
- current7_ == end7_ ||<br>
- current8_ == end8_;<br>
- }<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const Iterator& other);<br>
-<br>
- const ParamGeneratorInterface<ParamType>* const base_;<br>
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
- // current[i]_ is the actual traversing iterator.<br>
- const typename ParamGenerator<T1>::iterator begin1_;<br>
- const typename ParamGenerator<T1>::iterator end1_;<br>
- typename ParamGenerator<T1>::iterator current1_;<br>
- const typename ParamGenerator<T2>::iterator begin2_;<br>
- const typename ParamGenerator<T2>::iterator end2_;<br>
- typename ParamGenerator<T2>::iterator current2_;<br>
- const typename ParamGenerator<T3>::iterator begin3_;<br>
- const typename ParamGenerator<T3>::iterator end3_;<br>
- typename ParamGenerator<T3>::iterator current3_;<br>
- const typename ParamGenerator<T4>::iterator begin4_;<br>
- const typename ParamGenerator<T4>::iterator end4_;<br>
- typename ParamGenerator<T4>::iterator current4_;<br>
- const typename ParamGenerator<T5>::iterator begin5_;<br>
- const typename ParamGenerator<T5>::iterator end5_;<br>
- typename ParamGenerator<T5>::iterator current5_;<br>
- const typename ParamGenerator<T6>::iterator begin6_;<br>
- const typename ParamGenerator<T6>::iterator end6_;<br>
- typename ParamGenerator<T6>::iterator current6_;<br>
- const typename ParamGenerator<T7>::iterator begin7_;<br>
- const typename ParamGenerator<T7>::iterator end7_;<br>
- typename ParamGenerator<T7>::iterator current7_;<br>
- const typename ParamGenerator<T8>::iterator begin8_;<br>
- const typename ParamGenerator<T8>::iterator end8_;<br>
- typename ParamGenerator<T8>::iterator current8_;<br>
- linked_ptr<ParamType> current_value_;<br>
- }; // class CartesianProductGenerator8::Iterator<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductGenerator8& other);<br>
-<br>
- const ParamGenerator<T1> g1_;<br>
- const ParamGenerator<T2> g2_;<br>
- const ParamGenerator<T3> g3_;<br>
- const ParamGenerator<T4> g4_;<br>
- const ParamGenerator<T5> g5_;<br>
- const ParamGenerator<T6> g6_;<br>
- const ParamGenerator<T7> g7_;<br>
- const ParamGenerator<T8> g8_;<br>
-}; // class CartesianProductGenerator8<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9><br>
-class CartesianProductGenerator9<br>
- : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,<br>
- T7, T8, T9> > {<br>
- public:<br>
- typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;<br>
-<br>
- CartesianProductGenerator9(const ParamGenerator<T1>& g1,<br>
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,<br>
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,<br>
- const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,<br>
- const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)<br>
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),<br>
- g9_(g9) {}<br>
- virtual ~CartesianProductGenerator9() {}<br>
-<br>
- virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,<br>
- g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* End() const {<br>
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),<br>
- g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,<br>
- g8_.end(), g9_, g9_.end());<br>
- }<br>
-<br>
- private:<br>
- class Iterator : public ParamIteratorInterface<ParamType> {<br>
- public:<br>
- Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
- const ParamGenerator<T1>& g1,<br>
- const typename ParamGenerator<T1>::iterator& current1,<br>
- const ParamGenerator<T2>& g2,<br>
- const typename ParamGenerator<T2>::iterator& current2,<br>
- const ParamGenerator<T3>& g3,<br>
- const typename ParamGenerator<T3>::iterator& current3,<br>
- const ParamGenerator<T4>& g4,<br>
- const typename ParamGenerator<T4>::iterator& current4,<br>
- const ParamGenerator<T5>& g5,<br>
- const typename ParamGenerator<T5>::iterator& current5,<br>
- const ParamGenerator<T6>& g6,<br>
- const typename ParamGenerator<T6>::iterator& current6,<br>
- const ParamGenerator<T7>& g7,<br>
- const typename ParamGenerator<T7>::iterator& current7,<br>
- const ParamGenerator<T8>& g8,<br>
- const typename ParamGenerator<T8>::iterator& current8,<br>
- const ParamGenerator<T9>& g9,<br>
- const typename ParamGenerator<T9>::iterator& current9)<br>
- : base_(base),<br>
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),<br>
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),<br>
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5),<br>
- begin6_(g6.begin()), end6_(g6.end()), current6_(current6),<br>
- begin7_(g7.begin()), end7_(g7.end()), current7_(current7),<br>
- begin8_(g8.begin()), end8_(g8.end()), current8_(current8),<br>
- begin9_(g9.begin()), end9_(g9.end()), current9_(current9) {<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ~Iterator() {}<br>
-<br>
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
- return base_;<br>
- }<br>
- // Advance should not be called on beyond-of-range iterators<br>
- // so no component iterators must be beyond end of range, either.<br>
- virtual void Advance() {<br>
- assert(!AtEnd());<br>
- ++current9_;<br>
- if (current9_ == end9_) {<br>
- current9_ = begin9_;<br>
- ++current8_;<br>
- }<br>
- if (current8_ == end8_) {<br>
- current8_ = begin8_;<br>
- ++current7_;<br>
- }<br>
- if (current7_ == end7_) {<br>
- current7_ = begin7_;<br>
- ++current6_;<br>
- }<br>
- if (current6_ == end6_) {<br>
- current6_ = begin6_;<br>
- ++current5_;<br>
- }<br>
- if (current5_ == end5_) {<br>
- current5_ = begin5_;<br>
- ++current4_;<br>
- }<br>
- if (current4_ == end4_) {<br>
- current4_ = begin4_;<br>
- ++current3_;<br>
- }<br>
- if (current3_ == end3_) {<br>
- current3_ = begin3_;<br>
- ++current2_;<br>
- }<br>
- if (current2_ == end2_) {<br>
- current2_ = begin2_;<br>
- ++current1_;<br>
- }<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
- return new Iterator(*this);<br>
- }<br>
- virtual const ParamType* Current() const { return current_value_.get(); }<br>
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
- // Having the same base generator guarantees that the other<br>
- // iterator is of the same type and we can downcast.<br>
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
- << "The program attempted to compare iterators "<br>
- << "from <br>
diff erent generators." << std::endl;<br>
- const Iterator* typed_other =<br>
- CheckedDowncastToActualType<const Iterator>(&other);<br>
- // We must report iterators equal if they both point beyond their<br>
- // respective ranges. That can happen in a variety of fashions,<br>
- // so we have to consult AtEnd().<br>
- return (AtEnd() && typed_other->AtEnd()) ||<br>
- (<br>
- current1_ == typed_other->current1_ &&<br>
- current2_ == typed_other->current2_ &&<br>
- current3_ == typed_other->current3_ &&<br>
- current4_ == typed_other->current4_ &&<br>
- current5_ == typed_other->current5_ &&<br>
- current6_ == typed_other->current6_ &&<br>
- current7_ == typed_other->current7_ &&<br>
- current8_ == typed_other->current8_ &&<br>
- current9_ == typed_other->current9_);<br>
- }<br>
-<br>
- private:<br>
- Iterator(const Iterator& other)<br>
- : base_(other.base_),<br>
- begin1_(other.begin1_),<br>
- end1_(other.end1_),<br>
- current1_(other.current1_),<br>
- begin2_(other.begin2_),<br>
- end2_(other.end2_),<br>
- current2_(other.current2_),<br>
- begin3_(other.begin3_),<br>
- end3_(other.end3_),<br>
- current3_(other.current3_),<br>
- begin4_(other.begin4_),<br>
- end4_(other.end4_),<br>
- current4_(other.current4_),<br>
- begin5_(other.begin5_),<br>
- end5_(other.end5_),<br>
- current5_(other.current5_),<br>
- begin6_(other.begin6_),<br>
- end6_(other.end6_),<br>
- current6_(other.current6_),<br>
- begin7_(other.begin7_),<br>
- end7_(other.end7_),<br>
- current7_(other.current7_),<br>
- begin8_(other.begin8_),<br>
- end8_(other.end8_),<br>
- current8_(other.current8_),<br>
- begin9_(other.begin9_),<br>
- end9_(other.end9_),<br>
- current9_(other.current9_) {<br>
- ComputeCurrentValue();<br>
- }<br>
-<br>
- void ComputeCurrentValue() {<br>
- if (!AtEnd())<br>
- current_value_.reset(new ParamType(*current1_, *current2_, *current3_,<br>
- *current4_, *current5_, *current6_, *current7_, *current8_,<br>
- *current9_));<br>
- }<br>
- bool AtEnd() const {<br>
- // We must report iterator past the end of the range when either of the<br>
- // component iterators has reached the end of its range.<br>
- return<br>
- current1_ == end1_ ||<br>
- current2_ == end2_ ||<br>
- current3_ == end3_ ||<br>
- current4_ == end4_ ||<br>
- current5_ == end5_ ||<br>
- current6_ == end6_ ||<br>
- current7_ == end7_ ||<br>
- current8_ == end8_ ||<br>
- current9_ == end9_;<br>
- }<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const Iterator& other);<br>
-<br>
- const ParamGeneratorInterface<ParamType>* const base_;<br>
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
- // current[i]_ is the actual traversing iterator.<br>
- const typename ParamGenerator<T1>::iterator begin1_;<br>
- const typename ParamGenerator<T1>::iterator end1_;<br>
- typename ParamGenerator<T1>::iterator current1_;<br>
- const typename ParamGenerator<T2>::iterator begin2_;<br>
- const typename ParamGenerator<T2>::iterator end2_;<br>
- typename ParamGenerator<T2>::iterator current2_;<br>
- const typename ParamGenerator<T3>::iterator begin3_;<br>
- const typename ParamGenerator<T3>::iterator end3_;<br>
- typename ParamGenerator<T3>::iterator current3_;<br>
- const typename ParamGenerator<T4>::iterator begin4_;<br>
- const typename ParamGenerator<T4>::iterator end4_;<br>
- typename ParamGenerator<T4>::iterator current4_;<br>
- const typename ParamGenerator<T5>::iterator begin5_;<br>
- const typename ParamGenerator<T5>::iterator end5_;<br>
- typename ParamGenerator<T5>::iterator current5_;<br>
- const typename ParamGenerator<T6>::iterator begin6_;<br>
- const typename ParamGenerator<T6>::iterator end6_;<br>
- typename ParamGenerator<T6>::iterator current6_;<br>
- const typename ParamGenerator<T7>::iterator begin7_;<br>
- const typename ParamGenerator<T7>::iterator end7_;<br>
- typename ParamGenerator<T7>::iterator current7_;<br>
- const typename ParamGenerator<T8>::iterator begin8_;<br>
- const typename ParamGenerator<T8>::iterator end8_;<br>
- typename ParamGenerator<T8>::iterator current8_;<br>
- const typename ParamGenerator<T9>::iterator begin9_;<br>
- const typename ParamGenerator<T9>::iterator end9_;<br>
- typename ParamGenerator<T9>::iterator current9_;<br>
- linked_ptr<ParamType> current_value_;<br>
- }; // class CartesianProductGenerator9::Iterator<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductGenerator9& other);<br>
-<br>
- const ParamGenerator<T1> g1_;<br>
- const ParamGenerator<T2> g2_;<br>
- const ParamGenerator<T3> g3_;<br>
- const ParamGenerator<T4> g4_;<br>
- const ParamGenerator<T5> g5_;<br>
- const ParamGenerator<T6> g6_;<br>
- const ParamGenerator<T7> g7_;<br>
- const ParamGenerator<T8> g8_;<br>
- const ParamGenerator<T9> g9_;<br>
-}; // class CartesianProductGenerator9<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10><br>
-class CartesianProductGenerator10<br>
- : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,<br>
- T7, T8, T9, T10> > {<br>
- public:<br>
- typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;<br>
-<br>
- CartesianProductGenerator10(const ParamGenerator<T1>& g1,<br>
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,<br>
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,<br>
- const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,<br>
- const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,<br>
- const ParamGenerator<T10>& g10)<br>
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),<br>
- g9_(g9), g10_(g10) {}<br>
- virtual ~CartesianProductGenerator10() {}<br>
-<br>
- virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,<br>
- g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* End() const {<br>
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),<br>
- g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,<br>
- g8_.end(), g9_, g9_.end(), g10_, g10_.end());<br>
- }<br>
-<br>
- private:<br>
- class Iterator : public ParamIteratorInterface<ParamType> {<br>
- public:<br>
- Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
- const ParamGenerator<T1>& g1,<br>
- const typename ParamGenerator<T1>::iterator& current1,<br>
- const ParamGenerator<T2>& g2,<br>
- const typename ParamGenerator<T2>::iterator& current2,<br>
- const ParamGenerator<T3>& g3,<br>
- const typename ParamGenerator<T3>::iterator& current3,<br>
- const ParamGenerator<T4>& g4,<br>
- const typename ParamGenerator<T4>::iterator& current4,<br>
- const ParamGenerator<T5>& g5,<br>
- const typename ParamGenerator<T5>::iterator& current5,<br>
- const ParamGenerator<T6>& g6,<br>
- const typename ParamGenerator<T6>::iterator& current6,<br>
- const ParamGenerator<T7>& g7,<br>
- const typename ParamGenerator<T7>::iterator& current7,<br>
- const ParamGenerator<T8>& g8,<br>
- const typename ParamGenerator<T8>::iterator& current8,<br>
- const ParamGenerator<T9>& g9,<br>
- const typename ParamGenerator<T9>::iterator& current9,<br>
- const ParamGenerator<T10>& g10,<br>
- const typename ParamGenerator<T10>::iterator& current10)<br>
- : base_(base),<br>
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),<br>
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),<br>
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5),<br>
- begin6_(g6.begin()), end6_(g6.end()), current6_(current6),<br>
- begin7_(g7.begin()), end7_(g7.end()), current7_(current7),<br>
- begin8_(g8.begin()), end8_(g8.end()), current8_(current8),<br>
- begin9_(g9.begin()), end9_(g9.end()), current9_(current9),<br>
- begin10_(g10.begin()), end10_(g10.end()), current10_(current10) {<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ~Iterator() {}<br>
-<br>
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
- return base_;<br>
- }<br>
- // Advance should not be called on beyond-of-range iterators<br>
- // so no component iterators must be beyond end of range, either.<br>
- virtual void Advance() {<br>
- assert(!AtEnd());<br>
- ++current10_;<br>
- if (current10_ == end10_) {<br>
- current10_ = begin10_;<br>
- ++current9_;<br>
- }<br>
- if (current9_ == end9_) {<br>
- current9_ = begin9_;<br>
- ++current8_;<br>
- }<br>
- if (current8_ == end8_) {<br>
- current8_ = begin8_;<br>
- ++current7_;<br>
- }<br>
- if (current7_ == end7_) {<br>
- current7_ = begin7_;<br>
- ++current6_;<br>
- }<br>
- if (current6_ == end6_) {<br>
- current6_ = begin6_;<br>
- ++current5_;<br>
- }<br>
- if (current5_ == end5_) {<br>
- current5_ = begin5_;<br>
- ++current4_;<br>
- }<br>
- if (current4_ == end4_) {<br>
- current4_ = begin4_;<br>
- ++current3_;<br>
- }<br>
- if (current3_ == end3_) {<br>
- current3_ = begin3_;<br>
- ++current2_;<br>
- }<br>
- if (current2_ == end2_) {<br>
- current2_ = begin2_;<br>
- ++current1_;<br>
- }<br>
- ComputeCurrentValue();<br>
- }<br>
- virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
- return new Iterator(*this);<br>
- }<br>
- virtual const ParamType* Current() const { return current_value_.get(); }<br>
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
- // Having the same base generator guarantees that the other<br>
- // iterator is of the same type and we can downcast.<br>
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
- << "The program attempted to compare iterators "<br>
- << "from <br>
diff erent generators." << std::endl;<br>
- const Iterator* typed_other =<br>
- CheckedDowncastToActualType<const Iterator>(&other);<br>
- // We must report iterators equal if they both point beyond their<br>
- // respective ranges. That can happen in a variety of fashions,<br>
- // so we have to consult AtEnd().<br>
- return (AtEnd() && typed_other->AtEnd()) ||<br>
- (<br>
- current1_ == typed_other->current1_ &&<br>
- current2_ == typed_other->current2_ &&<br>
- current3_ == typed_other->current3_ &&<br>
- current4_ == typed_other->current4_ &&<br>
- current5_ == typed_other->current5_ &&<br>
- current6_ == typed_other->current6_ &&<br>
- current7_ == typed_other->current7_ &&<br>
- current8_ == typed_other->current8_ &&<br>
- current9_ == typed_other->current9_ &&<br>
- current10_ == typed_other->current10_);<br>
- }<br>
-<br>
- private:<br>
- Iterator(const Iterator& other)<br>
- : base_(other.base_),<br>
- begin1_(other.begin1_),<br>
- end1_(other.end1_),<br>
- current1_(other.current1_),<br>
- begin2_(other.begin2_),<br>
- end2_(other.end2_),<br>
- current2_(other.current2_),<br>
- begin3_(other.begin3_),<br>
- end3_(other.end3_),<br>
- current3_(other.current3_),<br>
- begin4_(other.begin4_),<br>
- end4_(other.end4_),<br>
- current4_(other.current4_),<br>
- begin5_(other.begin5_),<br>
- end5_(other.end5_),<br>
- current5_(other.current5_),<br>
- begin6_(other.begin6_),<br>
- end6_(other.end6_),<br>
- current6_(other.current6_),<br>
- begin7_(other.begin7_),<br>
- end7_(other.end7_),<br>
- current7_(other.current7_),<br>
- begin8_(other.begin8_),<br>
- end8_(other.end8_),<br>
- current8_(other.current8_),<br>
- begin9_(other.begin9_),<br>
- end9_(other.end9_),<br>
- current9_(other.current9_),<br>
- begin10_(other.begin10_),<br>
- end10_(other.end10_),<br>
- current10_(other.current10_) {<br>
- ComputeCurrentValue();<br>
- }<br>
-<br>
- void ComputeCurrentValue() {<br>
- if (!AtEnd())<br>
- current_value_.reset(new ParamType(*current1_, *current2_, *current3_,<br>
- *current4_, *current5_, *current6_, *current7_, *current8_,<br>
- *current9_, *current10_));<br>
- }<br>
- bool AtEnd() const {<br>
- // We must report iterator past the end of the range when either of the<br>
- // component iterators has reached the end of its range.<br>
- return<br>
- current1_ == end1_ ||<br>
- current2_ == end2_ ||<br>
- current3_ == end3_ ||<br>
- current4_ == end4_ ||<br>
- current5_ == end5_ ||<br>
- current6_ == end6_ ||<br>
- current7_ == end7_ ||<br>
- current8_ == end8_ ||<br>
- current9_ == end9_ ||<br>
- current10_ == end10_;<br>
- }<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const Iterator& other);<br>
-<br>
- const ParamGeneratorInterface<ParamType>* const base_;<br>
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
- // current[i]_ is the actual traversing iterator.<br>
- const typename ParamGenerator<T1>::iterator begin1_;<br>
- const typename ParamGenerator<T1>::iterator end1_;<br>
- typename ParamGenerator<T1>::iterator current1_;<br>
- const typename ParamGenerator<T2>::iterator begin2_;<br>
- const typename ParamGenerator<T2>::iterator end2_;<br>
- typename ParamGenerator<T2>::iterator current2_;<br>
- const typename ParamGenerator<T3>::iterator begin3_;<br>
- const typename ParamGenerator<T3>::iterator end3_;<br>
- typename ParamGenerator<T3>::iterator current3_;<br>
- const typename ParamGenerator<T4>::iterator begin4_;<br>
- const typename ParamGenerator<T4>::iterator end4_;<br>
- typename ParamGenerator<T4>::iterator current4_;<br>
- const typename ParamGenerator<T5>::iterator begin5_;<br>
- const typename ParamGenerator<T5>::iterator end5_;<br>
- typename ParamGenerator<T5>::iterator current5_;<br>
- const typename ParamGenerator<T6>::iterator begin6_;<br>
- const typename ParamGenerator<T6>::iterator end6_;<br>
- typename ParamGenerator<T6>::iterator current6_;<br>
- const typename ParamGenerator<T7>::iterator begin7_;<br>
- const typename ParamGenerator<T7>::iterator end7_;<br>
- typename ParamGenerator<T7>::iterator current7_;<br>
- const typename ParamGenerator<T8>::iterator begin8_;<br>
- const typename ParamGenerator<T8>::iterator end8_;<br>
- typename ParamGenerator<T8>::iterator current8_;<br>
- const typename ParamGenerator<T9>::iterator begin9_;<br>
- const typename ParamGenerator<T9>::iterator end9_;<br>
- typename ParamGenerator<T9>::iterator current9_;<br>
- const typename ParamGenerator<T10>::iterator begin10_;<br>
- const typename ParamGenerator<T10>::iterator end10_;<br>
- typename ParamGenerator<T10>::iterator current10_;<br>
- linked_ptr<ParamType> current_value_;<br>
- }; // class CartesianProductGenerator10::Iterator<br>
-<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductGenerator10& other);<br>
-<br>
- const ParamGenerator<T1> g1_;<br>
- const ParamGenerator<T2> g2_;<br>
- const ParamGenerator<T3> g3_;<br>
- const ParamGenerator<T4> g4_;<br>
- const ParamGenerator<T5> g5_;<br>
- const ParamGenerator<T6> g6_;<br>
- const ParamGenerator<T7> g7_;<br>
- const ParamGenerator<T8> g8_;<br>
- const ParamGenerator<T9> g9_;<br>
- const ParamGenerator<T10> g10_;<br>
-}; // class CartesianProductGenerator10<br>
-<br>
-<br>
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
-//<br>
-// Helper classes providing Combine() with polymorphic features. They allow<br>
-// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is<br>
-// convertible to U.<br>
-//<br>
-template <class Generator1, class Generator2><br>
-class CartesianProductHolder2 {<br>
- public:<br>
-CartesianProductHolder2(const Generator1& g1, const Generator2& g2)<br>
- : g1_(g1), g2_(g2) {}<br>
- template <typename T1, typename T2><br>
- operator ParamGenerator< ::testing::tuple<T1, T2> >() const {<br>
- return ParamGenerator< ::testing::tuple<T1, T2> >(<br>
- new CartesianProductGenerator2<T1, T2>(<br>
- static_cast<ParamGenerator<T1> >(g1_),<br>
- static_cast<ParamGenerator<T2> >(g2_)));<br>
- }<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductHolder2& other);<br>
-<br>
- const Generator1 g1_;<br>
- const Generator2 g2_;<br>
-}; // class CartesianProductHolder2<br>
-<br>
-template <class Generator1, class Generator2, class Generator3><br>
-class CartesianProductHolder3 {<br>
- public:<br>
-CartesianProductHolder3(const Generator1& g1, const Generator2& g2,<br>
- const Generator3& g3)<br>
- : g1_(g1), g2_(g2), g3_(g3) {}<br>
- template <typename T1, typename T2, typename T3><br>
- operator ParamGenerator< ::testing::tuple<T1, T2, T3> >() const {<br>
- return ParamGenerator< ::testing::tuple<T1, T2, T3> >(<br>
- new CartesianProductGenerator3<T1, T2, T3>(<br>
- static_cast<ParamGenerator<T1> >(g1_),<br>
- static_cast<ParamGenerator<T2> >(g2_),<br>
- static_cast<ParamGenerator<T3> >(g3_)));<br>
- }<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductHolder3& other);<br>
-<br>
- const Generator1 g1_;<br>
- const Generator2 g2_;<br>
- const Generator3 g3_;<br>
-}; // class CartesianProductHolder3<br>
-<br>
-template <class Generator1, class Generator2, class Generator3,<br>
- class Generator4><br>
-class CartesianProductHolder4 {<br>
- public:<br>
-CartesianProductHolder4(const Generator1& g1, const Generator2& g2,<br>
- const Generator3& g3, const Generator4& g4)<br>
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}<br>
- template <typename T1, typename T2, typename T3, typename T4><br>
- operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4> >() const {<br>
- return ParamGenerator< ::testing::tuple<T1, T2, T3, T4> >(<br>
- new CartesianProductGenerator4<T1, T2, T3, T4>(<br>
- static_cast<ParamGenerator<T1> >(g1_),<br>
- static_cast<ParamGenerator<T2> >(g2_),<br>
- static_cast<ParamGenerator<T3> >(g3_),<br>
- static_cast<ParamGenerator<T4> >(g4_)));<br>
- }<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductHolder4& other);<br>
-<br>
- const Generator1 g1_;<br>
- const Generator2 g2_;<br>
- const Generator3 g3_;<br>
- const Generator4 g4_;<br>
-}; // class CartesianProductHolder4<br>
-<br>
-template <class Generator1, class Generator2, class Generator3,<br>
- class Generator4, class Generator5><br>
-class CartesianProductHolder5 {<br>
- public:<br>
-CartesianProductHolder5(const Generator1& g1, const Generator2& g2,<br>
- const Generator3& g3, const Generator4& g4, const Generator5& g5)<br>
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}<br>
- template <typename T1, typename T2, typename T3, typename T4, typename T5><br>
- operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5> >() const {<br>
- return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5> >(<br>
- new CartesianProductGenerator5<T1, T2, T3, T4, T5>(<br>
- static_cast<ParamGenerator<T1> >(g1_),<br>
- static_cast<ParamGenerator<T2> >(g2_),<br>
- static_cast<ParamGenerator<T3> >(g3_),<br>
- static_cast<ParamGenerator<T4> >(g4_),<br>
- static_cast<ParamGenerator<T5> >(g5_)));<br>
- }<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductHolder5& other);<br>
-<br>
- const Generator1 g1_;<br>
- const Generator2 g2_;<br>
- const Generator3 g3_;<br>
- const Generator4 g4_;<br>
- const Generator5 g5_;<br>
-}; // class CartesianProductHolder5<br>
-<br>
-template <class Generator1, class Generator2, class Generator3,<br>
- class Generator4, class Generator5, class Generator6><br>
-class CartesianProductHolder6 {<br>
- public:<br>
-CartesianProductHolder6(const Generator1& g1, const Generator2& g2,<br>
- const Generator3& g3, const Generator4& g4, const Generator5& g5,<br>
- const Generator6& g6)<br>
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}<br>
- template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6><br>
- operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6> >() const {<br>
- return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6> >(<br>
- new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(<br>
- static_cast<ParamGenerator<T1> >(g1_),<br>
- static_cast<ParamGenerator<T2> >(g2_),<br>
- static_cast<ParamGenerator<T3> >(g3_),<br>
- static_cast<ParamGenerator<T4> >(g4_),<br>
- static_cast<ParamGenerator<T5> >(g5_),<br>
- static_cast<ParamGenerator<T6> >(g6_)));<br>
- }<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductHolder6& other);<br>
-<br>
- const Generator1 g1_;<br>
- const Generator2 g2_;<br>
- const Generator3 g3_;<br>
- const Generator4 g4_;<br>
- const Generator5 g5_;<br>
- const Generator6 g6_;<br>
-}; // class CartesianProductHolder6<br>
-<br>
-template <class Generator1, class Generator2, class Generator3,<br>
- class Generator4, class Generator5, class Generator6, class Generator7><br>
-class CartesianProductHolder7 {<br>
- public:<br>
-CartesianProductHolder7(const Generator1& g1, const Generator2& g2,<br>
- const Generator3& g3, const Generator4& g4, const Generator5& g5,<br>
- const Generator6& g6, const Generator7& g7)<br>
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}<br>
- template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7><br>
- operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6,<br>
- T7> >() const {<br>
- return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7> >(<br>
- new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(<br>
- static_cast<ParamGenerator<T1> >(g1_),<br>
- static_cast<ParamGenerator<T2> >(g2_),<br>
- static_cast<ParamGenerator<T3> >(g3_),<br>
- static_cast<ParamGenerator<T4> >(g4_),<br>
- static_cast<ParamGenerator<T5> >(g5_),<br>
- static_cast<ParamGenerator<T6> >(g6_),<br>
- static_cast<ParamGenerator<T7> >(g7_)));<br>
- }<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductHolder7& other);<br>
-<br>
- const Generator1 g1_;<br>
- const Generator2 g2_;<br>
- const Generator3 g3_;<br>
- const Generator4 g4_;<br>
- const Generator5 g5_;<br>
- const Generator6 g6_;<br>
- const Generator7 g7_;<br>
-}; // class CartesianProductHolder7<br>
-<br>
-template <class Generator1, class Generator2, class Generator3,<br>
- class Generator4, class Generator5, class Generator6, class Generator7,<br>
- class Generator8><br>
-class CartesianProductHolder8 {<br>
- public:<br>
-CartesianProductHolder8(const Generator1& g1, const Generator2& g2,<br>
- const Generator3& g3, const Generator4& g4, const Generator5& g5,<br>
- const Generator6& g6, const Generator7& g7, const Generator8& g8)<br>
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),<br>
- g8_(g8) {}<br>
- template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8><br>
- operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7,<br>
- T8> >() const {<br>
- return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(<br>
- new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(<br>
- static_cast<ParamGenerator<T1> >(g1_),<br>
- static_cast<ParamGenerator<T2> >(g2_),<br>
- static_cast<ParamGenerator<T3> >(g3_),<br>
- static_cast<ParamGenerator<T4> >(g4_),<br>
- static_cast<ParamGenerator<T5> >(g5_),<br>
- static_cast<ParamGenerator<T6> >(g6_),<br>
- static_cast<ParamGenerator<T7> >(g7_),<br>
- static_cast<ParamGenerator<T8> >(g8_)));<br>
- }<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductHolder8& other);<br>
-<br>
- const Generator1 g1_;<br>
- const Generator2 g2_;<br>
- const Generator3 g3_;<br>
- const Generator4 g4_;<br>
- const Generator5 g5_;<br>
- const Generator6 g6_;<br>
- const Generator7 g7_;<br>
- const Generator8 g8_;<br>
-}; // class CartesianProductHolder8<br>
-<br>
-template <class Generator1, class Generator2, class Generator3,<br>
- class Generator4, class Generator5, class Generator6, class Generator7,<br>
- class Generator8, class Generator9><br>
-class CartesianProductHolder9 {<br>
- public:<br>
-CartesianProductHolder9(const Generator1& g1, const Generator2& g2,<br>
- const Generator3& g3, const Generator4& g4, const Generator5& g5,<br>
- const Generator6& g6, const Generator7& g7, const Generator8& g8,<br>
- const Generator9& g9)<br>
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),<br>
- g9_(g9) {}<br>
- template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9><br>
- operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8,<br>
- T9> >() const {<br>
- return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8,<br>
- T9> >(<br>
- new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(<br>
- static_cast<ParamGenerator<T1> >(g1_),<br>
- static_cast<ParamGenerator<T2> >(g2_),<br>
- static_cast<ParamGenerator<T3> >(g3_),<br>
- static_cast<ParamGenerator<T4> >(g4_),<br>
- static_cast<ParamGenerator<T5> >(g5_),<br>
- static_cast<ParamGenerator<T6> >(g6_),<br>
- static_cast<ParamGenerator<T7> >(g7_),<br>
- static_cast<ParamGenerator<T8> >(g8_),<br>
- static_cast<ParamGenerator<T9> >(g9_)));<br>
- }<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductHolder9& other);<br>
-<br>
- const Generator1 g1_;<br>
- const Generator2 g2_;<br>
- const Generator3 g3_;<br>
- const Generator4 g4_;<br>
- const Generator5 g5_;<br>
- const Generator6 g6_;<br>
- const Generator7 g7_;<br>
- const Generator8 g8_;<br>
- const Generator9 g9_;<br>
-}; // class CartesianProductHolder9<br>
-<br>
-template <class Generator1, class Generator2, class Generator3,<br>
- class Generator4, class Generator5, class Generator6, class Generator7,<br>
- class Generator8, class Generator9, class Generator10><br>
-class CartesianProductHolder10 {<br>
- public:<br>
-CartesianProductHolder10(const Generator1& g1, const Generator2& g2,<br>
- const Generator3& g3, const Generator4& g4, const Generator5& g5,<br>
- const Generator6& g6, const Generator7& g7, const Generator8& g8,<br>
- const Generator9& g9, const Generator10& g10)<br>
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),<br>
- g9_(g9), g10_(g10) {}<br>
- template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
- typename T6, typename T7, typename T8, typename T9, typename T10><br>
- operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9,<br>
- T10> >() const {<br>
- return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9,<br>
- T10> >(<br>
- new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,<br>
- T10>(<br>
- static_cast<ParamGenerator<T1> >(g1_),<br>
- static_cast<ParamGenerator<T2> >(g2_),<br>
- static_cast<ParamGenerator<T3> >(g3_),<br>
- static_cast<ParamGenerator<T4> >(g4_),<br>
- static_cast<ParamGenerator<T5> >(g5_),<br>
- static_cast<ParamGenerator<T6> >(g6_),<br>
- static_cast<ParamGenerator<T7> >(g7_),<br>
- static_cast<ParamGenerator<T8> >(g8_),<br>
- static_cast<ParamGenerator<T9> >(g9_),<br>
- static_cast<ParamGenerator<T10> >(g10_)));<br>
- }<br>
-<br>
- private:<br>
- // No implementation - assignment is unsupported.<br>
- void operator=(const CartesianProductHolder10& other);<br>
-<br>
- const Generator1 g1_;<br>
- const Generator2 g2_;<br>
- const Generator3 g3_;<br>
- const Generator4 g4_;<br>
- const Generator5 g5_;<br>
- const Generator6 g6_;<br>
- const Generator7 g7_;<br>
- const Generator8 g8_;<br>
- const Generator9 g9_;<br>
- const Generator10 g10_;<br>
-}; // class CartesianProductHolder10<br>
-<br>
-# endif // GTEST_HAS_COMBINE<br>
-<br>
-} // namespace internal<br>
-} // namespace testing<br>
-<br>
-#ifdef __clang__<br>
-#if __has_warning("-Wdeprecated-copy")<br>
-#pragma clang diagnostic pop<br>
-#endif<br>
-#endif<br>
-<br>
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util.h<br>
index d64f620c4c674..97533993c0c3c 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util.h<br>
@@ -37,18 +37,19 @@<br>
<br>
#include <ctype.h><br>
<br>
+#include <cassert><br>
#include <iterator><br>
+#include <memory><br>
#include <set><br>
+#include <tuple><br>
#include <utility><br>
#include <vector><br>
<br>
#include "gtest/internal/gtest-internal.h"<br>
-#include "gtest/internal/gtest-linked_ptr.h"<br>
#include "gtest/internal/gtest-port.h"<br>
#include "gtest/gtest-printers.h"<br>
<br>
namespace testing {<br>
-<br>
// Input to a parameterized test name generator, describing a test parameter.<br>
// Consists of the parameter value and the integer parameter index.<br>
template <class ParamType><br>
@@ -72,13 +73,14 @@ struct PrintToStringParamName {<br>
namespace internal {<br>
<br>
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
-//<br>
+// Utility Functions<br>
+<br>
// Outputs a message explaining invalid registration of <br>
diff erent<br>
-// fixture class for the same test case. This may happen when<br>
+// fixture class for the same test suite. This may happen when<br>
// TEST_P macro is used to define two tests with the same name<br>
// but in <br>
diff erent namespaces.<br>
-GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,<br>
- CodeLocation code_location);<br>
+GTEST_API_ void ReportInvalidTestSuiteType(const char* test_suite_name,<br>
+ CodeLocation code_location);<br>
<br>
template <typename> class ParamGeneratorInterface;<br>
template <typename> class ParamGenerator;<br>
@@ -153,7 +155,7 @@ class ParamIterator {<br>
private:<br>
friend class ParamGenerator<T>;<br>
explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}<br>
- scoped_ptr<ParamIteratorInterface<T> > impl_;<br>
+ std::unique_ptr<ParamIteratorInterface<T> > impl_;<br>
};<br>
<br>
// ParamGeneratorInterface<T> is the binary interface to access generators<br>
@@ -192,7 +194,7 @@ class ParamGenerator {<br>
iterator end() const { return iterator(impl_->End()); }<br>
<br>
private:<br>
- linked_ptr<const ParamGeneratorInterface<T> > impl_;<br>
+ std::shared_ptr<const ParamGeneratorInterface<T> > impl_;<br>
};<br>
<br>
// Generates values from a range of two comparable values. Can be used to<br>
@@ -205,12 +207,12 @@ class RangeGenerator : public ParamGeneratorInterface<T> {<br>
RangeGenerator(T begin, T end, IncrementT step)<br>
: begin_(begin), end_(end),<br>
step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}<br>
- virtual ~RangeGenerator() {}<br>
+ ~RangeGenerator() override {}<br>
<br>
- virtual ParamIteratorInterface<T>* Begin() const {<br>
+ ParamIteratorInterface<T>* Begin() const override {<br>
return new Iterator(this, begin_, 0, step_);<br>
}<br>
- virtual ParamIteratorInterface<T>* End() const {<br>
+ ParamIteratorInterface<T>* End() const override {<br>
return new Iterator(this, end_, end_index_, step_);<br>
}<br>
<br>
@@ -220,20 +222,20 @@ class RangeGenerator : public ParamGeneratorInterface<T> {<br>
Iterator(const ParamGeneratorInterface<T>* base, T value, int index,<br>
IncrementT step)<br>
: base_(base), value_(value), index_(index), step_(step) {}<br>
- virtual ~Iterator() {}<br>
+ ~Iterator() override {}<br>
<br>
- virtual const ParamGeneratorInterface<T>* BaseGenerator() const {<br>
+ const ParamGeneratorInterface<T>* BaseGenerator() const override {<br>
return base_;<br>
}<br>
- virtual void Advance() {<br>
+ void Advance() override {<br>
value_ = static_cast<T>(value_ + step_);<br>
index_++;<br>
}<br>
- virtual ParamIteratorInterface<T>* Clone() const {<br>
+ ParamIteratorInterface<T>* Clone() const override {<br>
return new Iterator(*this);<br>
}<br>
- virtual const T* Current() const { return &value_; }<br>
- virtual bool Equals(const ParamIteratorInterface<T>& other) const {<br>
+ const T* Current() const override { return &value_; }<br>
+ bool Equals(const ParamIteratorInterface<T>& other) const override {<br>
// Having the same base generator guarantees that the other<br>
// iterator is of the same type and we can downcast.<br>
GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
@@ -290,12 +292,12 @@ class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {<br>
template <typename ForwardIterator><br>
ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)<br>
: container_(begin, end) {}<br>
- virtual ~ValuesInIteratorRangeGenerator() {}<br>
+ ~ValuesInIteratorRangeGenerator() override {}<br>
<br>
- virtual ParamIteratorInterface<T>* Begin() const {<br>
+ ParamIteratorInterface<T>* Begin() const override {<br>
return new Iterator(this, container_.begin());<br>
}<br>
- virtual ParamIteratorInterface<T>* End() const {<br>
+ ParamIteratorInterface<T>* End() const override {<br>
return new Iterator(this, container_.end());<br>
}<br>
<br>
@@ -307,16 +309,16 @@ class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {<br>
Iterator(const ParamGeneratorInterface<T>* base,<br>
typename ContainerType::const_iterator iterator)<br>
: base_(base), iterator_(iterator) {}<br>
- virtual ~Iterator() {}<br>
+ ~Iterator() override {}<br>
<br>
- virtual const ParamGeneratorInterface<T>* BaseGenerator() const {<br>
+ const ParamGeneratorInterface<T>* BaseGenerator() const override {<br>
return base_;<br>
}<br>
- virtual void Advance() {<br>
+ void Advance() override {<br>
++iterator_;<br>
value_.reset();<br>
}<br>
- virtual ParamIteratorInterface<T>* Clone() const {<br>
+ ParamIteratorInterface<T>* Clone() const override {<br>
return new Iterator(*this);<br>
}<br>
// We need to use cached value referenced by iterator_ because *iterator_<br>
@@ -326,12 +328,11 @@ class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {<br>
// can advance iterator_ beyond the end of the range, and we cannot<br>
// detect that fact. The client code, on the other hand, is<br>
// responsible for not calling Current() on an out-of-range iterator.<br>
- virtual const T* Current() const {<br>
- if (value_.get() == NULL)<br>
- value_.reset(new T(*iterator_));<br>
+ const T* Current() const override {<br>
+ if (value_.get() == nullptr) value_.reset(new T(*iterator_));<br>
return value_.get();<br>
}<br>
- virtual bool Equals(const ParamIteratorInterface<T>& other) const {<br>
+ bool Equals(const ParamIteratorInterface<T>& other) const override {<br>
// Having the same base generator guarantees that the other<br>
// iterator is of the same type and we can downcast.<br>
GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
@@ -354,9 +355,9 @@ class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {<br>
// A cached value of *iterator_. We keep it here to allow access by<br>
// pointer in the wrapping iterator's operator->().<br>
// value_ needs to be mutable to be accessed in Current().<br>
- // Use of scoped_ptr helps manage cached value's lifetime,<br>
+ // Use of std::unique_ptr helps manage cached value's lifetime,<br>
// which is bound by the lifespan of the iterator itself.<br>
- mutable scoped_ptr<const T> value_;<br>
+ mutable std::unique_ptr<const T> value_;<br>
}; // class ValuesInIteratorRangeGenerator::Iterator<br>
<br>
// No implementation - assignment is unsupported.<br>
@@ -376,25 +377,12 @@ std::string DefaultParamName(const TestParamInfo<ParamType>& info) {<br>
return name_stream.GetString();<br>
}<br>
<br>
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
-//<br>
-// Parameterized test name overload helpers, which help the<br>
-// INSTANTIATE_TEST_CASE_P macro choose between the default parameterized<br>
-// test name generator and user param name generator.<br>
-template <class ParamType, class ParamNameGenFunctor><br>
-ParamNameGenFunctor GetParamNameGen(ParamNameGenFunctor func) {<br>
- return func;<br>
-}<br>
-<br>
-template <class ParamType><br>
-struct ParamNameGenFunc {<br>
- typedef std::string Type(const TestParamInfo<ParamType>&);<br>
-};<br>
-<br>
-template <class ParamType><br>
-typename ParamNameGenFunc<ParamType>::Type *GetParamNameGen() {<br>
- return DefaultParamName;<br>
+template <typename T = int><br>
+void TestNotEmpty() {<br>
+ static_assert(sizeof(T) == 0, "Empty arguments are not allowed.");<br>
}<br>
+template <typename T = int><br>
+void TestNotEmpty(const T&) {}<br>
<br>
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
//<br>
@@ -406,7 +394,7 @@ class ParameterizedTestFactory : public TestFactoryBase {<br>
typedef typename TestClass::ParamType ParamType;<br>
explicit ParameterizedTestFactory(ParamType parameter) :<br>
parameter_(parameter) {}<br>
- virtual Test* CreateTest() {<br>
+ Test* CreateTest() override {<br>
TestClass::SetParam(¶meter_);<br>
return new TestClass();<br>
}<br>
@@ -434,19 +422,19 @@ class TestMetaFactoryBase {<br>
// TestMetaFactory creates test factories for passing into<br>
// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives<br>
// ownership of test factory pointer, same factory object cannot be passed<br>
-// into that method twice. But ParameterizedTestCaseInfo is going to call<br>
+// into that method twice. But ParameterizedTestSuiteInfo is going to call<br>
// it for each Test/Parameter value combination. Thus it needs meta factory<br>
// creator class.<br>
-template <class TestCase><br>
+template <class TestSuite><br>
class TestMetaFactory<br>
- : public TestMetaFactoryBase<typename TestCase::ParamType> {<br>
+ : public TestMetaFactoryBase<typename TestSuite::ParamType> {<br>
public:<br>
- typedef typename TestCase::ParamType ParamType;<br>
+ using ParamType = typename TestSuite::ParamType;<br>
<br>
TestMetaFactory() {}<br>
<br>
- virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {<br>
- return new ParameterizedTestFactory<TestCase>(parameter);<br>
+ TestFactoryBase* CreateTestFactory(ParamType parameter) override {<br>
+ return new ParameterizedTestFactory<TestSuite>(parameter);<br>
}<br>
<br>
private:<br>
@@ -455,93 +443,93 @@ class TestMetaFactory<br>
<br>
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
//<br>
-// ParameterizedTestCaseInfoBase is a generic interface<br>
-// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase<br>
+// ParameterizedTestSuiteInfoBase is a generic interface<br>
+// to ParameterizedTestSuiteInfo classes. ParameterizedTestSuiteInfoBase<br>
// accumulates test information provided by TEST_P macro invocations<br>
-// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations<br>
+// and generators provided by INSTANTIATE_TEST_SUITE_P macro invocations<br>
// and uses that information to register all resulting test instances<br>
-// in RegisterTests method. The ParameterizeTestCaseRegistry class holds<br>
-// a collection of pointers to the ParameterizedTestCaseInfo objects<br>
+// in RegisterTests method. The ParameterizeTestSuiteRegistry class holds<br>
+// a collection of pointers to the ParameterizedTestSuiteInfo objects<br>
// and calls RegisterTests() on each of them when asked.<br>
-class ParameterizedTestCaseInfoBase {<br>
+class ParameterizedTestSuiteInfoBase {<br>
public:<br>
- virtual ~ParameterizedTestCaseInfoBase() {}<br>
+ virtual ~ParameterizedTestSuiteInfoBase() {}<br>
<br>
- // Base part of test case name for display purposes.<br>
- virtual const std::string& GetTestCaseName() const = 0;<br>
+ // Base part of test suite name for display purposes.<br>
+ virtual const std::string& GetTestSuiteName() const = 0;<br>
// Test case id to verify identity.<br>
- virtual TypeId GetTestCaseTypeId() const = 0;<br>
+ virtual TypeId GetTestSuiteTypeId() const = 0;<br>
// UnitTest class invokes this method to register tests in this<br>
- // test case right before running them in RUN_ALL_TESTS macro.<br>
- // This method should not be called more then once on any single<br>
- // instance of a ParameterizedTestCaseInfoBase derived class.<br>
+ // test suite right before running them in RUN_ALL_TESTS macro.<br>
+ // This method should not be called more than once on any single<br>
+ // instance of a ParameterizedTestSuiteInfoBase derived class.<br>
virtual void RegisterTests() = 0;<br>
<br>
protected:<br>
- ParameterizedTestCaseInfoBase() {}<br>
+ ParameterizedTestSuiteInfoBase() {}<br>
<br>
private:<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);<br>
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfoBase);<br>
};<br>
<br>
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
//<br>
-// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P<br>
-// macro invocations for a particular test case and generators<br>
-// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that<br>
-// test case. It registers tests with all values generated by all<br>
+// ParameterizedTestSuiteInfo accumulates tests obtained from TEST_P<br>
+// macro invocations for a particular test suite and generators<br>
+// obtained from INSTANTIATE_TEST_SUITE_P macro invocations for that<br>
+// test suite. It registers tests with all values generated by all<br>
// generators when asked.<br>
-template <class TestCase><br>
-class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {<br>
+template <class TestSuite><br>
+class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase {<br>
public:<br>
// ParamType and GeneratorCreationFunc are private types but are required<br>
// for declarations of public methods AddTestPattern() and<br>
- // AddTestCaseInstantiation().<br>
- typedef typename TestCase::ParamType ParamType;<br>
+ // AddTestSuiteInstantiation().<br>
+ using ParamType = typename TestSuite::ParamType;<br>
// A function that returns an instance of appropriate generator type.<br>
typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();<br>
- typedef typename ParamNameGenFunc<ParamType>::Type ParamNameGeneratorFunc;<br>
+ using ParamNameGeneratorFunc = std::string(const TestParamInfo<ParamType>&);<br>
<br>
- explicit ParameterizedTestCaseInfo(<br>
- const char* name, CodeLocation code_location)<br>
- : test_case_name_(name), code_location_(code_location) {}<br>
+ explicit ParameterizedTestSuiteInfo(const char* name,<br>
+ CodeLocation code_location)<br>
+ : test_suite_name_(name), code_location_(code_location) {}<br>
<br>
// Test case base name for display purposes.<br>
- virtual const std::string& GetTestCaseName() const { return test_case_name_; }<br>
+ const std::string& GetTestSuiteName() const override {<br>
+ return test_suite_name_;<br>
+ }<br>
// Test case id to verify identity.<br>
- virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }<br>
+ TypeId GetTestSuiteTypeId() const override { return GetTypeId<TestSuite>(); }<br>
// TEST_P macro uses AddTestPattern() to record information<br>
// about a single test in a LocalTestInfo structure.<br>
- // test_case_name is the base name of the test case (without invocation<br>
+ // test_suite_name is the base name of the test suite (without invocation<br>
// prefix). test_base_name is the name of an individual test without<br>
// parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is<br>
- // test case base name and DoBar is test base name.<br>
- void AddTestPattern(const char* test_case_name,<br>
- const char* test_base_name,<br>
+ // test suite base name and DoBar is test base name.<br>
+ void AddTestPattern(const char* test_suite_name, const char* test_base_name,<br>
TestMetaFactoryBase<ParamType>* meta_factory) {<br>
- tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,<br>
- test_base_name,<br>
- meta_factory)));<br>
+ tests_.push_back(std::shared_ptr<TestInfo>(<br>
+ new TestInfo(test_suite_name, test_base_name, meta_factory)));<br>
}<br>
- // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information<br>
+ // INSTANTIATE_TEST_SUITE_P macro uses AddGenerator() to record information<br>
// about a generator.<br>
- int AddTestCaseInstantiation(const std::string& instantiation_name,<br>
- GeneratorCreationFunc* func,<br>
- ParamNameGeneratorFunc* name_func,<br>
- const char* file, int line) {<br>
+ int AddTestSuiteInstantiation(const std::string& instantiation_name,<br>
+ GeneratorCreationFunc* func,<br>
+ ParamNameGeneratorFunc* name_func,<br>
+ const char* file, int line) {<br>
instantiations_.push_back(<br>
InstantiationInfo(instantiation_name, func, name_func, file, line));<br>
return 0; // Return value used only to run this method in namespace scope.<br>
}<br>
- // UnitTest class invokes this method to register tests in this test case<br>
- // test cases right before running tests in RUN_ALL_TESTS macro.<br>
- // This method should not be called more then once on any single<br>
- // instance of a ParameterizedTestCaseInfoBase derived class.<br>
- // UnitTest has a guard to prevent from calling this method more then once.<br>
- virtual void RegisterTests() {<br>
+ // UnitTest class invokes this method to register tests in this test suite<br>
+ // test suites right before running tests in RUN_ALL_TESTS macro.<br>
+ // This method should not be called more than once on any single<br>
+ // instance of a ParameterizedTestSuiteInfoBase derived class.<br>
+ // UnitTest has a guard to prevent from calling this method more than once.<br>
+ void RegisterTests() override {<br>
for (typename TestInfoContainer::iterator test_it = tests_.begin();<br>
test_it != tests_.end(); ++test_it) {<br>
- linked_ptr<TestInfo> test_info = *test_it;<br>
+ std::shared_ptr<TestInfo> test_info = *test_it;<br>
for (typename InstantiationContainer::iterator gen_it =<br>
instantiations_.begin(); gen_it != instantiations_.end();<br>
++gen_it) {<br>
@@ -551,10 +539,10 @@ class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {<br>
const char* file = gen_it->file;<br>
int line = gen_it->line;<br>
<br>
- std::string test_case_name;<br>
+ std::string test_suite_name;<br>
if ( !instantiation_name.empty() )<br>
- test_case_name = instantiation_name + "/";<br>
- test_case_name += test_info->test_case_base_name;<br>
+ test_suite_name = instantiation_name + "/";<br>
+ test_suite_name += test_info->test_suite_base_name;<br>
<br>
size_t i = 0;<br>
std::set<std::string> test_param_names;<br>
@@ -577,39 +565,39 @@ class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {<br>
<br>
test_param_names.insert(param_name);<br>
<br>
- test_name_stream << test_info->test_base_name << "/" << param_name;<br>
+ if (!test_info->test_base_name.empty()) {<br>
+ test_name_stream << test_info->test_base_name << "/";<br>
+ }<br>
+ test_name_stream << param_name;<br>
MakeAndRegisterTestInfo(<br>
- test_case_name.c_str(),<br>
- test_name_stream.GetString().c_str(),<br>
- NULL, // No type parameter.<br>
- PrintToString(*param_it).c_str(),<br>
- code_location_,<br>
- GetTestCaseTypeId(),<br>
- TestCase::SetUpTestCase,<br>
- TestCase::TearDownTestCase,<br>
+ test_suite_name.c_str(), test_name_stream.GetString().c_str(),<br>
+ nullptr, // No type parameter.<br>
+ PrintToString(*param_it).c_str(), code_location_,<br>
+ GetTestSuiteTypeId(),<br>
+ SuiteApiResolver<TestSuite>::GetSetUpCaseOrSuite(file, line),<br>
+ SuiteApiResolver<TestSuite>::GetTearDownCaseOrSuite(file, line),<br>
test_info->test_meta_factory->CreateTestFactory(*param_it));<br>
} // for param_it<br>
} // for gen_it<br>
} // for test_it<br>
- } // RegisterTests<br>
+ } // RegisterTests<br>
<br>
private:<br>
// LocalTestInfo structure keeps information about a single test registered<br>
// with TEST_P macro.<br>
struct TestInfo {<br>
- TestInfo(const char* a_test_case_base_name,<br>
- const char* a_test_base_name,<br>
- TestMetaFactoryBase<ParamType>* a_test_meta_factory) :<br>
- test_case_base_name(a_test_case_base_name),<br>
- test_base_name(a_test_base_name),<br>
- test_meta_factory(a_test_meta_factory) {}<br>
-<br>
- const std::string test_case_base_name;<br>
+ TestInfo(const char* a_test_suite_base_name, const char* a_test_base_name,<br>
+ TestMetaFactoryBase<ParamType>* a_test_meta_factory)<br>
+ : test_suite_base_name(a_test_suite_base_name),<br>
+ test_base_name(a_test_base_name),<br>
+ test_meta_factory(a_test_meta_factory) {}<br>
+<br>
+ const std::string test_suite_base_name;<br>
const std::string test_base_name;<br>
- const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;<br>
+ const std::unique_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;<br>
};<br>
- typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;<br>
- // Records data received from INSTANTIATE_TEST_CASE_P macros:<br>
+ using TestInfoContainer = ::std::vector<std::shared_ptr<TestInfo> >;<br>
+ // Records data received from INSTANTIATE_TEST_SUITE_P macros:<br>
// <Instantiation name, Sequence generator creation function,<br>
// Name generator function, Source file, Source line><br>
struct InstantiationInfo {<br>
@@ -646,76 +634,247 @@ class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {<br>
return true;<br>
}<br>
<br>
- const std::string test_case_name_;<br>
+ const std::string test_suite_name_;<br>
CodeLocation code_location_;<br>
TestInfoContainer tests_;<br>
InstantiationContainer instantiations_;<br>
<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);<br>
-}; // class ParameterizedTestCaseInfo<br>
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfo);<br>
+}; // class ParameterizedTestSuiteInfo<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+template <class TestCase><br>
+using ParameterizedTestCaseInfo = ParameterizedTestSuiteInfo<TestCase>;<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
//<br>
-// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase<br>
-// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P<br>
-// macros use it to locate their corresponding ParameterizedTestCaseInfo<br>
-// descriptors.<br>
-class ParameterizedTestCaseRegistry {<br>
+// ParameterizedTestSuiteRegistry contains a map of<br>
+// ParameterizedTestSuiteInfoBase classes accessed by test suite names. TEST_P<br>
+// and INSTANTIATE_TEST_SUITE_P macros use it to locate their corresponding<br>
+// ParameterizedTestSuiteInfo descriptors.<br>
+class ParameterizedTestSuiteRegistry {<br>
public:<br>
- ParameterizedTestCaseRegistry() {}<br>
- ~ParameterizedTestCaseRegistry() {<br>
- for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();<br>
- it != test_case_infos_.end(); ++it) {<br>
- delete *it;<br>
+ ParameterizedTestSuiteRegistry() {}<br>
+ ~ParameterizedTestSuiteRegistry() {<br>
+ for (auto& test_suite_info : test_suite_infos_) {<br>
+ delete test_suite_info;<br>
}<br>
}<br>
<br>
// Looks up or creates and returns a structure containing information about<br>
- // tests and instantiations of a particular test case.<br>
- template <class TestCase><br>
- ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(<br>
- const char* test_case_name,<br>
- CodeLocation code_location) {<br>
- ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;<br>
- for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();<br>
- it != test_case_infos_.end(); ++it) {<br>
- if ((*it)->GetTestCaseName() == test_case_name) {<br>
- if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {<br>
+ // tests and instantiations of a particular test suite.<br>
+ template <class TestSuite><br>
+ ParameterizedTestSuiteInfo<TestSuite>* GetTestSuitePatternHolder(<br>
+ const char* test_suite_name, CodeLocation code_location) {<br>
+ ParameterizedTestSuiteInfo<TestSuite>* typed_test_info = nullptr;<br>
+ for (auto& test_suite_info : test_suite_infos_) {<br>
+ if (test_suite_info->GetTestSuiteName() == test_suite_name) {<br>
+ if (test_suite_info->GetTestSuiteTypeId() != GetTypeId<TestSuite>()) {<br>
// Complain about incorrect usage of Google Test facilities<br>
// and terminate the program since we cannot guaranty correct<br>
- // test case setup and tear-down in this case.<br>
- ReportInvalidTestCaseType(test_case_name, code_location);<br>
+ // test suite setup and tear-down in this case.<br>
+ ReportInvalidTestSuiteType(test_suite_name, code_location);<br>
posix::Abort();<br>
} else {<br>
// At this point we are sure that the object we found is of the same<br>
// type we are looking for, so we downcast it to that type<br>
// without further checks.<br>
typed_test_info = CheckedDowncastToActualType<<br>
- ParameterizedTestCaseInfo<TestCase> >(*it);<br>
+ ParameterizedTestSuiteInfo<TestSuite> >(test_suite_info);<br>
}<br>
break;<br>
}<br>
}<br>
- if (typed_test_info == NULL) {<br>
- typed_test_info = new ParameterizedTestCaseInfo<TestCase>(<br>
- test_case_name, code_location);<br>
- test_case_infos_.push_back(typed_test_info);<br>
+ if (typed_test_info == nullptr) {<br>
+ typed_test_info = new ParameterizedTestSuiteInfo<TestSuite>(<br>
+ test_suite_name, code_location);<br>
+ test_suite_infos_.push_back(typed_test_info);<br>
}<br>
return typed_test_info;<br>
}<br>
void RegisterTests() {<br>
- for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();<br>
- it != test_case_infos_.end(); ++it) {<br>
- (*it)->RegisterTests();<br>
+ for (auto& test_suite_info : test_suite_infos_) {<br>
+ test_suite_info->RegisterTests();<br>
}<br>
}<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ template <class TestCase><br>
+ ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(<br>
+ const char* test_case_name, CodeLocation code_location) {<br>
+ return GetTestSuitePatternHolder<TestCase>(test_case_name, code_location);<br>
+ }<br>
+<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
+ private:<br>
+ using TestSuiteInfoContainer = ::std::vector<ParameterizedTestSuiteInfoBase*>;<br>
+<br>
+ TestSuiteInfoContainer test_suite_infos_;<br>
+<br>
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteRegistry);<br>
+};<br>
+<br>
+} // namespace internal<br>
+<br>
+// Forward declarations of ValuesIn(), which is implemented in<br>
+// include/gtest/gtest-param-test.h.<br>
+template <class Container><br>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(<br>
+ const Container& container);<br>
+<br>
+namespace internal {<br>
+// Used in the Values() function to provide polymorphic capabilities.<br>
+<br>
+template <typename... Ts><br>
+class ValueArray {<br>
+ public:<br>
+ ValueArray(Ts... v) : v_{std::move(v)...} {}<br>
+<br>
+ template <typename T><br>
+ operator ParamGenerator<T>() const { // NOLINT<br>
+ return ValuesIn(MakeVector<T>(MakeIndexSequence<sizeof...(Ts)>()));<br>
+ }<br>
<br>
private:<br>
- typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;<br>
+ template <typename T, size_t... I><br>
+ std::vector<T> MakeVector(IndexSequence<I...>) const {<br>
+ return std::vector<T>{static_cast<T>(v_.template Get<I>())...};<br>
+ }<br>
<br>
- TestCaseInfoContainer test_case_infos_;<br>
+ FlatTuple<Ts...> v_;<br>
+};<br>
<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);<br>
+template <typename... T><br>
+class CartesianProductGenerator<br>
+ : public ParamGeneratorInterface<::std::tuple<T...>> {<br>
+ public:<br>
+ typedef ::std::tuple<T...> ParamType;<br>
+<br>
+ CartesianProductGenerator(const std::tuple<ParamGenerator<T>...>& g)<br>
+ : generators_(g) {}<br>
+ ~CartesianProductGenerator() override {}<br>
+<br>
+ ParamIteratorInterface<ParamType>* Begin() const override {<br>
+ return new Iterator(this, generators_, false);<br>
+ }<br>
+ ParamIteratorInterface<ParamType>* End() const override {<br>
+ return new Iterator(this, generators_, true);<br>
+ }<br>
+<br>
+ private:<br>
+ template <class I><br>
+ class IteratorImpl;<br>
+ template <size_t... I><br>
+ class IteratorImpl<IndexSequence<I...>><br>
+ : public ParamIteratorInterface<ParamType> {<br>
+ public:<br>
+ IteratorImpl(const ParamGeneratorInterface<ParamType>* base,<br>
+ const std::tuple<ParamGenerator<T>...>& generators, bool is_end)<br>
+ : base_(base),<br>
+ begin_(std::get<I>(generators).begin()...),<br>
+ end_(std::get<I>(generators).end()...),<br>
+ current_(is_end ? end_ : begin_) {<br>
+ ComputeCurrentValue();<br>
+ }<br>
+ ~IteratorImpl() override {}<br>
+<br>
+ const ParamGeneratorInterface<ParamType>* BaseGenerator() const override {<br>
+ return base_;<br>
+ }<br>
+ // Advance should not be called on beyond-of-range iterators<br>
+ // so no component iterators must be beyond end of range, either.<br>
+ void Advance() override {<br>
+ assert(!AtEnd());<br>
+ // Advance the last iterator.<br>
+ ++std::get<sizeof...(T) - 1>(current_);<br>
+ // if that reaches end, propagate that up.<br>
+ AdvanceIfEnd<sizeof...(T) - 1>();<br>
+ ComputeCurrentValue();<br>
+ }<br>
+ ParamIteratorInterface<ParamType>* Clone() const override {<br>
+ return new IteratorImpl(*this);<br>
+ }<br>
+<br>
+ const ParamType* Current() const override { return current_value_.get(); }<br>
+<br>
+ bool Equals(const ParamIteratorInterface<ParamType>& other) const override {<br>
+ // Having the same base generator guarantees that the other<br>
+ // iterator is of the same type and we can downcast.<br>
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
+ << "The program attempted to compare iterators "<br>
+ << "from <br>
diff erent generators." << std::endl;<br>
+ const IteratorImpl* typed_other =<br>
+ CheckedDowncastToActualType<const IteratorImpl>(&other);<br>
+<br>
+ // We must report iterators equal if they both point beyond their<br>
+ // respective ranges. That can happen in a variety of fashions,<br>
+ // so we have to consult AtEnd().<br>
+ if (AtEnd() && typed_other->AtEnd()) return true;<br>
+<br>
+ bool same = true;<br>
+ bool dummy[] = {<br>
+ (same = same && std::get<I>(current_) ==<br>
+ std::get<I>(typed_other->current_))...};<br>
+ (void)dummy;<br>
+ return same;<br>
+ }<br>
+<br>
+ private:<br>
+ template <size_t ThisI><br>
+ void AdvanceIfEnd() {<br>
+ if (std::get<ThisI>(current_) != std::get<ThisI>(end_)) return;<br>
+<br>
+ bool last = ThisI == 0;<br>
+ if (last) {<br>
+ // We are done. Nothing else to propagate.<br>
+ return;<br>
+ }<br>
+<br>
+ constexpr size_t NextI = ThisI - (ThisI != 0);<br>
+ std::get<ThisI>(current_) = std::get<ThisI>(begin_);<br>
+ ++std::get<NextI>(current_);<br>
+ AdvanceIfEnd<NextI>();<br>
+ }<br>
+<br>
+ void ComputeCurrentValue() {<br>
+ if (!AtEnd())<br>
+ current_value_ = std::make_shared<ParamType>(*std::get<I>(current_)...);<br>
+ }<br>
+ bool AtEnd() const {<br>
+ bool at_end = false;<br>
+ bool dummy[] = {<br>
+ (at_end = at_end || std::get<I>(current_) == std::get<I>(end_))...};<br>
+ (void)dummy;<br>
+ return at_end;<br>
+ }<br>
+<br>
+ const ParamGeneratorInterface<ParamType>* const base_;<br>
+ std::tuple<typename ParamGenerator<T>::iterator...> begin_;<br>
+ std::tuple<typename ParamGenerator<T>::iterator...> end_;<br>
+ std::tuple<typename ParamGenerator<T>::iterator...> current_;<br>
+ std::shared_ptr<ParamType> current_value_;<br>
+ };<br>
+<br>
+ using Iterator = IteratorImpl<typename MakeIndexSequence<sizeof...(T)>::type>;<br>
+<br>
+ std::tuple<ParamGenerator<T>...> generators_;<br>
+};<br>
+<br>
+template <class... Gen><br>
+class CartesianProductHolder {<br>
+ public:<br>
+ CartesianProductHolder(const Gen&... g) : generators_(g...) {}<br>
+ template <typename... T><br>
+ operator ParamGenerator<::std::tuple<T...>>() const {<br>
+ return ParamGenerator<::std::tuple<T...>>(<br>
+ new CartesianProductGenerator<T...>(generators_));<br>
+ }<br>
+<br>
+ private:<br>
+ std::tuple<Gen...> generators_;<br>
};<br>
<br>
} // namespace internal<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port-arch.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port-arch.h<br>
index f83700e06d98c..cece93dba12d4 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port-arch.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port-arch.h<br>
@@ -38,14 +38,13 @@<br>
// Determines the platform on which Google Test is compiled.<br>
#ifdef __CYGWIN__<br>
# define GTEST_OS_CYGWIN 1<br>
-#elif defined __SYMBIAN32__<br>
-# define GTEST_OS_SYMBIAN 1<br>
+# elif defined(__MINGW__) || defined(__MINGW32__) || defined(__MINGW64__)<br>
+# define GTEST_OS_WINDOWS_MINGW 1<br>
+# define GTEST_OS_WINDOWS 1<br>
#elif defined _WIN32<br>
# define GTEST_OS_WINDOWS 1<br>
# ifdef _WIN32_WCE<br>
# define GTEST_OS_WINDOWS_MOBILE 1<br>
-# elif defined(__MINGW__) || defined(__MINGW32__)<br>
-# define GTEST_OS_WINDOWS_MINGW 1<br>
# elif defined(WINAPI_FAMILY)<br>
# include <winapifamily.h><br>
# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)<br>
@@ -65,15 +64,21 @@<br>
# else<br>
# define GTEST_OS_WINDOWS_DESKTOP 1<br>
# endif // _WIN32_WCE<br>
+#elif defined __OS2__<br>
+# define GTEST_OS_OS2 1<br>
#elif defined __APPLE__<br>
# define GTEST_OS_MAC 1<br>
# if TARGET_OS_IPHONE<br>
# define GTEST_OS_IOS 1<br>
# endif<br>
+#elif defined __DragonFly__<br>
+# define GTEST_OS_DRAGONFLY 1<br>
#elif defined __FreeBSD__<br>
# define GTEST_OS_FREEBSD 1<br>
#elif defined __Fuchsia__<br>
# define GTEST_OS_FUCHSIA 1<br>
+#elif defined(__GLIBC__) && defined(__FreeBSD_kernel__)<br>
+# define GTEST_OS_GNU_KFREEBSD 1<br>
#elif defined __linux__<br>
# define GTEST_OS_LINUX 1<br>
# if defined __ANDROID__<br>
@@ -95,6 +100,8 @@<br>
# define GTEST_OS_OPENBSD 1<br>
#elif defined __QNX__<br>
# define GTEST_OS_QNX 1<br>
+#elif defined(__HAIKU__)<br>
+#define GTEST_OS_HAIKU 1<br>
#endif // __CYGWIN__<br>
<br>
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port.h<br>
index 786497d854c97..063fcb1083bab 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port.h<br>
@@ -72,10 +72,6 @@<br>
// is/isn't available.<br>
// GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions<br>
// are enabled.<br>
-// GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string<br>
-// is/isn't available<br>
-// GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::wstring<br>
-// is/isn't available<br>
// GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular<br>
// expressions are/aren't available.<br>
// GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that <pthread.h><br>
@@ -85,8 +81,6 @@<br>
// GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that<br>
// std::wstring does/doesn't work (Google Test can<br>
// be used where std::wstring is unavailable).<br>
-// GTEST_HAS_TR1_TUPLE - Define it to 1/0 to indicate tr1::tuple<br>
-// is/isn't available.<br>
// GTEST_HAS_SEH - Define it to 1/0 to indicate whether the<br>
// compiler supports Microsoft's "Structured<br>
// Exception Handling".<br>
@@ -94,12 +88,6 @@<br>
// - Define it to 1/0 to indicate whether the<br>
// platform supports I/O stream redirection using<br>
// dup() and dup2().<br>
-// GTEST_USE_OWN_TR1_TUPLE - Define it to 1/0 to indicate whether Google<br>
-// Test's own tr1 tuple implementation should be<br>
-// used. Unused when the user sets<br>
-// GTEST_HAS_TR1_TUPLE to 0.<br>
-// GTEST_LANG_CXX11 - Define it to 1/0 to indicate that Google Test<br>
-// is building in C++11/C++98 mode.<br>
// GTEST_LINKED_AS_SHARED_LIBRARY<br>
// - Define to 1 when compiling tests that use<br>
// Google Test as a shared library (known as<br>
@@ -125,8 +113,11 @@<br>
//<br>
// GTEST_OS_AIX - IBM AIX<br>
// GTEST_OS_CYGWIN - Cygwin<br>
+// GTEST_OS_DRAGONFLY - DragonFlyBSD<br>
// GTEST_OS_FREEBSD - FreeBSD<br>
// GTEST_OS_FUCHSIA - Fuchsia<br>
+// GTEST_OS_GNU_KFREEBSD - GNU/kFreeBSD<br>
+// GTEST_OS_HAIKU - Haiku<br>
// GTEST_OS_HPUX - HP-UX<br>
// GTEST_OS_LINUX - Linux<br>
// GTEST_OS_LINUX_ANDROID - Google Android<br>
@@ -135,9 +126,9 @@<br>
// GTEST_OS_NACL - Google Native Client (NaCl)<br>
// GTEST_OS_NETBSD - NetBSD<br>
// GTEST_OS_OPENBSD - OpenBSD<br>
+// GTEST_OS_OS2 - OS/2<br>
// GTEST_OS_QNX - QNX<br>
// GTEST_OS_SOLARIS - Sun Solaris<br>
-// GTEST_OS_SYMBIAN - Symbian<br>
// GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile)<br>
// GTEST_OS_WINDOWS_DESKTOP - Windows Desktop<br>
// GTEST_OS_WINDOWS_MINGW - MinGW<br>
@@ -146,7 +137,7 @@<br>
// GTEST_OS_WINDOWS_RT - Windows Store App/WinRT<br>
// GTEST_OS_ZOS - z/OS<br>
//<br>
-// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the<br>
+// Among the platforms, Cygwin, Linux, Mac OS X, and Windows have the<br>
// most stable support. Since core members of the Google Test project<br>
// don't have access to other platforms, support for them may be less<br>
// stable. If you notice any problems on your platform, please notify<br>
@@ -172,8 +163,6 @@<br>
// EXPECT_DEATH(DoSomethingDeadly());<br>
// #endif<br>
//<br>
-// GTEST_HAS_COMBINE - the Combine() function (for value-parameterized<br>
-// tests)<br>
// GTEST_HAS_DEATH_TEST - death tests<br>
// GTEST_HAS_TYPED_TEST - typed tests<br>
// GTEST_HAS_TYPED_TEST_P - type-parameterized tests<br>
@@ -184,7 +173,6 @@<br>
// define themselves.<br>
// GTEST_USES_SIMPLE_RE - our own simple regex is used;<br>
// the above RE\b(s) are mutually exclusive.<br>
-// GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().<br>
<br>
// Misc public macros<br>
// ------------------<br>
@@ -210,23 +198,10 @@<br>
// GTEST_INTENTIONAL_CONST_COND_POP_ - finish code section where MSVC C4127<br>
// is suppressed.<br>
//<br>
-// C++11 feature wrappers:<br>
-//<br>
-// testing::internal::forward - portability wrapper for std::forward.<br>
-// testing::internal::move - portability wrapper for std::move.<br>
-//<br>
// Synchronization:<br>
// Mutex, MutexLock, ThreadLocal, GetThreadCount()<br>
// - synchronization primitives.<br>
//<br>
-// Template meta programming:<br>
-// is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only.<br>
-// IteratorTraits - partial implementation of std::iterator_traits, which<br>
-// is not available in libCstd when compiled with Sun C++.<br>
-//<br>
-// Smart pointers:<br>
-// scoped_ptr - as in TR2.<br>
-//<br>
// Regular expressions:<br>
// RE - a simple regular expression class using the POSIX<br>
// Extended Regular Expression syntax on UNIX-like platforms<br>
@@ -262,12 +237,20 @@<br>
// BoolFromGTestEnv() - parses a bool environment variable.<br>
// Int32FromGTestEnv() - parses an Int32 environment variable.<br>
// StringFromGTestEnv() - parses a string environment variable.<br>
+//<br>
+// Deprecation warnings:<br>
+// GTEST_INTERNAL_DEPRECATED(message) - attribute marking a function as<br>
+// deprecated; calling a marked function<br>
+// should generate a compiler warning<br>
<br>
#include <ctype.h> // for isspace, etc<br>
#include <stddef.h> // for ptr<br>
diff _t<br>
-#include <stdlib.h><br>
#include <stdio.h><br>
+#include <stdlib.h><br>
#include <string.h><br>
+#include <memory><br>
+#include <type_traits><br>
+<br>
#ifndef _WIN32_WCE<br>
# include <sys/types.h><br>
# include <sys/stat.h><br>
@@ -278,12 +261,11 @@<br>
# include <TargetConditionals.h><br>
#endif<br>
<br>
-// Brings in the definition of HAS_GLOBAL_STRING. This must be done<br>
-// BEFORE we test HAS_GLOBAL_STRING.<br>
-#include <string> // NOLINT<br>
#include <algorithm> // NOLINT<br>
-#include <iostream> // NOLINT<br>
-#include <sstream> // NOLINT<br>
+#include <iostream> // NOLINT<br>
+#include <sstream> // NOLINT<br>
+#include <string> // NOLINT<br>
+#include <tuple><br>
#include <utility><br>
#include <vector> // NOLINT<br>
<br>
@@ -315,14 +297,14 @@<br>
// GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 4385)<br>
// /* code that triggers warnings C4800 and C4385 */<br>
// GTEST_DISABLE_MSC_WARNINGS_POP_()<br>
-#if _MSC_VER >= 1400<br>
+#if defined(_MSC_VER)<br>
# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \<br>
__pragma(warning(push)) \<br>
__pragma(warning(disable: warnings))<br>
# define GTEST_DISABLE_MSC_WARNINGS_POP_() \<br>
__pragma(warning(pop))<br>
#else<br>
-// Older versions of MSVC don't have __pragma.<br>
+// Not all compilers are MSVC<br>
# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)<br>
# define GTEST_DISABLE_MSC_WARNINGS_POP_()<br>
#endif<br>
@@ -343,80 +325,6 @@<br>
GTEST_DISABLE_MSC_WARNINGS_POP_()<br>
#endif<br>
<br>
-#ifndef GTEST_LANG_CXX11<br>
-// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when<br>
-// -std={c,gnu}++{0x,11} is passed. The C++11 standard specifies a<br>
-// value for __cplusplus, and recent versions of clang, gcc, and<br>
-// probably other compilers set that too in C++11 mode.<br>
-# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L || _MSC_VER >= 1900<br>
-// Compiling in at least C++11 mode.<br>
-# define GTEST_LANG_CXX11 1<br>
-# else<br>
-# define GTEST_LANG_CXX11 0<br>
-# endif<br>
-#endif<br>
-<br>
-// Distinct from C++11 language support, some environments don't provide<br>
-// proper C++11 library support. Notably, it's possible to build in<br>
-// C++11 mode when targeting Mac OS X 10.6, which has an old libstdc++<br>
-// with no C++11 support.<br>
-//<br>
-// libstdc++ has sufficient C++11 support as of GCC 4.6.0, __GLIBCXX__<br>
-// 20110325, but maintenance releases in the 4.4 and 4.5 series followed<br>
-// this date, so check for those versions by their date stamps.<br>
-// <a href="https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html#abi.versioning-%23if" rel="noreferrer" target="_blank">https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html#abi.versioning<br>
-#if</a> GTEST_LANG_CXX11 && \<br>
- (!defined(__GLIBCXX__) || ( \<br>
- __GLIBCXX__ >= 20110325ul && /* GCC >= 4.6.0 */ \<br>
- /* Blacklist of patch releases of older branches: */ \<br>
- __GLIBCXX__ != 20110416ul && /* GCC 4.4.6 */ \<br>
- __GLIBCXX__ != 20120313ul && /* GCC 4.4.7 */ \<br>
- __GLIBCXX__ != 20110428ul && /* GCC 4.5.3 */ \<br>
- __GLIBCXX__ != 20120702ul)) /* GCC 4.5.4 */<br>
-# define GTEST_STDLIB_CXX11 1<br>
-#endif<br>
-<br>
-// Only use C++11 library features if the library provides them.<br>
-#if GTEST_STDLIB_CXX11<br>
-# define GTEST_HAS_STD_BEGIN_AND_END_ 1<br>
-# define GTEST_HAS_STD_FORWARD_LIST_ 1<br>
-# if !defined(_MSC_VER) || (_MSC_FULL_VER >= 190023824)<br>
-// works only with VS2015U2 and better<br>
-# define GTEST_HAS_STD_FUNCTION_ 1<br>
-# endif<br>
-# define GTEST_HAS_STD_INITIALIZER_LIST_ 1<br>
-# define GTEST_HAS_STD_MOVE_ 1<br>
-# define GTEST_HAS_STD_UNIQUE_PTR_ 1<br>
-# define GTEST_HAS_STD_SHARED_PTR_ 1<br>
-# define GTEST_HAS_UNORDERED_MAP_ 1<br>
-# define GTEST_HAS_UNORDERED_SET_ 1<br>
-#endif<br>
-<br>
-// C++11 specifies that <tuple> provides std::tuple.<br>
-// Some platforms still might not have it, however.<br>
-#if GTEST_LANG_CXX11<br>
-# define GTEST_HAS_STD_TUPLE_ 1<br>
-# if defined(__clang__)<br>
-// Inspired by<br>
-// <a href="https://clang.llvm.org/docs/LanguageExtensions.html#include-file-checking-macros" rel="noreferrer" target="_blank">https://clang.llvm.org/docs/LanguageExtensions.html#include-file-checking-macros</a><br>
-# if defined(__has_include) && !__has_include(<tuple>)<br>
-# undef GTEST_HAS_STD_TUPLE_<br>
-# endif<br>
-# elif defined(_MSC_VER)<br>
-// Inspired by boost/config/stdlib/dinkumware.hpp<br>
-# if defined(_CPPLIB_VER) && _CPPLIB_VER < 520<br>
-# undef GTEST_HAS_STD_TUPLE_<br>
-# endif<br>
-# elif defined(__GLIBCXX__)<br>
-// Inspired by boost/config/stdlib/libstdcpp3.hpp,<br>
-// <a href="http://gcc.gnu.org/gcc-4.2/changes.html" rel="noreferrer" target="_blank">http://gcc.gnu.org/gcc-4.2/changes.html</a> and<br>
-// <a href="https://web.archive.org/web/20140227044429/gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch01.html#manual.intro.status.standard.200x" rel="noreferrer" target="_blank">https://web.archive.org/web/20140227044429/gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch01.html#manual.intro.status.standard.200x</a><br>
-# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)<br>
-# undef GTEST_HAS_STD_TUPLE_<br>
-# endif<br>
-# endif<br>
-#endif<br>
-<br>
// Brings in definitions for functions used in the testing::internal::posix<br>
// namespace (read, write, close, chdir, isatty, stat). We do not currently<br>
// use them on Windows Mobile.<br>
@@ -449,7 +357,8 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
# include <android/api-level.h> // NOLINT<br>
#endif<br>
<br>
-// Defines this to true iff Google Test can use POSIX regular expressions.<br>
+// Defines this to true if and only if Google Test can use POSIX regular<br>
+// expressions.<br>
#ifndef GTEST_HAS_POSIX_RE<br>
# if GTEST_OS_LINUX_ANDROID<br>
// On Android, <regex.h> is only available starting with Gingerbread.<br>
@@ -490,7 +399,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
// The user didn't tell us whether exceptions are enabled, so we need<br>
// to figure it out.<br>
# if defined(_MSC_VER) && defined(_CPPUNWIND)<br>
-// MSVC defines _CPPUNWIND to 1 iff exceptions are enabled.<br>
+// MSVC defines _CPPUNWIND to 1 if and only if exceptions are enabled.<br>
# define GTEST_HAS_EXCEPTIONS 1<br>
# elif defined(__BORLANDC__)<br>
// C++Builder's implementation of the STL uses the _HAS_EXCEPTIONS<br>
@@ -501,16 +410,17 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
# endif // _HAS_EXCEPTIONS<br>
# define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS<br>
# elif defined(__clang__)<br>
-// clang defines __EXCEPTIONS iff exceptions are enabled before clang 220714,<br>
-// but iff cleanups are enabled after that. In Obj-C++ files, there can be<br>
-// cleanups for ObjC exceptions which also need cleanups, even if C++ exceptions<br>
-// are disabled. clang has __has_feature(cxx_exceptions) which checks for C++<br>
-// exceptions starting at clang r206352, but which checked for cleanups prior to<br>
-// that. To reliably check for C++ exception availability with clang, check for<br>
+// clang defines __EXCEPTIONS if and only if exceptions are enabled before clang<br>
+// 220714, but if and only if cleanups are enabled after that. In Obj-C++ files,<br>
+// there can be cleanups for ObjC exceptions which also need cleanups, even if<br>
+// C++ exceptions are disabled. clang has __has_feature(cxx_exceptions) which<br>
+// checks for C++ exceptions starting at clang r206352, but which checked for<br>
+// cleanups prior to that. To reliably check for C++ exception availability with<br>
+// clang, check for<br>
// __EXCEPTIONS && __has_feature(cxx_exceptions).<br>
# define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions))<br>
# elif defined(__GNUC__) && __EXCEPTIONS<br>
-// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.<br>
+// gcc defines __EXCEPTIONS to 1 if and only if exceptions are enabled.<br>
# define GTEST_HAS_EXCEPTIONS 1<br>
# elif defined(__SUNPRO_CC)<br>
// Sun Pro CC supports exceptions. However, there is no compile-time way of<br>
@@ -518,7 +428,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
// they are enabled unless the user tells us otherwise.<br>
# define GTEST_HAS_EXCEPTIONS 1<br>
# elif defined(__IBMCPP__) && __EXCEPTIONS<br>
-// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.<br>
+// xlC defines __EXCEPTIONS to 1 if and only if exceptions are enabled.<br>
# define GTEST_HAS_EXCEPTIONS 1<br>
# elif defined(__HP_aCC)<br>
// Exception handling is in effect by default in HP aCC compiler. It has to<br>
@@ -540,31 +450,18 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
# error "::std::string isn't available."<br>
#endif // !defined(GTEST_HAS_STD_STRING)<br>
<br>
-#ifndef GTEST_HAS_GLOBAL_STRING<br>
-# define GTEST_HAS_GLOBAL_STRING 0<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
#ifndef GTEST_HAS_STD_WSTRING<br>
// The user didn't tell us whether ::std::wstring is available, so we need<br>
// to figure it out.<br>
-// FIXME: uses autoconf to detect whether ::std::wstring<br>
-// is available.<br>
-<br>
// Cygwin 1.7 and below doesn't support ::std::wstring.<br>
// Solaris' libc++ doesn't support it either. Android has<br>
// no support for it at least as recent as Froyo (2.2).<br>
-# define GTEST_HAS_STD_WSTRING \<br>
- (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))<br>
+#define GTEST_HAS_STD_WSTRING \<br>
+ (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \<br>
+ GTEST_OS_HAIKU))<br>
<br>
#endif // GTEST_HAS_STD_WSTRING<br>
<br>
-#ifndef GTEST_HAS_GLOBAL_WSTRING<br>
-// The user didn't tell us whether ::wstring is available, so we need<br>
-// to figure it out.<br>
-# define GTEST_HAS_GLOBAL_WSTRING \<br>
- (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)<br>
-#endif // GTEST_HAS_GLOBAL_WSTRING<br>
-<br>
// Determines whether RTTI is available.<br>
#ifndef GTEST_HAS_RTTI<br>
// The user didn't tell us whether RTTI is enabled, so we need to<br>
@@ -572,14 +469,15 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
<br>
# ifdef _MSC_VER<br>
<br>
-# ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled.<br>
+#ifdef _CPPRTTI // MSVC defines this macro if and only if RTTI is enabled.<br>
# define GTEST_HAS_RTTI 1<br>
# else<br>
# define GTEST_HAS_RTTI 0<br>
# endif<br>
<br>
-// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.<br>
-# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)<br>
+// Starting with version 4.3.2, gcc defines __GXX_RTTI if and only if RTTI is<br>
+// enabled.<br>
+# elif defined(__GNUC__)<br>
<br>
# ifdef __GXX_RTTI<br>
// When building against STLport with the Android NDK and with<br>
@@ -635,9 +533,11 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
//<br>
// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0<br>
// to your compiler flags.<br>
-#define GTEST_HAS_PTHREAD \<br>
- (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX || \<br>
- GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA)<br>
+#define GTEST_HAS_PTHREAD \<br>
+ (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX || \<br>
+ GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \<br>
+ GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_OPENBSD || \<br>
+ GTEST_OS_HAIKU)<br>
#endif // GTEST_HAS_PTHREAD<br>
<br>
#if GTEST_HAS_PTHREAD<br>
@@ -649,136 +549,6 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
# include <time.h> // NOLINT<br>
#endif<br>
<br>
-// Determines if hash_map/hash_set are available.<br>
-// Only used for testing against those containers.<br>
-#if !defined(GTEST_HAS_HASH_MAP_)<br>
-# if defined(_MSC_VER) && (_MSC_VER < 1900)<br>
-# define GTEST_HAS_HASH_MAP_ 1 // Indicates that hash_map is available.<br>
-# define GTEST_HAS_HASH_SET_ 1 // Indicates that hash_set is available.<br>
-# endif // _MSC_VER<br>
-#endif // !defined(GTEST_HAS_HASH_MAP_)<br>
-<br>
-// Determines whether Google Test can use tr1/tuple. You can define<br>
-// this macro to 0 to prevent Google Test from using tuple (any<br>
-// feature depending on tuple with be disabled in this mode).<br>
-#ifndef GTEST_HAS_TR1_TUPLE<br>
-# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)<br>
-// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.<br>
-# define GTEST_HAS_TR1_TUPLE 0<br>
-# elif defined(_MSC_VER) && (_MSC_VER >= 1910)<br>
-// Prevent `warning C4996: 'std::tr1': warning STL4002:<br>
-// The non-Standard std::tr1 namespace and TR1-only machinery<br>
-// are deprecated and will be REMOVED.`<br>
-# define GTEST_HAS_TR1_TUPLE 0<br>
-# elif GTEST_LANG_CXX11 && defined(_LIBCPP_VERSION)<br>
-// libc++ doesn't support TR1.<br>
-# define GTEST_HAS_TR1_TUPLE 0<br>
-# else<br>
-// The user didn't tell us not to do it, so we assume it's OK.<br>
-# define GTEST_HAS_TR1_TUPLE 1<br>
-# endif<br>
-#endif // GTEST_HAS_TR1_TUPLE<br>
-<br>
-// Determines whether Google Test's own tr1 tuple implementation<br>
-// should be used.<br>
-#ifndef GTEST_USE_OWN_TR1_TUPLE<br>
-// We use our own tuple implementation on Symbian.<br>
-# if GTEST_OS_SYMBIAN<br>
-# define GTEST_USE_OWN_TR1_TUPLE 1<br>
-# else<br>
-// The user didn't tell us, so we need to figure it out.<br>
-<br>
-// We use our own TR1 tuple if we aren't sure the user has an<br>
-// implementation of it already. At this time, libstdc++ 4.0.0+ and<br>
-// MSVC 2010 are the only mainstream standard libraries that come<br>
-// with a TR1 tuple implementation. NVIDIA's CUDA NVCC compiler<br>
-// pretends to be GCC by defining __GNUC__ and friends, but cannot<br>
-// compile GCC's tuple implementation. MSVC 2008 (9.0) provides TR1<br>
-// tuple in a 323 MB Feature Pack download, which we cannot assume the<br>
-// user has. QNX's QCC compiler is a modified GCC but it doesn't<br>
-// support TR1 tuple. libc++ only provides std::tuple, in C++11 mode,<br>
-// and it can be used with some compilers that define __GNUC__.<br>
-# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \<br>
- && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) \<br>
- || (_MSC_VER >= 1600 && _MSC_VER < 1900)<br>
-# define GTEST_ENV_HAS_TR1_TUPLE_ 1<br>
-# endif<br>
-<br>
-// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used<br>
-// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6<br>
-// can build with clang but need to use gcc4.2's libstdc++).<br>
-# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)<br>
-# define GTEST_ENV_HAS_STD_TUPLE_ 1<br>
-# endif<br>
-<br>
-# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_<br>
-# define GTEST_USE_OWN_TR1_TUPLE 0<br>
-# else<br>
-# define GTEST_USE_OWN_TR1_TUPLE 1<br>
-# endif<br>
-# endif // GTEST_OS_SYMBIAN<br>
-#endif // GTEST_USE_OWN_TR1_TUPLE<br>
-<br>
-// To avoid conditional compilation we make it gtest-port.h's responsibility<br>
-// to #include the header implementing tuple.<br>
-#if GTEST_HAS_STD_TUPLE_<br>
-# include <tuple> // IWYU pragma: export<br>
-# define GTEST_TUPLE_NAMESPACE_ ::std<br>
-#endif // GTEST_HAS_STD_TUPLE_<br>
-<br>
-// We include tr1::tuple even if std::tuple is available to define printers for<br>
-// them.<br>
-#if GTEST_HAS_TR1_TUPLE<br>
-# ifndef GTEST_TUPLE_NAMESPACE_<br>
-# define GTEST_TUPLE_NAMESPACE_ ::std::tr1<br>
-# endif // GTEST_TUPLE_NAMESPACE_<br>
-<br>
-# if GTEST_USE_OWN_TR1_TUPLE<br>
-# include "gtest/internal/gtest-tuple.h" // IWYU pragma: export // NOLINT<br>
-# elif GTEST_OS_SYMBIAN<br>
-<br>
-// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to<br>
-// use STLport's tuple implementation, which unfortunately doesn't<br>
-// work as the copy of STLport distributed with Symbian is incomplete.<br>
-// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to<br>
-// use its own tuple implementation.<br>
-# ifdef BOOST_HAS_TR1_TUPLE<br>
-# undef BOOST_HAS_TR1_TUPLE<br>
-# endif // BOOST_HAS_TR1_TUPLE<br>
-<br>
-// This prevents <boost/tr1/detail/config.hpp>, which defines<br>
-// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.<br>
-# define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED<br>
-# include <tuple> // IWYU pragma: export // NOLINT<br>
-<br>
-# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)<br>
-// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header. This does<br>
-// not conform to the TR1 spec, which requires the header to be <tuple>.<br>
-<br>
-# if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302<br>
-// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,<br>
-// which is #included by <tr1/tuple>, to not compile when RTTI is<br>
-// disabled. _TR1_FUNCTIONAL is the header guard for<br>
-// <tr1/functional>. Hence the following #define is used to prevent<br>
-// <tr1/functional> from being included.<br>
-# define _TR1_FUNCTIONAL 1<br>
-# include <tr1/tuple><br>
-# undef _TR1_FUNCTIONAL // Allows the user to #include<br>
- // <tr1/functional> if they choose to.<br>
-# else<br>
-# include <tr1/tuple> // NOLINT<br>
-# endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302<br>
-<br>
-// VS 2010 now has tr1 support.<br>
-# elif _MSC_VER >= 1600<br>
-# include <tuple> // IWYU pragma: export // NOLINT<br>
-<br>
-# else // GTEST_USE_OWN_TR1_TUPLE<br>
-# include <tr1/tuple> // IWYU pragma: export // NOLINT<br>
-# endif // GTEST_USE_OWN_TR1_TUPLE<br>
-<br>
-#endif // GTEST_HAS_TR1_TUPLE<br>
-<br>
// Determines whether clone(2) is supported.<br>
// Usually it will only be available on Linux, excluding<br>
// Linux on the Itanium architecture.<br>
@@ -812,24 +582,21 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
#ifndef GTEST_HAS_STREAM_REDIRECTION<br>
// By default, we assume that stream redirection is supported on all<br>
// platforms except known mobile ones.<br>
-# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || \<br>
- GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT<br>
+# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT<br>
# define GTEST_HAS_STREAM_REDIRECTION 0<br>
# else<br>
# define GTEST_HAS_STREAM_REDIRECTION 1<br>
-# endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN<br>
+# endif // !GTEST_OS_WINDOWS_MOBILE<br>
#endif // GTEST_HAS_STREAM_REDIRECTION<br>
<br>
// Determines whether to support death tests.<br>
-// Google Test does not support death tests for VC 7.1 and earlier as<br>
-// abort() in a VC 7.1 application compiled as GUI in debug config<br>
// pops up a dialog window that cannot be suppressed programmatically.<br>
-#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \<br>
- (GTEST_OS_MAC && !GTEST_OS_IOS) || \<br>
- (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \<br>
- GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \<br>
- GTEST_OS_OPENBSD || GTEST_OS_QNX || GTEST_OS_FREEBSD || \<br>
- GTEST_OS_NETBSD || GTEST_OS_FUCHSIA)<br>
+#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \<br>
+ (GTEST_OS_MAC && !GTEST_OS_IOS) || \<br>
+ (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER) || GTEST_OS_WINDOWS_MINGW || \<br>
+ GTEST_OS_AIX || GTEST_OS_HPUX || GTEST_OS_OPENBSD || GTEST_OS_QNX || \<br>
+ GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \<br>
+ GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_HAIKU)<br>
# define GTEST_HAS_DEATH_TEST 1<br>
#endif<br>
<br>
@@ -837,26 +604,19 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
<br>
// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,<br>
// Sun Pro CC, IBM Visual Age, and HP aCC support.<br>
-#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \<br>
+#if defined(__GNUC__) || defined(_MSC_VER) || defined(__SUNPRO_CC) || \<br>
defined(__IBMCPP__) || defined(__HP_aCC)<br>
# define GTEST_HAS_TYPED_TEST 1<br>
# define GTEST_HAS_TYPED_TEST_P 1<br>
#endif<br>
<br>
-// Determines whether to support Combine(). This only makes sense when<br>
-// value-parameterized tests are enabled. The implementation doesn't<br>
-// work on Sun Studio since it doesn't understand templated conversion<br>
-// operators.<br>
-#if (GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_) && !defined(__SUNPRO_CC)<br>
-# define GTEST_HAS_COMBINE 1<br>
-#endif<br>
-<br>
// Determines whether the system compiler uses UTF-16 for encoding wide strings.<br>
#define GTEST_WIDE_STRING_USES_UTF16_ \<br>
- (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)<br>
+ (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_AIX || GTEST_OS_OS2)<br>
<br>
// Determines whether test results can be streamed to a socket.<br>
-#if GTEST_OS_LINUX<br>
+#if GTEST_OS_LINUX || GTEST_OS_GNU_KFREEBSD || GTEST_OS_DRAGONFLY || \<br>
+ GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_OPENBSD<br>
# define GTEST_CAN_STREAM_RESULTS_ 1<br>
#endif<br>
<br>
@@ -898,12 +658,6 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
# define GTEST_ATTRIBUTE_UNUSED_<br>
#endif<br>
<br>
-#if GTEST_LANG_CXX11<br>
-# define GTEST_CXX11_EQUALS_DELETE_ = delete<br>
-#else // GTEST_LANG_CXX11<br>
-# define GTEST_CXX11_EQUALS_DELETE_<br>
-#endif // GTEST_LANG_CXX11<br>
-<br>
// Use this annotation before a function that takes a printf format string.<br>
#if (defined(__GNUC__) || defined(__clang__)) && !defined(COMPILER_ICC)<br>
# if defined(__MINGW_PRINTF_FORMAT)<br>
@@ -925,12 +679,12 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
// A macro to disallow operator=<br>
// This should be used in the private: declarations for a class.<br>
#define GTEST_DISALLOW_ASSIGN_(type) \<br>
- void operator=(type const &) GTEST_CXX11_EQUALS_DELETE_<br>
+ void operator=(type const &) = delete<br>
<br>
// A macro to disallow copy constructor and operator=<br>
// This should be used in the private: declarations for a class.<br>
#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \<br>
- type(type const &) GTEST_CXX11_EQUALS_DELETE_; \<br>
+ type(type const &) = delete; \<br>
GTEST_DISALLOW_ASSIGN_(type)<br>
<br>
// Tell the compiler to warn about unused return values for functions declared<br>
@@ -938,11 +692,11 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
// following the argument list:<br>
//<br>
// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;<br>
-#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)<br>
+#if defined(__GNUC__) && !defined(COMPILER_ICC)<br>
# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))<br>
#else<br>
# define GTEST_MUST_USE_RESULT_<br>
-#endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC<br>
+#endif // __GNUC__ && !COMPILER_ICC<br>
<br>
// MS C++ compiler emits warning when a conditional expression is compile time<br>
// constant. In some contexts this warning is false positive and needs to be<br>
@@ -971,13 +725,17 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
# define GTEST_HAS_SEH 0<br>
# endif<br>
<br>
-#define GTEST_IS_THREADSAFE \<br>
- (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ \<br>
- || (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) \<br>
- || GTEST_HAS_PTHREAD)<br>
-<br>
#endif // GTEST_HAS_SEH<br>
<br>
+#ifndef GTEST_IS_THREADSAFE<br>
+<br>
+#define GTEST_IS_THREADSAFE \<br>
+ (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ || \<br>
+ (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) || \<br>
+ GTEST_HAS_PTHREAD)<br>
+<br>
+#endif // GTEST_IS_THREADSAFE<br>
+<br>
// GTEST_API_ qualifies all symbols that must be exported. The definitions below<br>
// are guarded by #ifndef to give embedders a chance to define GTEST_API_ in<br>
// gtest/internal/custom/gtest-port.h<br>
@@ -1044,6 +802,18 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_<br>
#endif // __clang__<br>
<br>
+// A function level attribute to disable HWAddressSanitizer instrumentation.<br>
+#if defined(__clang__)<br>
+# if __has_feature(hwaddress_sanitizer)<br>
+# define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ \<br>
+ __attribute__((no_sanitize("hwaddress")))<br>
+# else<br>
+# define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_<br>
+# endif // __has_feature(hwaddress_sanitizer)<br>
+#else<br>
+# define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_<br>
+#endif // __clang__<br>
+<br>
// A function level attribute to disable ThreadSanitizer instrumentation.<br>
#if defined(__clang__)<br>
# if __has_feature(thread_sanitizer)<br>
@@ -1060,16 +830,13 @@ namespace testing {<br>
<br>
class Message;<br>
<br>
-#if defined(GTEST_TUPLE_NAMESPACE_)<br>
-// Import tuple and friends into the ::testing namespace.<br>
-// It is part of our interface, having them in ::testing allows us to change<br>
-// their types as needed.<br>
-using GTEST_TUPLE_NAMESPACE_::get;<br>
-using GTEST_TUPLE_NAMESPACE_::make_tuple;<br>
-using GTEST_TUPLE_NAMESPACE_::tuple;<br>
-using GTEST_TUPLE_NAMESPACE_::tuple_size;<br>
-using GTEST_TUPLE_NAMESPACE_::tuple_element;<br>
-#endif // defined(GTEST_TUPLE_NAMESPACE_)<br>
+// Legacy imports for backwards compatibility.<br>
+// New code should use std:: names directly.<br>
+using std::get;<br>
+using std::make_tuple;<br>
+using std::tuple;<br>
+using std::tuple_element;<br>
+using std::tuple_size;<br>
<br>
namespace internal {<br>
<br>
@@ -1078,158 +845,24 @@ namespace internal {<br>
// Secret object, which is what we want.<br>
class Secret;<br>
<br>
-// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time<br>
-// expression is true. For example, you could use it to verify the<br>
-// size of a static array:<br>
+// The GTEST_COMPILE_ASSERT_ is a legacy macro used to verify that a compile<br>
+// time expression is true (in new code, use static_assert instead). For<br>
+// example, you could use it to verify the size of a static array:<br>
//<br>
// GTEST_COMPILE_ASSERT_(GTEST_ARRAY_SIZE_(names) == NUM_NAMES,<br>
// names_incorrect_size);<br>
//<br>
-// or to make sure a struct is smaller than a certain size:<br>
-//<br>
-// GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);<br>
-//<br>
-// The second argument to the macro is the name of the variable. If<br>
-// the expression is false, most compilers will issue a warning/error<br>
-// containing the name of the variable.<br>
-<br>
-#if GTEST_LANG_CXX11<br>
-# define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)<br>
-#else // !GTEST_LANG_CXX11<br>
-template <bool><br>
- struct CompileAssert {<br>
-};<br>
-<br>
-# define GTEST_COMPILE_ASSERT_(expr, msg) \<br>
- typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \<br>
- msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_<br>
-#endif // !GTEST_LANG_CXX11<br>
-<br>
-// Implementation details of GTEST_COMPILE_ASSERT_:<br>
-//<br>
-// (In C++11, we simply use static_assert instead of the following)<br>
-//<br>
-// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1<br>
-// elements (and thus is invalid) when the expression is false.<br>
-//<br>
-// - The simpler definition<br>
-//<br>
-// #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]<br>
-//<br>
-// does not work, as gcc supports variable-length arrays whose sizes<br>
-// are determined at run-time (this is gcc's extension and not part<br>
-// of the C++ standard). As a result, gcc fails to reject the<br>
-// following code with the simple definition:<br>
-//<br>
-// int foo;<br>
-// GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is<br>
-// // not a compile-time constant.<br>
-//<br>
-// - By using the type CompileAssert<(bool(expr))>, we ensures that<br>
-// expr is a compile-time constant. (Template arguments must be<br>
-// determined at compile-time.)<br>
-//<br>
-// - The outter parentheses in CompileAssert<(bool(expr))> are necessary<br>
-// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written<br>
-//<br>
-// CompileAssert<bool(expr)><br>
-//<br>
-// instead, these compilers will refuse to compile<br>
-//<br>
-// GTEST_COMPILE_ASSERT_(5 > 0, some_message);<br>
-//<br>
-// (They seem to think the ">" in "5 > 0" marks the end of the<br>
-// template argument list.)<br>
-//<br>
-// - The array size is (bool(expr) ? 1 : -1), instead of simply<br>
-//<br>
-// ((expr) ? 1 : -1).<br>
-//<br>
-// This is to avoid running into a bug in MS VC 7.1, which<br>
-// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.<br>
-<br>
-// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.<br>
-//<br>
-// This template is declared, but intentionally undefined.<br>
-template <typename T1, typename T2><br>
-struct StaticAssertTypeEqHelper;<br>
-<br>
-template <typename T><br>
-struct StaticAssertTypeEqHelper<T, T> {<br>
- enum { value = true };<br>
-};<br>
-<br>
-// Same as std::is_same<>.<br>
-template <typename T, typename U><br>
-struct IsSame {<br>
- enum { value = false };<br>
-};<br>
-template <typename T><br>
-struct IsSame<T, T> {<br>
- enum { value = true };<br>
-};<br>
+// The second argument to the macro must be a valid C++ identifier. If the<br>
+// expression is false, compiler will issue an error containing this identifier.<br>
+#define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)<br>
<br>
// Evaluates to the number of elements in 'array'.<br>
#define GTEST_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0]))<br>
<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-typedef ::string string;<br>
-#else<br>
-typedef ::std::string string;<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-#if GTEST_HAS_GLOBAL_WSTRING<br>
-typedef ::wstring wstring;<br>
-#elif GTEST_HAS_STD_WSTRING<br>
-typedef ::std::wstring wstring;<br>
-#endif // GTEST_HAS_GLOBAL_WSTRING<br>
-<br>
// A helper for suppressing warnings on constant condition. It just<br>
// returns 'condition'.<br>
GTEST_API_ bool IsTrue(bool condition);<br>
<br>
-// Defines scoped_ptr.<br>
-<br>
-// This implementation of scoped_ptr is PARTIAL - it only contains<br>
-// enough stuff to satisfy Google Test's need.<br>
-template <typename T><br>
-class scoped_ptr {<br>
- public:<br>
- typedef T element_type;<br>
-<br>
- explicit scoped_ptr(T* p = NULL) : ptr_(p) {}<br>
- ~scoped_ptr() { reset(); }<br>
-<br>
- T& operator*() const { return *ptr_; }<br>
- T* operator->() const { return ptr_; }<br>
- T* get() const { return ptr_; }<br>
-<br>
- T* release() {<br>
- T* const ptr = ptr_;<br>
- ptr_ = NULL;<br>
- return ptr;<br>
- }<br>
-<br>
- void reset(T* p = NULL) {<br>
- if (p != ptr_) {<br>
- if (IsTrue(sizeof(T) > 0)) { // Makes sure T is a complete type.<br>
- delete ptr_;<br>
- }<br>
- ptr_ = p;<br>
- }<br>
- }<br>
-<br>
- friend void swap(scoped_ptr& a, scoped_ptr& b) {<br>
- using std::swap;<br>
- swap(a.ptr_, b.ptr_);<br>
- }<br>
-<br>
- private:<br>
- T* ptr_;<br>
-<br>
- GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);<br>
-};<br>
-<br>
// Defines RE.<br>
<br>
#if GTEST_USES_PCRE<br>
@@ -1247,25 +880,16 @@ class GTEST_API_ RE {<br>
// Constructs an RE from a string.<br>
RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT<br>
<br>
-# if GTEST_HAS_GLOBAL_STRING<br>
-<br>
- RE(const ::string& regex) { Init(regex.c_str()); } // NOLINT<br>
-<br>
-# endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
RE(const char* regex) { Init(regex); } // NOLINT<br>
~RE();<br>
<br>
// Returns the string representation of the regex.<br>
const char* pattern() const { return pattern_; }<br>
<br>
- // FullMatch(str, re) returns true iff regular expression re matches<br>
- // the entire str.<br>
- // PartialMatch(str, re) returns true iff regular expression re<br>
+ // FullMatch(str, re) returns true if and only if regular expression re<br>
+ // matches the entire str.<br>
+ // PartialMatch(str, re) returns true if and only if regular expression re<br>
// matches a substring of str (including str itself).<br>
- //<br>
- // FIXME: make FullMatch() and PartialMatch() work<br>
- // when str contains NUL characters.<br>
static bool FullMatch(const ::std::string& str, const RE& re) {<br>
return FullMatch(str.c_str(), re);<br>
}<br>
@@ -1273,26 +897,11 @@ class GTEST_API_ RE {<br>
return PartialMatch(str.c_str(), re);<br>
}<br>
<br>
-# if GTEST_HAS_GLOBAL_STRING<br>
-<br>
- static bool FullMatch(const ::string& str, const RE& re) {<br>
- return FullMatch(str.c_str(), re);<br>
- }<br>
- static bool PartialMatch(const ::string& str, const RE& re) {<br>
- return PartialMatch(str.c_str(), re);<br>
- }<br>
-<br>
-# endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
static bool FullMatch(const char* str, const RE& re);<br>
static bool PartialMatch(const char* str, const RE& re);<br>
<br>
private:<br>
void Init(const char* regex);<br>
-<br>
- // We use a const char* instead of an std::string, as Google Test used to be<br>
- // used where std::string is not available. FIXME: change to<br>
- // std::string.<br>
const char* pattern_;<br>
bool is_valid_;<br>
<br>
@@ -1360,7 +969,7 @@ class GTEST_API_ GTestLog {<br>
__FILE__, __LINE__).GetStream()<br>
<br>
inline void LogToStderr() {}<br>
-inline void FlushInfoLog() { fflush(NULL); }<br>
+inline void FlushInfoLog() { fflush(nullptr); }<br>
<br>
#endif // !defined(GTEST_LOG_)<br>
<br>
@@ -1397,19 +1006,6 @@ inline void FlushInfoLog() { fflush(NULL); }<br>
GTEST_LOG_(FATAL) << #posix_call << "failed with error " \<br>
<< gtest_error<br>
<br>
-// Adds reference to a type if it is not a reference type,<br>
-// otherwise leaves it unchanged. This is the same as<br>
-// tr1::add_reference, which is not widely available yet.<br>
-template <typename T><br>
-struct AddReference { typedef T& type; }; // NOLINT<br>
-template <typename T><br>
-struct AddReference<T&> { typedef T& type; }; // NOLINT<br>
-<br>
-// A handy wrapper around AddReference that works when the argument T<br>
-// depends on template parameters.<br>
-#define GTEST_ADD_REFERENCE_(T) \<br>
- typename ::testing::internal::AddReference<T>::type<br>
-<br>
// Transforms "T" into "const T&" according to standard reference collapsing<br>
// rules (this is only needed as a backport for C++98 compilers that do not<br>
// support reference collapsing). Specifically, it transforms:<br>
@@ -1430,28 +1026,6 @@ struct ConstRef<T&> { typedef T& type; };<br>
#define GTEST_REFERENCE_TO_CONST_(T) \<br>
typename ::testing::internal::ConstRef<T>::type<br>
<br>
-#if GTEST_HAS_STD_MOVE_<br>
-using std::forward;<br>
-using std::move;<br>
-<br>
-template <typename T><br>
-struct RvalueRef {<br>
- typedef T&& type;<br>
-};<br>
-#else // GTEST_HAS_STD_MOVE_<br>
-template <typename T><br>
-const T& move(const T& t) {<br>
- return t;<br>
-}<br>
-template <typename T><br>
-GTEST_ADD_REFERENCE_(T) forward(GTEST_ADD_REFERENCE_(T) t) { return t; }<br>
-<br>
-template <typename T><br>
-struct RvalueRef {<br>
- typedef const T& type;<br>
-};<br>
-#endif // GTEST_HAS_STD_MOVE_<br>
-<br>
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
//<br>
// Use ImplicitCast_ as a safe version of static_cast for upcasting in<br>
@@ -1505,13 +1079,13 @@ inline To DownCast_(From* f) { // so we only accept pointers<br>
GTEST_INTENTIONAL_CONST_COND_PUSH_()<br>
if (false) {<br>
GTEST_INTENTIONAL_CONST_COND_POP_()<br>
- const To to = NULL;<br>
- ::testing::internal::ImplicitCast_<From*>(to);<br>
+ const To to = nullptr;<br>
+ ::testing::internal::ImplicitCast_<From*>(to);<br>
}<br>
<br>
#if GTEST_HAS_RTTI<br>
// RTTI: debug mode only!<br>
- GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);<br>
+ GTEST_CHECK_(f == nullptr || dynamic_cast<To>(f) != nullptr);<br>
#endif<br>
return static_cast<To>(f);<br>
}<br>
@@ -1565,9 +1139,6 @@ std::vector<std::string> GetInjectableArgvs();<br>
// Deprecated: pass the args vector by value instead.<br>
void SetInjectableArgvs(const std::vector<std::string>* new_argvs);<br>
void SetInjectableArgvs(const std::vector<std::string>& new_argvs);<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-void SetInjectableArgvs(const std::vector< ::string>& new_argvs);<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
void ClearInjectableArgvs();<br>
<br>
#endif // GTEST_HAS_DEATH_TEST<br>
@@ -1583,7 +1154,7 @@ inline void SleepMilliseconds(int n) {<br>
0, // 0 seconds.<br>
n * 1000L * 1000L, // And n ms.<br>
};<br>
- nanosleep(&time, NULL);<br>
+ nanosleep(&time, nullptr);<br>
}<br>
# endif // GTEST_HAS_PTHREAD<br>
<br>
@@ -1601,7 +1172,7 @@ inline void SleepMilliseconds(int n) {<br>
class Notification {<br>
public:<br>
Notification() : notified_(false) {<br>
- GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));<br>
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr));<br>
}<br>
~Notification() {<br>
pthread_mutex_destroy(&mutex_);<br>
@@ -1659,7 +1230,8 @@ class GTEST_API_ AutoHandle {<br>
void Reset(Handle handle);<br>
<br>
private:<br>
- // Returns true iff the handle is a valid handle object that can be closed.<br>
+ // Returns true if and only if the handle is a valid handle object that can be<br>
+ // closed.<br>
bool IsCloseable() const;<br>
<br>
Handle handle_;<br>
@@ -1710,7 +1282,7 @@ class ThreadWithParamBase {<br>
// pass into pthread_create().<br>
extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {<br>
static_cast<ThreadWithParamBase*>(thread)->Run();<br>
- return NULL;<br>
+ return nullptr;<br>
}<br>
<br>
// Helper class for testing Google Test's multi-threading constructs.<br>
@@ -1739,20 +1311,19 @@ class ThreadWithParam : public ThreadWithParamBase {<br>
// The thread can be created only after all fields except thread_<br>
// have been initialized.<br>
GTEST_CHECK_POSIX_SUCCESS_(<br>
- pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));<br>
+ pthread_create(&thread_, nullptr, &ThreadFuncWithCLinkage, base));<br>
}<br>
- ~ThreadWithParam() { Join(); }<br>
+ ~ThreadWithParam() override { Join(); }<br>
<br>
void Join() {<br>
if (!finished_) {<br>
- GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));<br>
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, nullptr));<br>
finished_ = true;<br>
}<br>
}<br>
<br>
- virtual void Run() {<br>
- if (thread_can_start_ != NULL)<br>
- thread_can_start_->WaitForNotification();<br>
+ void Run() override {<br>
+ if (thread_can_start_ != nullptr) thread_can_start_->WaitForNotification();<br>
func_(param_);<br>
}<br>
<br>
@@ -1762,7 +1333,8 @@ class ThreadWithParam : public ThreadWithParamBase {<br>
// When non-NULL, used to block execution until the controller thread<br>
// notifies.<br>
Notification* const thread_can_start_;<br>
- bool finished_; // true iff we know that the thread function has finished.<br>
+ bool finished_; // true if and only if we know that the thread function has<br>
+ // finished.<br>
pthread_t thread_; // The native thread object.<br>
<br>
GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);<br>
@@ -2046,7 +1618,7 @@ class ThreadLocal : public ThreadLocalBase {<br>
GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);<br>
};<br>
<br>
- scoped_ptr<ValueHolderFactory> default_factory_;<br>
+ std::unique_ptr<ValueHolderFactory> default_factory_;<br>
<br>
GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);<br>
};<br>
@@ -2115,7 +1687,7 @@ class MutexBase {<br>
class Mutex : public MutexBase {<br>
public:<br>
Mutex() {<br>
- GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));<br>
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr));<br>
has_owner_ = false;<br>
}<br>
~Mutex() {<br>
@@ -2213,7 +1785,7 @@ class GTEST_API_ ThreadLocal {<br>
T* GetOrCreateValue() const {<br>
ThreadLocalValueHolderBase* const holder =<br>
static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));<br>
- if (holder != NULL) {<br>
+ if (holder != nullptr) {<br>
return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();<br>
}<br>
<br>
@@ -2257,7 +1829,7 @@ class GTEST_API_ ThreadLocal {<br>
<br>
// A key pthreads uses for looking up per-thread values.<br>
const pthread_key_t key_;<br>
- scoped_ptr<ValueHolderFactory> default_factory_;<br>
+ std::unique_ptr<ValueHolderFactory> default_factory_;<br>
<br>
GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);<br>
};<br>
@@ -2315,67 +1887,8 @@ class GTEST_API_ ThreadLocal {<br>
// we cannot detect it.<br>
GTEST_API_ size_t GetThreadCount();<br>
<br>
-// Passing non-POD classes through ellipsis (...) crashes the ARM<br>
-// compiler and generates a warning in Sun Studio before 12u4. The Nokia Symbian<br>
-// and the IBM XL C/C++ compiler try to instantiate a copy constructor<br>
-// for objects passed through ellipsis (...), failing for uncopyable<br>
-// objects. We define this to ensure that only POD is passed through<br>
-// ellipsis on these systems.<br>
-#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || \<br>
- (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x5130)<br>
-// We lose support for NULL detection where the compiler doesn't like<br>
-// passing non-POD classes through ellipsis (...).<br>
-# define GTEST_ELLIPSIS_NEEDS_POD_ 1<br>
-#else<br>
-# define GTEST_CAN_COMPARE_NULL 1<br>
-#endif<br>
-<br>
-// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between<br>
-// const T& and const T* in a function template. These compilers<br>
-// _can_ decide between class template specializations for T and T*,<br>
-// so a tr1::type_traits-like is_pointer works.<br>
-#if defined(__SYMBIAN32__) || defined(__IBMCPP__)<br>
-# define GTEST_NEEDS_IS_POINTER_ 1<br>
-#endif<br>
-<br>
-template <bool bool_value><br>
-struct bool_constant {<br>
- typedef bool_constant<bool_value> type;<br>
- static const bool value = bool_value;<br>
-};<br>
-template <bool bool_value> const bool bool_constant<bool_value>::value;<br>
-<br>
-typedef bool_constant<false> false_type;<br>
-typedef bool_constant<true> true_type;<br>
-<br>
-template <typename T, typename U><br>
-struct is_same : public false_type {};<br>
-<br>
-template <typename T><br>
-struct is_same<T, T> : public true_type {};<br>
-<br>
-<br>
-template <typename T><br>
-struct is_pointer : public false_type {};<br>
-<br>
-template <typename T><br>
-struct is_pointer<T*> : public true_type {};<br>
-<br>
-template <typename Iterator><br>
-struct IteratorTraits {<br>
- typedef typename Iterator::value_type value_type;<br>
-};<br>
-<br>
-<br>
-template <typename T><br>
-struct IteratorTraits<T*> {<br>
- typedef T value_type;<br>
-};<br>
-<br>
-template <typename T><br>
-struct IteratorTraits<const T*> {<br>
- typedef T value_type;<br>
-};<br>
+template <bool B><br>
+using bool_constant = std::integral_constant<bool, B>;<br>
<br>
#if GTEST_OS_WINDOWS<br>
# define GTEST_PATH_SEP_ "\\"<br>
@@ -2535,12 +2048,12 @@ inline const char* GetEnv(const char* name) {<br>
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT<br>
// We are on Windows CE, which has no environment variables.<br>
static_cast<void>(name); // To prevent 'unused argument' warning.<br>
- return NULL;<br>
+ return nullptr;<br>
#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)<br>
// Environment variables which we programmatically clear will be set to the<br>
// empty string rather than unset (NULL). Handle that case.<br>
const char* const env = getenv(name);<br>
- return (env != NULL && env[0] != '\0') ? env : NULL;<br>
+ return (env != nullptr && env[0] != '\0') ? env : nullptr;<br>
#else<br>
return getenv(name);<br>
#endif<br>
@@ -2552,9 +2065,9 @@ GTEST_DISABLE_MSC_DEPRECATED_POP_()<br>
// Windows CE has no C library. The abort() function is used in<br>
// several places in Google Test. This implementation provides a reasonable<br>
// imitation of standard behaviour.<br>
-void Abort();<br>
+[[noreturn]] void Abort();<br>
#else<br>
-inline void Abort() { abort(); }<br>
+[[noreturn]] inline void Abort() { abort(); }<br>
#endif // GTEST_OS_WINDOWS_MOBILE<br>
<br>
} // namespace posix<br>
@@ -2564,13 +2077,12 @@ inline void Abort() { abort(); }<br>
// MSVC-based platforms. We map the GTEST_SNPRINTF_ macro to the appropriate<br>
// function in order to achieve that. We use macro definition here because<br>
// snprintf is a variadic function.<br>
-#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE<br>
+#if _MSC_VER && !GTEST_OS_WINDOWS_MOBILE<br>
// MSVC 2005 and above support variadic macros.<br>
# define GTEST_SNPRINTF_(buffer, size, format, ...) \<br>
_snprintf_s(buffer, size, size, format, __VA_ARGS__)<br>
#elif defined(_MSC_VER)<br>
-// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't<br>
-// complain about _snprintf.<br>
+// Windows CE does not define _snprintf_s<br>
# define GTEST_SNPRINTF_ _snprintf<br>
#else<br>
# define GTEST_SNPRINTF_ snprintf<br>
@@ -2684,9 +2196,6 @@ typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds.<br>
// Parses 'str' for a 32-bit signed integer. If successful, writes the result<br>
// to *value and returns true; otherwise leaves *value unchanged and returns<br>
// false.<br>
-// FIXME: Find a better way to refactor flag and environment parsing<br>
-// out of both gtest-port.cc and gtest.cc to avoid exporting this utility<br>
-// function.<br>
bool ParseInt32(const Message& src_text, const char* str, Int32* value);<br>
<br>
// Parses a bool/Int32/string from the environment variable<br>
@@ -2699,4 +2208,24 @@ const char* StringFromGTestEnv(const char* flag, const char* default_val);<br>
} // namespace internal<br>
} // namespace testing<br>
<br>
+#if !defined(GTEST_INTERNAL_DEPRECATED)<br>
+<br>
+// Internal Macro to mark an API deprecated, for googletest usage only<br>
+// Usage: class GTEST_INTERNAL_DEPRECATED(message) MyClass or<br>
+// GTEST_INTERNAL_DEPRECATED(message) <return_type> myFunction(); Every usage of<br>
+// a deprecated entity will trigger a warning when compiled with<br>
+// `-Wdeprecated-declarations` option (clang, gcc, any __GNUC__ compiler).<br>
+// For msvc /W3 option will need to be used<br>
+// Note that for 'other' compilers this macro evaluates to nothing to prevent<br>
+// compilations errors.<br>
+#if defined(_MSC_VER)<br>
+#define GTEST_INTERNAL_DEPRECATED(message) __declspec(deprecated(message))<br>
+#elif defined(__GNUC__)<br>
+#define GTEST_INTERNAL_DEPRECATED(message) __attribute__((deprecated(message)))<br>
+#else<br>
+#define GTEST_INTERNAL_DEPRECATED(message)<br>
+#endif<br>
+<br>
+#endif // !defined(GTEST_INTERNAL_DEPRECATED)<br>
+<br>
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-string.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-string.h<br>
index 4c9b6262c3c10..82aaa63bf4657 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-string.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-string.h<br>
@@ -94,7 +94,8 @@ class GTEST_API_ String {<br>
static const char* Utf16ToAnsi(LPCWSTR utf16_str);<br>
#endif<br>
<br>
- // Compares two C strings. Returns true iff they have the same content.<br>
+ // Compares two C strings. Returns true if and only if they have the same<br>
+ // content.<br>
//<br>
// Unlike strcmp(), this function can handle NULL argument(s). A<br>
// NULL C string is considered <br>
diff erent to any non-NULL C string,<br>
@@ -107,16 +108,16 @@ class GTEST_API_ String {<br>
// returned.<br>
static std::string ShowWideCString(const wchar_t* wide_c_str);<br>
<br>
- // Compares two wide C strings. Returns true iff they have the same<br>
- // content.<br>
+ // Compares two wide C strings. Returns true if and only if they have the<br>
+ // same content.<br>
//<br>
// Unlike wcscmp(), this function can handle NULL argument(s). A<br>
// NULL C string is considered <br>
diff erent to any non-NULL C string,<br>
// including the empty string.<br>
static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);<br>
<br>
- // Compares two C strings, ignoring case. Returns true iff they<br>
- // have the same content.<br>
+ // Compares two C strings, ignoring case. Returns true if and only if<br>
+ // they have the same content.<br>
//<br>
// Unlike strcasecmp(), this function can handle NULL argument(s).<br>
// A NULL C string is considered <br>
diff erent to any non-NULL C string,<br>
@@ -124,8 +125,8 @@ class GTEST_API_ String {<br>
static bool CaseInsensitiveCStringEquals(const char* lhs,<br>
const char* rhs);<br>
<br>
- // Compares two wide C strings, ignoring case. Returns true iff they<br>
- // have the same content.<br>
+ // Compares two wide C strings, ignoring case. Returns true if and only if<br>
+ // they have the same content.<br>
//<br>
// Unlike wcscasecmp(), this function can handle NULL argument(s).<br>
// A NULL C string is considered <br>
diff erent to any non-NULL wide C string,<br>
@@ -139,8 +140,8 @@ class GTEST_API_ String {<br>
static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,<br>
const wchar_t* rhs);<br>
<br>
- // Returns true iff the given string ends with the given suffix, ignoring<br>
- // case. Any string is considered to end with an empty suffix.<br>
+ // Returns true if and only if the given string ends with the given suffix,<br>
+ // ignoring case. Any string is considered to end with an empty suffix.<br>
static bool EndsWithCaseInsensitive(<br>
const std::string& str, const std::string& suffix);<br>
<br>
@@ -150,6 +151,9 @@ class GTEST_API_ String {<br>
// Formats an int value as "%X".<br>
static std::string FormatHexInt(int value);<br>
<br>
+ // Formats an int value as "%X".<br>
+ static std::string FormatHexUInt32(UInt32 value);<br>
+<br>
// Formats a byte as "%02X".<br>
static std::string FormatByte(unsigned char value);<br>
<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-tuple.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-tuple.h<br>
deleted file mode 100644<br>
index 78a3a6a01fac7..0000000000000<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-tuple.h<br>
+++ /dev/null<br>
@@ -1,1021 +0,0 @@<br>
-// This file was GENERATED by command:<br>
-// pump.py gtest-tuple.h.pump<br>
-// DO NOT EDIT BY HAND!!!<br>
-<br>
-// Copyright 2009 Google Inc.<br>
-// All Rights Reserved.<br>
-//<br>
-// Redistribution and use in source and binary forms, with or without<br>
-// modification, are permitted provided that the following conditions are<br>
-// met:<br>
-//<br>
-// * Redistributions of source code must retain the above copyright<br>
-// notice, this list of conditions and the following disclaimer.<br>
-// * Redistributions in binary form must reproduce the above<br>
-// copyright notice, this list of conditions and the following disclaimer<br>
-// in the documentation and/or other materials provided with the<br>
-// distribution.<br>
-// * Neither the name of Google Inc. nor the names of its<br>
-// contributors may be used to endorse or promote products derived from<br>
-// this software without specific prior written permission.<br>
-//<br>
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
-<br>
-<br>
-// Implements a subset of TR1 tuple needed by Google Test and Google Mock.<br>
-<br>
-// GOOGLETEST_CM0001 DO NOT DELETE<br>
-<br>
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_<br>
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_<br>
-<br>
-#include <utility> // For ::std::pair.<br>
-<br>
-// The compiler used in Symbian has a bug that prevents us from declaring the<br>
-// tuple template as a friend (it complains that tuple is redefined). This<br>
-// bypasses the bug by declaring the members that should otherwise be<br>
-// private as public.<br>
-// Sun Studio versions < 12 also have the above bug.<br>
-#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)<br>
-# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:<br>
-#else<br>
-# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \<br>
- template <GTEST_10_TYPENAMES_(U)> friend class tuple; \<br>
- private:<br>
-#endif<br>
-<br>
-// Visual Studio 2010, 2012, and 2013 define symbols in std::tr1 that conflict<br>
-// with our own definitions. Therefore using our own tuple does not work on<br>
-// those compilers.<br>
-#if defined(_MSC_VER) && _MSC_VER >= 1600 /* 1600 is Visual Studio 2010 */<br>
-# error "gtest's tuple doesn't compile on Visual Studio 2010 or later. \<br>
-GTEST_USE_OWN_TR1_TUPLE must be set to 0 on those compilers."<br>
-#endif<br>
-<br>
-// GTEST_n_TUPLE_(T) is the type of an n-tuple.<br>
-#define GTEST_0_TUPLE_(T) tuple<><br>
-#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \<br>
- void, void, void><br>
-#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \<br>
- void, void, void><br>
-#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \<br>
- void, void, void><br>
-#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \<br>
- void, void, void><br>
-#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \<br>
- void, void, void><br>
-#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \<br>
- void, void, void><br>
-#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \<br>
- void, void, void><br>
-#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \<br>
- T##7, void, void><br>
-#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \<br>
- T##7, T##8, void><br>
-#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \<br>
- T##7, T##8, T##9><br>
-<br>
-// GTEST_n_TYPENAMES_(T) declares a list of n typenames.<br>
-#define GTEST_0_TYPENAMES_(T)<br>
-#define GTEST_1_TYPENAMES_(T) typename T##0<br>
-#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1<br>
-#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2<br>
-#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \<br>
- typename T##3<br>
-#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \<br>
- typename T##3, typename T##4<br>
-#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \<br>
- typename T##3, typename T##4, typename T##5<br>
-#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \<br>
- typename T##3, typename T##4, typename T##5, typename T##6<br>
-#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \<br>
- typename T##3, typename T##4, typename T##5, typename T##6, typename T##7<br>
-#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \<br>
- typename T##3, typename T##4, typename T##5, typename T##6, \<br>
- typename T##7, typename T##8<br>
-#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \<br>
- typename T##3, typename T##4, typename T##5, typename T##6, \<br>
- typename T##7, typename T##8, typename T##9<br>
-<br>
-// In theory, defining stuff in the ::std namespace is undefined<br>
-// behavior. We can do this as we are playing the role of a standard<br>
-// library vendor.<br>
-namespace std {<br>
-namespace tr1 {<br>
-<br>
-template <typename T0 = void, typename T1 = void, typename T2 = void,<br>
- typename T3 = void, typename T4 = void, typename T5 = void,<br>
- typename T6 = void, typename T7 = void, typename T8 = void,<br>
- typename T9 = void><br>
-class tuple;<br>
-<br>
-// Anything in namespace gtest_internal is Google Test's INTERNAL<br>
-// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.<br>
-namespace gtest_internal {<br>
-<br>
-// ByRef<T>::type is T if T is a reference; otherwise it's const T&.<br>
-template <typename T><br>
-struct ByRef { typedef const T& type; }; // NOLINT<br>
-template <typename T><br>
-struct ByRef<T&> { typedef T& type; }; // NOLINT<br>
-<br>
-// A handy wrapper for ByRef.<br>
-#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type<br>
-<br>
-// AddRef<T>::type is T if T is a reference; otherwise it's T&. This<br>
-// is the same as tr1::add_reference<T>::type.<br>
-template <typename T><br>
-struct AddRef { typedef T& type; }; // NOLINT<br>
-template <typename T><br>
-struct AddRef<T&> { typedef T& type; }; // NOLINT<br>
-<br>
-// A handy wrapper for AddRef.<br>
-#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type<br>
-<br>
-// A helper for implementing get<k>().<br>
-template <int k> class Get;<br>
-<br>
-// A helper for implementing tuple_element<k, T>. kIndexValid is true<br>
-// iff k < the number of fields in tuple type T.<br>
-template <bool kIndexValid, int kIndex, class Tuple><br>
-struct TupleElement;<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {<br>
- typedef T0 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {<br>
- typedef T1 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {<br>
- typedef T2 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {<br>
- typedef T3 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {<br>
- typedef T4 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {<br>
- typedef T5 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {<br>
- typedef T6 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {<br>
- typedef T7 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {<br>
- typedef T8 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {<br>
- typedef T9 type;<br>
-};<br>
-<br>
-} // namespace gtest_internal<br>
-<br>
-template <><br>
-class tuple<> {<br>
- public:<br>
- tuple() {}<br>
- tuple(const tuple& /* t */) {}<br>
- tuple& operator=(const tuple& /* t */) { return *this; }<br>
-};<br>
-<br>
-template <GTEST_1_TYPENAMES_(T)><br>
-class GTEST_1_TUPLE_(T) {<br>
- public:<br>
- template <int k> friend class gtest_internal::Get;<br>
-<br>
- tuple() : f0_() {}<br>
-<br>
- explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}<br>
-<br>
- tuple(const tuple& t) : f0_(t.f0_) {}<br>
-<br>
- template <GTEST_1_TYPENAMES_(U)><br>
- tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}<br>
-<br>
- tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
- template <GTEST_1_TYPENAMES_(U)><br>
- tuple& operator=(const GTEST_1_TUPLE_(U)& t) {<br>
- return CopyFrom(t);<br>
- }<br>
-<br>
- GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
- template <GTEST_1_TYPENAMES_(U)><br>
- tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {<br>
- f0_ = t.f0_;<br>
- return *this;<br>
- }<br>
-<br>
- T0 f0_;<br>
-};<br>
-<br>
-template <GTEST_2_TYPENAMES_(T)><br>
-class GTEST_2_TUPLE_(T) {<br>
- public:<br>
- template <int k> friend class gtest_internal::Get;<br>
-<br>
- tuple() : f0_(), f1_() {}<br>
-<br>
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),<br>
- f1_(f1) {}<br>
-<br>
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}<br>
-<br>
- template <GTEST_2_TYPENAMES_(U)><br>
- tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}<br>
- template <typename U0, typename U1><br>
- tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}<br>
-<br>
- tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
- template <GTEST_2_TYPENAMES_(U)><br>
- tuple& operator=(const GTEST_2_TUPLE_(U)& t) {<br>
- return CopyFrom(t);<br>
- }<br>
- template <typename U0, typename U1><br>
- tuple& operator=(const ::std::pair<U0, U1>& p) {<br>
- f0_ = p.first;<br>
- f1_ = p.second;<br>
- return *this;<br>
- }<br>
-<br>
- GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
- template <GTEST_2_TYPENAMES_(U)><br>
- tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {<br>
- f0_ = t.f0_;<br>
- f1_ = t.f1_;<br>
- return *this;<br>
- }<br>
-<br>
- T0 f0_;<br>
- T1 f1_;<br>
-};<br>
-<br>
-template <GTEST_3_TYPENAMES_(T)><br>
-class GTEST_3_TUPLE_(T) {<br>
- public:<br>
- template <int k> friend class gtest_internal::Get;<br>
-<br>
- tuple() : f0_(), f1_(), f2_() {}<br>
-<br>
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
- GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}<br>
-<br>
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}<br>
-<br>
- template <GTEST_3_TYPENAMES_(U)><br>
- tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}<br>
-<br>
- tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
- template <GTEST_3_TYPENAMES_(U)><br>
- tuple& operator=(const GTEST_3_TUPLE_(U)& t) {<br>
- return CopyFrom(t);<br>
- }<br>
-<br>
- GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
- template <GTEST_3_TYPENAMES_(U)><br>
- tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {<br>
- f0_ = t.f0_;<br>
- f1_ = t.f1_;<br>
- f2_ = t.f2_;<br>
- return *this;<br>
- }<br>
-<br>
- T0 f0_;<br>
- T1 f1_;<br>
- T2 f2_;<br>
-};<br>
-<br>
-template <GTEST_4_TYPENAMES_(T)><br>
-class GTEST_4_TUPLE_(T) {<br>
- public:<br>
- template <int k> friend class gtest_internal::Get;<br>
-<br>
- tuple() : f0_(), f1_(), f2_(), f3_() {}<br>
-<br>
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),<br>
- f3_(f3) {}<br>
-<br>
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}<br>
-<br>
- template <GTEST_4_TYPENAMES_(U)><br>
- tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),<br>
- f3_(t.f3_) {}<br>
-<br>
- tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
- template <GTEST_4_TYPENAMES_(U)><br>
- tuple& operator=(const GTEST_4_TUPLE_(U)& t) {<br>
- return CopyFrom(t);<br>
- }<br>
-<br>
- GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
- template <GTEST_4_TYPENAMES_(U)><br>
- tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {<br>
- f0_ = t.f0_;<br>
- f1_ = t.f1_;<br>
- f2_ = t.f2_;<br>
- f3_ = t.f3_;<br>
- return *this;<br>
- }<br>
-<br>
- T0 f0_;<br>
- T1 f1_;<br>
- T2 f2_;<br>
- T3 f3_;<br>
-};<br>
-<br>
-template <GTEST_5_TYPENAMES_(T)><br>
-class GTEST_5_TUPLE_(T) {<br>
- public:<br>
- template <int k> friend class gtest_internal::Get;<br>
-<br>
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}<br>
-<br>
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,<br>
- GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}<br>
-<br>
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),<br>
- f4_(t.f4_) {}<br>
-<br>
- template <GTEST_5_TYPENAMES_(U)><br>
- tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),<br>
- f3_(t.f3_), f4_(t.f4_) {}<br>
-<br>
- tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
- template <GTEST_5_TYPENAMES_(U)><br>
- tuple& operator=(const GTEST_5_TUPLE_(U)& t) {<br>
- return CopyFrom(t);<br>
- }<br>
-<br>
- GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
- template <GTEST_5_TYPENAMES_(U)><br>
- tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {<br>
- f0_ = t.f0_;<br>
- f1_ = t.f1_;<br>
- f2_ = t.f2_;<br>
- f3_ = t.f3_;<br>
- f4_ = t.f4_;<br>
- return *this;<br>
- }<br>
-<br>
- T0 f0_;<br>
- T1 f1_;<br>
- T2 f2_;<br>
- T3 f3_;<br>
- T4 f4_;<br>
-};<br>
-<br>
-template <GTEST_6_TYPENAMES_(T)><br>
-class GTEST_6_TUPLE_(T) {<br>
- public:<br>
- template <int k> friend class gtest_internal::Get;<br>
-<br>
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}<br>
-<br>
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,<br>
- GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),<br>
- f5_(f5) {}<br>
-<br>
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),<br>
- f4_(t.f4_), f5_(t.f5_) {}<br>
-<br>
- template <GTEST_6_TYPENAMES_(U)><br>
- tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),<br>
- f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}<br>
-<br>
- tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
- template <GTEST_6_TYPENAMES_(U)><br>
- tuple& operator=(const GTEST_6_TUPLE_(U)& t) {<br>
- return CopyFrom(t);<br>
- }<br>
-<br>
- GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
- template <GTEST_6_TYPENAMES_(U)><br>
- tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {<br>
- f0_ = t.f0_;<br>
- f1_ = t.f1_;<br>
- f2_ = t.f2_;<br>
- f3_ = t.f3_;<br>
- f4_ = t.f4_;<br>
- f5_ = t.f5_;<br>
- return *this;<br>
- }<br>
-<br>
- T0 f0_;<br>
- T1 f1_;<br>
- T2 f2_;<br>
- T3 f3_;<br>
- T4 f4_;<br>
- T5 f5_;<br>
-};<br>
-<br>
-template <GTEST_7_TYPENAMES_(T)><br>
-class GTEST_7_TUPLE_(T) {<br>
- public:<br>
- template <int k> friend class gtest_internal::Get;<br>
-<br>
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}<br>
-<br>
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,<br>
- GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),<br>
- f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}<br>
-<br>
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),<br>
- f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}<br>
-<br>
- template <GTEST_7_TYPENAMES_(U)><br>
- tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),<br>
- f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}<br>
-<br>
- tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
- template <GTEST_7_TYPENAMES_(U)><br>
- tuple& operator=(const GTEST_7_TUPLE_(U)& t) {<br>
- return CopyFrom(t);<br>
- }<br>
-<br>
- GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
- template <GTEST_7_TYPENAMES_(U)><br>
- tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {<br>
- f0_ = t.f0_;<br>
- f1_ = t.f1_;<br>
- f2_ = t.f2_;<br>
- f3_ = t.f3_;<br>
- f4_ = t.f4_;<br>
- f5_ = t.f5_;<br>
- f6_ = t.f6_;<br>
- return *this;<br>
- }<br>
-<br>
- T0 f0_;<br>
- T1 f1_;<br>
- T2 f2_;<br>
- T3 f3_;<br>
- T4 f4_;<br>
- T5 f5_;<br>
- T6 f6_;<br>
-};<br>
-<br>
-template <GTEST_8_TYPENAMES_(T)><br>
-class GTEST_8_TUPLE_(T) {<br>
- public:<br>
- template <int k> friend class gtest_internal::Get;<br>
-<br>
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}<br>
-<br>
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,<br>
- GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,<br>
- GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),<br>
- f5_(f5), f6_(f6), f7_(f7) {}<br>
-<br>
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),<br>
- f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}<br>
-<br>
- template <GTEST_8_TYPENAMES_(U)><br>
- tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),<br>
- f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}<br>
-<br>
- tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
- template <GTEST_8_TYPENAMES_(U)><br>
- tuple& operator=(const GTEST_8_TUPLE_(U)& t) {<br>
- return CopyFrom(t);<br>
- }<br>
-<br>
- GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
- template <GTEST_8_TYPENAMES_(U)><br>
- tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {<br>
- f0_ = t.f0_;<br>
- f1_ = t.f1_;<br>
- f2_ = t.f2_;<br>
- f3_ = t.f3_;<br>
- f4_ = t.f4_;<br>
- f5_ = t.f5_;<br>
- f6_ = t.f6_;<br>
- f7_ = t.f7_;<br>
- return *this;<br>
- }<br>
-<br>
- T0 f0_;<br>
- T1 f1_;<br>
- T2 f2_;<br>
- T3 f3_;<br>
- T4 f4_;<br>
- T5 f5_;<br>
- T6 f6_;<br>
- T7 f7_;<br>
-};<br>
-<br>
-template <GTEST_9_TYPENAMES_(T)><br>
-class GTEST_9_TUPLE_(T) {<br>
- public:<br>
- template <int k> friend class gtest_internal::Get;<br>
-<br>
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}<br>
-<br>
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,<br>
- GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,<br>
- GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),<br>
- f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}<br>
-<br>
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),<br>
- f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}<br>
-<br>
- template <GTEST_9_TYPENAMES_(U)><br>
- tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),<br>
- f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}<br>
-<br>
- tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
- template <GTEST_9_TYPENAMES_(U)><br>
- tuple& operator=(const GTEST_9_TUPLE_(U)& t) {<br>
- return CopyFrom(t);<br>
- }<br>
-<br>
- GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
- template <GTEST_9_TYPENAMES_(U)><br>
- tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {<br>
- f0_ = t.f0_;<br>
- f1_ = t.f1_;<br>
- f2_ = t.f2_;<br>
- f3_ = t.f3_;<br>
- f4_ = t.f4_;<br>
- f5_ = t.f5_;<br>
- f6_ = t.f6_;<br>
- f7_ = t.f7_;<br>
- f8_ = t.f8_;<br>
- return *this;<br>
- }<br>
-<br>
- T0 f0_;<br>
- T1 f1_;<br>
- T2 f2_;<br>
- T3 f3_;<br>
- T4 f4_;<br>
- T5 f5_;<br>
- T6 f6_;<br>
- T7 f7_;<br>
- T8 f8_;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-class tuple {<br>
- public:<br>
- template <int k> friend class gtest_internal::Get;<br>
-<br>
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),<br>
- f9_() {}<br>
-<br>
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,<br>
- GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,<br>
- GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),<br>
- f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}<br>
-<br>
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),<br>
- f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}<br>
-<br>
- template <GTEST_10_TYPENAMES_(U)><br>
- tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),<br>
- f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),<br>
- f9_(t.f9_) {}<br>
-<br>
- tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
- template <GTEST_10_TYPENAMES_(U)><br>
- tuple& operator=(const GTEST_10_TUPLE_(U)& t) {<br>
- return CopyFrom(t);<br>
- }<br>
-<br>
- GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
- template <GTEST_10_TYPENAMES_(U)><br>
- tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {<br>
- f0_ = t.f0_;<br>
- f1_ = t.f1_;<br>
- f2_ = t.f2_;<br>
- f3_ = t.f3_;<br>
- f4_ = t.f4_;<br>
- f5_ = t.f5_;<br>
- f6_ = t.f6_;<br>
- f7_ = t.f7_;<br>
- f8_ = t.f8_;<br>
- f9_ = t.f9_;<br>
- return *this;<br>
- }<br>
-<br>
- T0 f0_;<br>
- T1 f1_;<br>
- T2 f2_;<br>
- T3 f3_;<br>
- T4 f4_;<br>
- T5 f5_;<br>
- T6 f6_;<br>
- T7 f7_;<br>
- T8 f8_;<br>
- T9 f9_;<br>
-};<br>
-<br>
-// 6.1.3.2 Tuple creation functions.<br>
-<br>
-// Known limitations: we don't support passing an<br>
-// std::tr1::reference_wrapper<T> to make_tuple(). And we don't<br>
-// implement tie().<br>
-<br>
-inline tuple<> make_tuple() { return tuple<>(); }<br>
-<br>
-template <GTEST_1_TYPENAMES_(T)><br>
-inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {<br>
- return GTEST_1_TUPLE_(T)(f0);<br>
-}<br>
-<br>
-template <GTEST_2_TYPENAMES_(T)><br>
-inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {<br>
- return GTEST_2_TUPLE_(T)(f0, f1);<br>
-}<br>
-<br>
-template <GTEST_3_TYPENAMES_(T)><br>
-inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {<br>
- return GTEST_3_TUPLE_(T)(f0, f1, f2);<br>
-}<br>
-<br>
-template <GTEST_4_TYPENAMES_(T)><br>
-inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,<br>
- const T3& f3) {<br>
- return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);<br>
-}<br>
-<br>
-template <GTEST_5_TYPENAMES_(T)><br>
-inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,<br>
- const T3& f3, const T4& f4) {<br>
- return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);<br>
-}<br>
-<br>
-template <GTEST_6_TYPENAMES_(T)><br>
-inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,<br>
- const T3& f3, const T4& f4, const T5& f5) {<br>
- return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);<br>
-}<br>
-<br>
-template <GTEST_7_TYPENAMES_(T)><br>
-inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,<br>
- const T3& f3, const T4& f4, const T5& f5, const T6& f6) {<br>
- return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);<br>
-}<br>
-<br>
-template <GTEST_8_TYPENAMES_(T)><br>
-inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,<br>
- const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {<br>
- return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);<br>
-}<br>
-<br>
-template <GTEST_9_TYPENAMES_(T)><br>
-inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,<br>
- const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,<br>
- const T8& f8) {<br>
- return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);<br>
-}<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,<br>
- const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,<br>
- const T8& f8, const T9& f9) {<br>
- return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);<br>
-}<br>
-<br>
-// 6.1.3.3 Tuple helper classes.<br>
-<br>
-template <typename Tuple> struct tuple_size;<br>
-<br>
-template <GTEST_0_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_0_TUPLE_(T) > {<br>
- static const int value = 0;<br>
-};<br>
-<br>
-template <GTEST_1_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_1_TUPLE_(T) > {<br>
- static const int value = 1;<br>
-};<br>
-<br>
-template <GTEST_2_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_2_TUPLE_(T) > {<br>
- static const int value = 2;<br>
-};<br>
-<br>
-template <GTEST_3_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_3_TUPLE_(T) > {<br>
- static const int value = 3;<br>
-};<br>
-<br>
-template <GTEST_4_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_4_TUPLE_(T) > {<br>
- static const int value = 4;<br>
-};<br>
-<br>
-template <GTEST_5_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_5_TUPLE_(T) > {<br>
- static const int value = 5;<br>
-};<br>
-<br>
-template <GTEST_6_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_6_TUPLE_(T) > {<br>
- static const int value = 6;<br>
-};<br>
-<br>
-template <GTEST_7_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_7_TUPLE_(T) > {<br>
- static const int value = 7;<br>
-};<br>
-<br>
-template <GTEST_8_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_8_TUPLE_(T) > {<br>
- static const int value = 8;<br>
-};<br>
-<br>
-template <GTEST_9_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_9_TUPLE_(T) > {<br>
- static const int value = 9;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_10_TUPLE_(T) > {<br>
- static const int value = 10;<br>
-};<br>
-<br>
-template <int k, class Tuple><br>
-struct tuple_element {<br>
- typedef typename gtest_internal::TupleElement<<br>
- k < (tuple_size<Tuple>::value), k, Tuple>::type type;<br>
-};<br>
-<br>
-#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type<br>
-<br>
-// 6.1.3.4 Element access.<br>
-<br>
-namespace gtest_internal {<br>
-<br>
-template <><br>
-class Get<0> {<br>
- public:<br>
- template <class Tuple><br>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))<br>
- Field(Tuple& t) { return t.f0_; } // NOLINT<br>
-<br>
- template <class Tuple><br>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))<br>
- ConstField(const Tuple& t) { return t.f0_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<1> {<br>
- public:<br>
- template <class Tuple><br>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))<br>
- Field(Tuple& t) { return t.f1_; } // NOLINT<br>
-<br>
- template <class Tuple><br>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))<br>
- ConstField(const Tuple& t) { return t.f1_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<2> {<br>
- public:<br>
- template <class Tuple><br>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))<br>
- Field(Tuple& t) { return t.f2_; } // NOLINT<br>
-<br>
- template <class Tuple><br>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))<br>
- ConstField(const Tuple& t) { return t.f2_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<3> {<br>
- public:<br>
- template <class Tuple><br>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))<br>
- Field(Tuple& t) { return t.f3_; } // NOLINT<br>
-<br>
- template <class Tuple><br>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))<br>
- ConstField(const Tuple& t) { return t.f3_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<4> {<br>
- public:<br>
- template <class Tuple><br>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))<br>
- Field(Tuple& t) { return t.f4_; } // NOLINT<br>
-<br>
- template <class Tuple><br>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))<br>
- ConstField(const Tuple& t) { return t.f4_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<5> {<br>
- public:<br>
- template <class Tuple><br>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))<br>
- Field(Tuple& t) { return t.f5_; } // NOLINT<br>
-<br>
- template <class Tuple><br>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))<br>
- ConstField(const Tuple& t) { return t.f5_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<6> {<br>
- public:<br>
- template <class Tuple><br>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))<br>
- Field(Tuple& t) { return t.f6_; } // NOLINT<br>
-<br>
- template <class Tuple><br>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))<br>
- ConstField(const Tuple& t) { return t.f6_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<7> {<br>
- public:<br>
- template <class Tuple><br>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))<br>
- Field(Tuple& t) { return t.f7_; } // NOLINT<br>
-<br>
- template <class Tuple><br>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))<br>
- ConstField(const Tuple& t) { return t.f7_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<8> {<br>
- public:<br>
- template <class Tuple><br>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))<br>
- Field(Tuple& t) { return t.f8_; } // NOLINT<br>
-<br>
- template <class Tuple><br>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))<br>
- ConstField(const Tuple& t) { return t.f8_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<9> {<br>
- public:<br>
- template <class Tuple><br>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))<br>
- Field(Tuple& t) { return t.f9_; } // NOLINT<br>
-<br>
- template <class Tuple><br>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))<br>
- ConstField(const Tuple& t) { return t.f9_; }<br>
-};<br>
-<br>
-} // namespace gtest_internal<br>
-<br>
-template <int k, GTEST_10_TYPENAMES_(T)><br>
-GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))<br>
-get(GTEST_10_TUPLE_(T)& t) {<br>
- return gtest_internal::Get<k>::Field(t);<br>
-}<br>
-<br>
-template <int k, GTEST_10_TYPENAMES_(T)><br>
-GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))<br>
-get(const GTEST_10_TUPLE_(T)& t) {<br>
- return gtest_internal::Get<k>::ConstField(t);<br>
-}<br>
-<br>
-// 6.1.3.5 Relational operators<br>
-<br>
-// We only implement == and !=, as we don't have a need for the rest yet.<br>
-<br>
-namespace gtest_internal {<br>
-<br>
-// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the<br>
-// first k fields of t1 equals the first k fields of t2.<br>
-// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if<br>
-// k1 != k2.<br>
-template <int kSize1, int kSize2><br>
-struct SameSizeTuplePrefixComparator;<br>
-<br>
-template <><br>
-struct SameSizeTuplePrefixComparator<0, 0> {<br>
- template <class Tuple1, class Tuple2><br>
- static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {<br>
- return true;<br>
- }<br>
-};<br>
-<br>
-template <int k><br>
-struct SameSizeTuplePrefixComparator<k, k> {<br>
- template <class Tuple1, class Tuple2><br>
- static bool Eq(const Tuple1& t1, const Tuple2& t2) {<br>
- return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&<br>
- ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);<br>
- }<br>
-};<br>
-<br>
-} // namespace gtest_internal<br>
-<br>
-template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)><br>
-inline bool operator==(const GTEST_10_TUPLE_(T)& t,<br>
- const GTEST_10_TUPLE_(U)& u) {<br>
- return gtest_internal::SameSizeTuplePrefixComparator<<br>
- tuple_size<GTEST_10_TUPLE_(T) >::value,<br>
- tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);<br>
-}<br>
-<br>
-template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)><br>
-inline bool operator!=(const GTEST_10_TUPLE_(T)& t,<br>
- const GTEST_10_TUPLE_(U)& u) { return !(t == u); }<br>
-<br>
-// 6.1.4 Pairs.<br>
-// Unimplemented.<br>
-<br>
-} // namespace tr1<br>
-} // namespace std<br>
-<br>
-#undef GTEST_0_TUPLE_<br>
-#undef GTEST_1_TUPLE_<br>
-#undef GTEST_2_TUPLE_<br>
-#undef GTEST_3_TUPLE_<br>
-#undef GTEST_4_TUPLE_<br>
-#undef GTEST_5_TUPLE_<br>
-#undef GTEST_6_TUPLE_<br>
-#undef GTEST_7_TUPLE_<br>
-#undef GTEST_8_TUPLE_<br>
-#undef GTEST_9_TUPLE_<br>
-#undef GTEST_10_TUPLE_<br>
-<br>
-#undef GTEST_0_TYPENAMES_<br>
-#undef GTEST_1_TYPENAMES_<br>
-#undef GTEST_2_TYPENAMES_<br>
-#undef GTEST_3_TYPENAMES_<br>
-#undef GTEST_4_TYPENAMES_<br>
-#undef GTEST_5_TYPENAMES_<br>
-#undef GTEST_6_TYPENAMES_<br>
-#undef GTEST_7_TYPENAMES_<br>
-#undef GTEST_8_TYPENAMES_<br>
-#undef GTEST_9_TYPENAMES_<br>
-#undef GTEST_10_TYPENAMES_<br>
-<br>
-#undef GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-#undef GTEST_BY_REF_<br>
-#undef GTEST_ADD_REF_<br>
-#undef GTEST_TUPLE_ELEMENT_<br>
-<br>
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_<br>
<br>
diff --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-type-util.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-type-util.h<br>
index 28e411245361c..3d7542d1fb350 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-type-util.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-type-util.h<br>
@@ -31,12 +31,11 @@<br>
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
<br>
-<br>
// Type utilities needed for implementing typed and type-parameterized<br>
// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!<br>
//<br>
// Currently we support at most 50 types in a list, and at most 50<br>
-// type-parameterized tests in one type-parameterized test case.<br>
+// type-parameterized tests in one type-parameterized test suite.<br>
// Please contact <a href="mailto:googletestframework@googlegroups.com" target="_blank">googletestframework@googlegroups.com</a> if you need<br>
// more.<br>
<br>
@@ -89,7 +88,7 @@ std::string GetTypeName() {<br>
# if GTEST_HAS_CXXABI_H_<br>
using abi::__cxa_demangle;<br>
# endif // GTEST_HAS_CXXABI_H_<br>
- char* const readable_name = __cxa_demangle(name, 0, 0, &status);<br>
+ char* const readable_name = __cxa_demangle(name, nullptr, nullptr, &status);<br>
const std::string name_str(status == 0 ? readable_name : name);<br>
free(readable_name);<br>
return CanonicalizeForStdLibVersioning(name_str);<br>
@@ -106,18 +105,6 @@ std::string GetTypeName() {<br>
<br>
#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P<br>
<br>
-// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same<br>
-// type. This can be used as a compile-time assertion to ensure that<br>
-// two types are equal.<br>
-<br>
-template <typename T1, typename T2><br>
-struct AssertTypeEq;<br>
-<br>
-template <typename T><br>
-struct AssertTypeEq<T, T> {<br>
- typedef bool type;<br>
-};<br>
-<br>
// A unique type used as the default value for the arguments of class<br>
// template Types. This allows us to simulate variadic templates<br>
// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't<br>
@@ -3312,8 +3299,8 @@ struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,<br>
};<br>
<br>
// The TypeList template makes it possible to use either a single type<br>
-// or a Types<...> list in TYPED_TEST_CASE() and<br>
-// INSTANTIATE_TYPED_TEST_CASE_P().<br>
+// or a Types<...> list in TYPED_TEST_SUITE() and<br>
+// INSTANTIATE_TYPED_TEST_SUITE_P().<br>
<br>
template <typename T><br>
struct TypeList {<br>
<br>
diff --git a/llvm/utils/unittest/googletest/src/gtest-all.cc b/llvm/utils/unittest/googletest/src/gtest-all.cc<br>
index b217a18006b0c..ad292905cf381 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-all.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-all.cc<br>
@@ -41,6 +41,7 @@<br>
#include "src/gtest.cc"<br>
#include "src/gtest-death-test.cc"<br>
#include "src/gtest-filepath.cc"<br>
+#include "src/gtest-matchers.cc"<br>
#include "src/gtest-port.cc"<br>
#include "src/gtest-printers.cc"<br>
#include "src/gtest-test-part.cc"<br>
<br>
diff --git a/llvm/utils/unittest/googletest/src/gtest-death-test.cc b/llvm/utils/unittest/googletest/src/gtest-death-test.cc<br>
index 09083551612e3..da09a1cfc23a5 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-death-test.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-death-test.cc<br>
@@ -31,6 +31,9 @@<br>
// This file implements death tests.<br>
<br>
#include "gtest/gtest-death-test.h"<br>
+<br>
+#include <utility><br>
+<br>
#include "gtest/internal/gtest-port.h"<br>
#include "gtest/internal/custom/gtest.h"<br>
<br>
@@ -62,10 +65,16 @@<br>
# endif // GTEST_OS_QNX<br>
<br>
# if GTEST_OS_FUCHSIA<br>
+# include <lib/fdio/fd.h><br>
# include <lib/fdio/io.h><br>
# include <lib/fdio/spawn.h><br>
+# include <lib/zx/channel.h><br>
+# include <lib/zx/port.h><br>
+# include <lib/zx/process.h><br>
+# include <lib/zx/socket.h><br>
# include <zircon/processargs.h><br>
# include <zircon/syscalls.h><br>
+# include <zircon/syscalls/policy.h><br>
# include <zircon/syscalls/port.h><br>
# endif // GTEST_OS_FUCHSIA<br>
<br>
@@ -113,8 +122,8 @@ GTEST_DEFINE_string_(<br>
"Indicates the file, line number, temporal index of "<br>
"the single death test to run, and a file descriptor to "<br>
"which a success code may be sent, all separated by "<br>
- "the '|' characters. This flag is specified if and only if the current "<br>
- "process is a sub-process launched for running a thread-safe "<br>
+ "the '|' characters. This flag is specified if and only if the "<br>
+ "current process is a sub-process launched for running a thread-safe "<br>
"death test. FOR INTERNAL USE ONLY.");<br>
} // namespace internal<br>
<br>
@@ -266,8 +275,6 @@ static const int kFuchsiaReadPipeFd = 3;<br>
// statement, which is not allowed; THREW means that the test statement<br>
// returned control by throwing an exception. IN_PROGRESS means the test<br>
// has not yet concluded.<br>
-// FIXME: Unify names and possibly values for<br>
-// AbortReason, DeathTestOutcome, and flag characters above.<br>
enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };<br>
<br>
// Routine for aborting the program which is safe to call from an<br>
@@ -281,7 +288,7 @@ static void DeathTestAbort(const std::string& message) {<br>
// the heap for any additional non-minuscule memory requirements.<br>
const InternalRunDeathTestFlag* const flag =<br>
GetUnitTestImpl()->internal_run_death_test_flag();<br>
- if (flag != NULL) {<br>
+ if (flag != nullptr) {<br>
FILE* parent = posix::FDOpen(flag->write_fd(), "w");<br>
fputc(kDeathTestInternalError, parent);<br>
fprintf(parent, "%s", message.c_str());<br>
@@ -361,7 +368,7 @@ static void FailFromInternalError(int fd) {<br>
// for the current test.<br>
DeathTest::DeathTest() {<br>
TestInfo* const info = GetUnitTestImpl()->current_test_info();<br>
- if (info == NULL) {<br>
+ if (info == nullptr) {<br>
DeathTestAbort("Cannot run a death test outside of a TEST or "<br>
"TEST_F construct");<br>
}<br>
@@ -369,10 +376,11 @@ DeathTest::DeathTest() {<br>
<br>
// Creates and returns a death test by dispatching to the current<br>
// death test factory.<br>
-bool DeathTest::Create(const char* statement, const RE* regex,<br>
- const char* file, int line, DeathTest** test) {<br>
+bool DeathTest::Create(const char* statement,<br>
+ Matcher<const std::string&> matcher, const char* file,<br>
+ int line, DeathTest** test) {<br>
return GetUnitTestImpl()->death_test_factory()->Create(<br>
- statement, regex, file, line, test);<br>
+ statement, std::move(matcher), file, line, test);<br>
}<br>
<br>
const char* DeathTest::LastMessage() {<br>
@@ -388,9 +396,9 @@ std::string DeathTest::last_death_test_message_;<br>
// Provides cross platform implementation for some death functionality.<br>
class DeathTestImpl : public DeathTest {<br>
protected:<br>
- DeathTestImpl(const char* a_statement, const RE* a_regex)<br>
+ DeathTestImpl(const char* a_statement, Matcher<const std::string&> matcher)<br>
: statement_(a_statement),<br>
- regex_(a_regex),<br>
+ matcher_(std::move(matcher)),<br>
spawned_(false),<br>
status_(-1),<br>
outcome_(IN_PROGRESS),<br>
@@ -398,13 +406,12 @@ class DeathTestImpl : public DeathTest {<br>
write_fd_(-1) {}<br>
<br>
// read_fd_ is expected to be closed and cleared by a derived class.<br>
- ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }<br>
+ ~DeathTestImpl() override { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }<br>
<br>
- void Abort(AbortReason reason);<br>
- virtual bool Passed(bool status_ok);<br>
+ void Abort(AbortReason reason) override;<br>
+ bool Passed(bool status_ok) override;<br>
<br>
const char* statement() const { return statement_; }<br>
- const RE* regex() const { return regex_; }<br>
bool spawned() const { return spawned_; }<br>
void set_spawned(bool is_spawned) { spawned_ = is_spawned; }<br>
int status() const { return status_; }<br>
@@ -422,13 +429,15 @@ class DeathTestImpl : public DeathTest {<br>
// case of unexpected codes.<br>
void ReadAndInterpretStatusByte();<br>
<br>
+ // Returns stderr output from the child process.<br>
+ virtual std::string GetErrorLogs();<br>
+<br>
private:<br>
// The textual content of the code this object is testing. This class<br>
// doesn't own this string and should not attempt to delete it.<br>
const char* const statement_;<br>
- // The regular expression which test output must match. DeathTestImpl<br>
- // doesn't own this object and should not attempt to delete it.<br>
- const RE* const regex_;<br>
+ // A matcher that's expected to match the stderr output by the child process.<br>
+ Matcher<const std::string&> matcher_;<br>
// True if the death test child process has been successfully spawned.<br>
bool spawned_;<br>
// The exit status of the child process.<br>
@@ -490,6 +499,10 @@ void DeathTestImpl::ReadAndInterpretStatusByte() {<br>
set_read_fd(-1);<br>
}<br>
<br>
+std::string DeathTestImpl::GetErrorLogs() {<br>
+ return GetCapturedStderr();<br>
+}<br>
+<br>
// Signals that the death test code which should have exited, didn't.<br>
// Should be called only in a death test child process.<br>
// Writes a status byte to the child's status file descriptor, then<br>
@@ -543,22 +556,21 @@ static ::std::string FormatDeathTestOutput(const ::std::string& output) {<br>
// in the format specified by wait(2). On Windows, this is the<br>
// value supplied to the ExitProcess() API or a numeric code<br>
// of the exception that terminated the program.<br>
-// regex: A regular expression object to be applied to<br>
-// the test's captured standard error output; the death test<br>
-// fails if it does not match.<br>
+// matcher_: A matcher that's expected to match the stderr output by the child<br>
+// process.<br>
//<br>
// Argument:<br>
// status_ok: true if exit_status is acceptable in the context of<br>
// this particular death test, which fails if it is false<br>
//<br>
-// Returns true iff all of the above conditions are met. Otherwise, the<br>
-// first failing condition, in the order given above, is the one that is<br>
+// Returns true if and only if all of the above conditions are met. Otherwise,<br>
+// the first failing condition, in the order given above, is the one that is<br>
// reported. Also sets the last death test message string.<br>
bool DeathTestImpl::Passed(bool status_ok) {<br>
if (!spawned())<br>
return false;<br>
<br>
- const std::string error_message = GetCapturedStderr();<br>
+ const std::string error_message = GetErrorLogs();<br>
<br>
bool success = false;<br>
Message buffer;<br>
@@ -579,18 +591,15 @@ bool DeathTestImpl::Passed(bool status_ok) {<br>
break;<br>
case DIED:<br>
if (status_ok) {<br>
-# if GTEST_USES_PCRE<br>
- // PCRE regexes support embedded NULs.<br>
- const bool matched = RE::PartialMatch(error_message, *regex());<br>
-# else<br>
- const bool matched = RE::PartialMatch(error_message.c_str(), *regex());<br>
-# endif // GTEST_USES_PCRE<br>
- if (matched) {<br>
+ if (matcher_.Matches(error_message)) {<br>
success = true;<br>
} else {<br>
+ std::ostringstream stream;<br>
+ matcher_.DescribeTo(&stream);<br>
buffer << " Result: died but not with expected error.\n"<br>
- << " Expected: " << regex()->pattern() << "\n"<br>
- << "Actual msg:\n" << FormatDeathTestOutput(error_message);<br>
+ << " Expected: " << stream.str() << "\n"<br>
+ << "Actual msg:\n"<br>
+ << FormatDeathTestOutput(error_message);<br>
}<br>
} else {<br>
buffer << " Result: died but not with expected exit code:\n"<br>
@@ -639,11 +648,11 @@ bool DeathTestImpl::Passed(bool status_ok) {<br>
//<br>
class WindowsDeathTest : public DeathTestImpl {<br>
public:<br>
- WindowsDeathTest(const char* a_statement,<br>
- const RE* a_regex,<br>
- const char* file,<br>
- int line)<br>
- : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}<br>
+ WindowsDeathTest(const char* a_statement, Matcher<const std::string&> matcher,<br>
+ const char* file, int line)<br>
+ : DeathTestImpl(a_statement, std::move(matcher)),<br>
+ file_(file),<br>
+ line_(line) {}<br>
<br>
// All of these virtual functions are inherited from DeathTest.<br>
virtual int Wait();<br>
@@ -720,7 +729,7 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {<br>
const TestInfo* const info = impl->current_test_info();<br>
const int death_test_index = info->result()->death_test_count();<br>
<br>
- if (flag != NULL) {<br>
+ if (flag != nullptr) {<br>
// ParseInternalRunDeathTestFlag() has performed all the necessary<br>
// processing.<br>
set_write_fd(flag->write_fd());<br>
@@ -729,8 +738,8 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {<br>
<br>
// WindowsDeathTest uses an anonymous pipe to communicate results of<br>
// a death test.<br>
- SECURITY_ATTRIBUTES handles_are_inheritable = {<br>
- sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };<br>
+ SECURITY_ATTRIBUTES handles_are_inheritable = {sizeof(SECURITY_ATTRIBUTES),<br>
+ nullptr, TRUE};<br>
HANDLE read_handle, write_handle;<br>
GTEST_DEATH_TEST_CHECK_(<br>
::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,<br>
@@ -741,13 +750,13 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {<br>
write_handle_.Reset(write_handle);<br>
event_handle_.Reset(::CreateEvent(<br>
&handles_are_inheritable,<br>
- TRUE, // The event will automatically reset to non-signaled state.<br>
- FALSE, // The initial state is non-signalled.<br>
- NULL)); // The even is unnamed.<br>
- GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);<br>
- const std::string filter_flag =<br>
- std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" +<br>
- info->test_case_name() + "." + info->name();<br>
+ TRUE, // The event will automatically reset to non-signaled state.<br>
+ FALSE, // The initial state is non-signalled.<br>
+ nullptr)); // The even is unnamed.<br>
+ GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != nullptr);<br>
+ const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ +<br>
+ kFilterFlag + "=" + info->test_suite_name() +<br>
+ "." + info->name();<br>
const std::string internal_flag =<br>
std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +<br>
"=" + file_ + "|" + StreamableToString(line_) + "|" +<br>
@@ -760,10 +769,9 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {<br>
"|" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));<br>
<br>
char executable_path[_MAX_PATH + 1]; // NOLINT<br>
- GTEST_DEATH_TEST_CHECK_(<br>
- _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,<br>
- executable_path,<br>
- _MAX_PATH));<br>
+ GTEST_DEATH_TEST_CHECK_(_MAX_PATH + 1 != ::GetModuleFileNameA(nullptr,<br>
+ executable_path,<br>
+ _MAX_PATH));<br>
<br>
std::string command_line =<br>
std::string(::GetCommandLineA()) + " " + filter_flag + " \"" +<br>
@@ -784,17 +792,16 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {<br>
startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);<br>
<br>
PROCESS_INFORMATION process_info;<br>
- GTEST_DEATH_TEST_CHECK_(::CreateProcessA(<br>
- executable_path,<br>
- const_cast<char*>(command_line.c_str()),<br>
- NULL, // Retuned process handle is not inheritable.<br>
- NULL, // Retuned thread handle is not inheritable.<br>
- TRUE, // Child inherits all inheritable handles (for write_handle_).<br>
- 0x0, // Default creation flags.<br>
- NULL, // Inherit the parent's environment.<br>
- UnitTest::GetInstance()->original_working_dir(),<br>
- &startup_info,<br>
- &process_info) != FALSE);<br>
+ GTEST_DEATH_TEST_CHECK_(<br>
+ ::CreateProcessA(<br>
+ executable_path, const_cast<char*>(command_line.c_str()),<br>
+ nullptr, // Retuned process handle is not inheritable.<br>
+ nullptr, // Retuned thread handle is not inheritable.<br>
+ TRUE, // Child inherits all inheritable handles (for write_handle_).<br>
+ 0x0, // Default creation flags.<br>
+ nullptr, // Inherit the parent's environment.<br>
+ UnitTest::GetInstance()->original_working_dir(), &startup_info,<br>
+ &process_info) != FALSE);<br>
child_handle_.Reset(process_info.hProcess);<br>
::CloseHandle(process_info.hThread);<br>
set_spawned(true);<br>
@@ -805,38 +812,34 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {<br>
<br>
class FuchsiaDeathTest : public DeathTestImpl {<br>
public:<br>
- FuchsiaDeathTest(const char* a_statement,<br>
- const RE* a_regex,<br>
- const char* file,<br>
- int line)<br>
- : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}<br>
- virtual ~FuchsiaDeathTest() {<br>
- zx_status_t status = zx_handle_close(child_process_);<br>
- GTEST_DEATH_TEST_CHECK_(status == ZX_OK);<br>
- status = zx_handle_close(port_);<br>
- GTEST_DEATH_TEST_CHECK_(status == ZX_OK);<br>
- }<br>
+ FuchsiaDeathTest(const char* a_statement, Matcher<const std::string&> matcher,<br>
+ const char* file, int line)<br>
+ : DeathTestImpl(a_statement, std::move(matcher)),<br>
+ file_(file),<br>
+ line_(line) {}<br>
<br>
// All of these virtual functions are inherited from DeathTest.<br>
- virtual int Wait();<br>
- virtual TestRole AssumeRole();<br>
+ int Wait() override;<br>
+ TestRole AssumeRole() override;<br>
+ std::string GetErrorLogs() override;<br>
<br>
private:<br>
// The name of the file in which the death test is located.<br>
const char* const file_;<br>
// The line number on which the death test is located.<br>
const int line_;<br>
+ // The stderr data captured by the child process.<br>
+ std::string captured_stderr_;<br>
<br>
- zx_handle_t child_process_ = ZX_HANDLE_INVALID;<br>
- zx_handle_t port_ = ZX_HANDLE_INVALID;<br>
+ zx::process child_process_;<br>
+ zx::channel exception_channel_;<br>
+ zx::socket stderr_socket_;<br>
};<br>
<br>
// Utility class for accumulating command-line arguments.<br>
class Arguments {<br>
public:<br>
- Arguments() {<br>
- args_.push_back(NULL);<br>
- }<br>
+ Arguments() { args_.push_back(nullptr); }<br>
<br>
~Arguments() {<br>
for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();<br>
@@ -872,51 +875,88 @@ class Arguments {<br>
// status, or 0 if no child process exists. As a side effect, sets the<br>
// outcome data member.<br>
int FuchsiaDeathTest::Wait() {<br>
+ const int kProcessKey = 0;<br>
+ const int kSocketKey = 1;<br>
+ const int kExceptionKey = 2;<br>
+<br>
if (!spawned())<br>
return 0;<br>
<br>
- // Register to wait for the child process to terminate.<br>
+ // Create a port to wait for socket/task/exception events.<br>
zx_status_t status_zx;<br>
- status_zx = zx_object_wait_async(child_process_,<br>
- port_,<br>
- 0 /* key */,<br>
- ZX_PROCESS_TERMINATED,<br>
- ZX_WAIT_ASYNC_ONCE);<br>
+ zx::port port;<br>
+ status_zx = zx::port::create(0, &port);<br>
GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
<br>
- // Wait for it to terminate, or an exception to be received.<br>
- zx_port_packet_t packet;<br>
- status_zx = zx_port_wait(port_, ZX_TIME_INFINITE, &packet);<br>
+ // Register to wait for the child process to terminate.<br>
+ status_zx = child_process_.wait_async(<br>
+ port, kProcessKey, ZX_PROCESS_TERMINATED, ZX_WAIT_ASYNC_ONCE);<br>
GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
<br>
- if (ZX_PKT_IS_EXCEPTION(packet.type)) {<br>
- // Process encountered an exception. Kill it directly rather than letting<br>
- // other handlers process the event.<br>
- status_zx = zx_task_kill(child_process_);<br>
- GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
+ // Register to wait for the socket to be readable or closed.<br>
+ status_zx = stderr_socket_.wait_async(<br>
+ port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED,<br>
+ ZX_WAIT_ASYNC_ONCE);<br>
+ GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
<br>
- // Now wait for |child_process_| to terminate.<br>
- zx_signals_t signals = 0;<br>
- status_zx = zx_object_wait_one(<br>
- child_process_, ZX_PROCESS_TERMINATED, ZX_TIME_INFINITE, &signals);<br>
+ // Register to wait for an exception.<br>
+ status_zx = exception_channel_.wait_async(<br>
+ port, kExceptionKey, ZX_CHANNEL_READABLE, ZX_WAIT_ASYNC_ONCE);<br>
+ GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
+<br>
+ bool process_terminated = false;<br>
+ bool socket_closed = false;<br>
+ do {<br>
+ zx_port_packet_t packet = {};<br>
+ status_zx = port.wait(zx::time::infinite(), &packet);<br>
GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
- GTEST_DEATH_TEST_CHECK_(signals & ZX_PROCESS_TERMINATED);<br>
- } else {<br>
- // Process terminated.<br>
- GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type));<br>
- GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_PROCESS_TERMINATED);<br>
- }<br>
+<br>
+ if (packet.key == kExceptionKey) {<br>
+ // Process encountered an exception. Kill it directly rather than<br>
+ // letting other handlers process the event. We will get a kProcessKey<br>
+ // event when the process actually terminates.<br>
+ status_zx = child_process_.kill();<br>
+ GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
+ } else if (packet.key == kProcessKey) {<br>
+ // Process terminated.<br>
+ GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type));<br>
+ GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_PROCESS_TERMINATED);<br>
+ process_terminated = true;<br>
+ } else if (packet.key == kSocketKey) {<br>
+ GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type));<br>
+ if (packet.signal.observed & ZX_SOCKET_READABLE) {<br>
+ // Read data from the socket.<br>
+ constexpr size_t kBufferSize = 1024;<br>
+ do {<br>
+ size_t old_length = captured_stderr_.length();<br>
+ size_t bytes_read = 0;<br>
+ captured_stderr_.resize(old_length + kBufferSize);<br>
+ status_zx = stderr_socket_.read(<br>
+ 0, &captured_stderr_.front() + old_length, kBufferSize,<br>
+ &bytes_read);<br>
+ captured_stderr_.resize(old_length + bytes_read);<br>
+ } while (status_zx == ZX_OK);<br>
+ if (status_zx == ZX_ERR_PEER_CLOSED) {<br>
+ socket_closed = true;<br>
+ } else {<br>
+ GTEST_DEATH_TEST_CHECK_(status_zx == ZX_ERR_SHOULD_WAIT);<br>
+ status_zx = stderr_socket_.wait_async(<br>
+ port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED,<br>
+ ZX_WAIT_ASYNC_ONCE);<br>
+ GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
+ }<br>
+ } else {<br>
+ GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_SOCKET_PEER_CLOSED);<br>
+ socket_closed = true;<br>
+ }<br>
+ }<br>
+ } while (!process_terminated && !socket_closed);<br>
<br>
ReadAndInterpretStatusByte();<br>
<br>
zx_info_process_t buffer;<br>
- status_zx = zx_object_get_info(<br>
- child_process_,<br>
- ZX_INFO_PROCESS,<br>
- &buffer,<br>
- sizeof(buffer),<br>
- nullptr,<br>
- nullptr);<br>
+ status_zx = child_process_.get_info(<br>
+ ZX_INFO_PROCESS, &buffer, sizeof(buffer), nullptr, nullptr);<br>
GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
<br>
GTEST_DEATH_TEST_CHECK_(buffer.exited);<br>
@@ -936,21 +976,20 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {<br>
const TestInfo* const info = impl->current_test_info();<br>
const int death_test_index = info->result()->death_test_count();<br>
<br>
- if (flag != NULL) {<br>
+ if (flag != nullptr) {<br>
// ParseInternalRunDeathTestFlag() has performed all the necessary<br>
// processing.<br>
set_write_fd(kFuchsiaReadPipeFd);<br>
return EXECUTE_TEST;<br>
}<br>
<br>
- CaptureStderr();<br>
// Flush the log buffers since the log streams are shared with the child.<br>
FlushInfoLog();<br>
<br>
// Build the child process command line.<br>
- const std::string filter_flag =<br>
- std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="<br>
- + info->test_case_name() + "." + info->name();<br>
+ const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ +<br>
+ kFilterFlag + "=" + info->test_suite_name() +<br>
+ "." + info->name();<br>
const std::string internal_flag =<br>
std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="<br>
+ file_ + "|"<br>
@@ -964,35 +1003,68 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {<br>
// Build the pipe for communication with the child.<br>
zx_status_t status;<br>
zx_handle_t child_pipe_handle;<br>
- uint32_t type;<br>
- status = fdio_pipe_half(&child_pipe_handle, &type);<br>
- GTEST_DEATH_TEST_CHECK_(status >= 0);<br>
- set_read_fd(status);<br>
+ int child_pipe_fd;<br>
+ status = fdio_pipe_half(&child_pipe_fd, &child_pipe_handle);<br>
+ GTEST_DEATH_TEST_CHECK_(status == ZX_OK);<br>
+ set_read_fd(child_pipe_fd);<br>
<br>
// Set the pipe handle for the child.<br>
- fdio_spawn_action_t add_handle_action = {};<br>
- add_handle_action.action = FDIO_SPAWN_ACTION_ADD_HANDLE;<br>
- <a href="http://add_handle_action.h.id" rel="noreferrer" target="_blank">add_handle_action.h.id</a> = PA_HND(type, kFuchsiaReadPipeFd);<br>
- add_handle_action.h.handle = child_pipe_handle;<br>
+ fdio_spawn_action_t spawn_actions[2] = {};<br>
+ fdio_spawn_action_t* add_handle_action = &spawn_actions[0];<br>
+ add_handle_action->action = FDIO_SPAWN_ACTION_ADD_HANDLE;<br>
+ add_handle_action-><a href="http://h.id" rel="noreferrer" target="_blank">h.id</a> = PA_HND(PA_FD, kFuchsiaReadPipeFd);<br>
+ add_handle_action->h.handle = child_pipe_handle;<br>
+<br>
+ // Create a socket pair will be used to receive the child process' stderr.<br>
+ zx::socket stderr_producer_socket;<br>
+ status =<br>
+ zx::socket::create(0, &stderr_producer_socket, &stderr_socket_);<br>
+ GTEST_DEATH_TEST_CHECK_(status >= 0);<br>
+ int stderr_producer_fd = -1;<br>
+ status =<br>
+ fdio_fd_create(stderr_producer_socket.release(), &stderr_producer_fd);<br>
+ GTEST_DEATH_TEST_CHECK_(status >= 0);<br>
<br>
- // Spawn the child process.<br>
- status = fdio_spawn_etc(ZX_HANDLE_INVALID, FDIO_SPAWN_CLONE_ALL,<br>
- args.Argv()[0], args.Argv(), nullptr, 1,<br>
- &add_handle_action, &child_process_, nullptr);<br>
+ // Make the stderr socket nonblocking.<br>
+ GTEST_DEATH_TEST_CHECK_(fcntl(stderr_producer_fd, F_SETFL, 0) == 0);<br>
+<br>
+ fdio_spawn_action_t* add_stderr_action = &spawn_actions[1];<br>
+ add_stderr_action->action = FDIO_SPAWN_ACTION_CLONE_FD;<br>
+ add_stderr_action->fd.local_fd = stderr_producer_fd;<br>
+ add_stderr_action->fd.target_fd = STDERR_FILENO;<br>
+<br>
+ // Create a child job.<br>
+ zx_handle_t child_job = ZX_HANDLE_INVALID;<br>
+ status = zx_job_create(zx_job_default(), 0, & child_job);<br>
+ GTEST_DEATH_TEST_CHECK_(status == ZX_OK);<br>
+ zx_policy_basic_t policy;<br>
+ policy.condition = ZX_POL_NEW_ANY;<br>
+ policy.policy = ZX_POL_ACTION_ALLOW;<br>
+ status = zx_job_set_policy(<br>
+ child_job, ZX_JOB_POL_RELATIVE, ZX_JOB_POL_BASIC, &policy, 1);<br>
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);<br>
<br>
- // Create an exception port and attach it to the |child_process_|, to allow<br>
+ // Create an exception channel attached to the |child_job|, to allow<br>
// us to suppress the system default exception handler from firing.<br>
- status = zx_port_create(0, &port_);<br>
+ status =<br>
+ zx_task_create_exception_channel(<br>
+ child_job, 0, exception_channel_.reset_and_get_address());<br>
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);<br>
- status = zx_task_bind_exception_port(<br>
- child_process_, port_, 0 /* key */, 0 /*options */);<br>
+<br>
+ // Spawn the child process.<br>
+ status = fdio_spawn_etc(<br>
+ child_job, FDIO_SPAWN_CLONE_ALL, args.Argv()[0], args.Argv(), nullptr,<br>
+ 2, spawn_actions, child_process_.reset_and_get_address(), nullptr);<br>
GTEST_DEATH_TEST_CHECK_(status == ZX_OK);<br>
<br>
set_spawned(true);<br>
return OVERSEE_TEST;<br>
}<br>
<br>
+std::string FuchsiaDeathTest::GetErrorLogs() {<br>
+ return captured_stderr_;<br>
+}<br>
+<br>
#else // We are neither on Windows, nor on Fuchsia.<br>
<br>
// ForkingDeathTest provides implementations for most of the abstract<br>
@@ -1000,10 +1072,10 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {<br>
// left undefined.<br>
class ForkingDeathTest : public DeathTestImpl {<br>
public:<br>
- ForkingDeathTest(const char* statement, const RE* regex);<br>
+ ForkingDeathTest(const char* statement, Matcher<const std::string&> matcher);<br>
<br>
// All of these virtual functions are inherited from DeathTest.<br>
- virtual int Wait();<br>
+ int Wait() override;<br>
<br>
protected:<br>
void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }<br>
@@ -1014,9 +1086,9 @@ class ForkingDeathTest : public DeathTestImpl {<br>
};<br>
<br>
// Constructs a ForkingDeathTest.<br>
-ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)<br>
- : DeathTestImpl(a_statement, a_regex),<br>
- child_pid_(-1) {}<br>
+ForkingDeathTest::ForkingDeathTest(const char* a_statement,<br>
+ Matcher<const std::string&> matcher)<br>
+ : DeathTestImpl(a_statement, std::move(matcher)), child_pid_(-1) {}<br>
<br>
// Waits for the child in a death test to exit, returning its exit<br>
// status, or 0 if no child process exists. As a side effect, sets the<br>
@@ -1037,9 +1109,9 @@ int ForkingDeathTest::Wait() {<br>
// in the child process.<br>
class NoExecDeathTest : public ForkingDeathTest {<br>
public:<br>
- NoExecDeathTest(const char* a_statement, const RE* a_regex) :<br>
- ForkingDeathTest(a_statement, a_regex) { }<br>
- virtual TestRole AssumeRole();<br>
+ NoExecDeathTest(const char* a_statement, Matcher<const std::string&> matcher)<br>
+ : ForkingDeathTest(a_statement, std::move(matcher)) {}<br>
+ TestRole AssumeRole() override;<br>
};<br>
<br>
// The AssumeRole process for a fork-and-run death test. It implements a<br>
@@ -1092,10 +1164,13 @@ DeathTest::TestRole NoExecDeathTest::AssumeRole() {<br>
// only this specific death test to be run.<br>
class ExecDeathTest : public ForkingDeathTest {<br>
public:<br>
- ExecDeathTest(const char* a_statement, const RE* a_regex,<br>
- const char* file, int line) :<br>
- ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }<br>
- virtual TestRole AssumeRole();<br>
+ ExecDeathTest(const char* a_statement, Matcher<const std::string&> matcher,<br>
+ const char* file, int line)<br>
+ : ForkingDeathTest(a_statement, std::move(matcher)),<br>
+ file_(file),<br>
+ line_(line) {}<br>
+ TestRole AssumeRole() override;<br>
+<br>
private:<br>
static ::std::vector<std::string> GetArgvsForDeathTestChildProcess() {<br>
::std::vector<std::string> args = GetInjectableArgvs();<br>
@@ -1115,9 +1190,7 @@ class ExecDeathTest : public ForkingDeathTest {<br>
// Utility class for accumulating command-line arguments.<br>
class Arguments {<br>
public:<br>
- Arguments() {<br>
- args_.push_back(NULL);<br>
- }<br>
+ Arguments() { args_.push_back(nullptr); }<br>
<br>
~Arguments() {<br>
for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();<br>
@@ -1211,6 +1284,9 @@ static int ExecDeathTestChildMain(void* child_arg) {<br>
// correct answer.<br>
static void StackLowerThanAddress(const void* ptr,<br>
bool* result) GTEST_NO_INLINE_;<br>
+// HWAddressSanitizer add a random tag to the MSB of the local variable address,<br>
+// making comparison result unpredictable.<br>
+GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_<br>
static void StackLowerThanAddress(const void* ptr, bool* result) {<br>
int dummy;<br>
*result = (&dummy < ptr);<br>
@@ -1218,6 +1294,7 @@ static void StackLowerThanAddress(const void* ptr, bool* result) {<br>
<br>
// Make sure AddressSanitizer does not tamper with the stack here.<br>
GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_<br>
+GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_<br>
static bool StackGrowsDown() {<br>
int dummy;<br>
bool result;<br>
@@ -1262,7 +1339,8 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {<br>
fd_flags | FD_CLOEXEC));<br>
struct inheritance inherit = {0};<br>
// spawn is a system call.<br>
- child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());<br>
+ child_pid =<br>
+ spawn(args.argv[0], 0, nullptr, &inherit, args.argv, GetEnviron());<br>
// Restores the current working directory.<br>
GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);<br>
GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));<br>
@@ -1286,9 +1364,9 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {<br>
<br>
if (!use_fork) {<br>
static const bool stack_grows_down = StackGrowsDown();<br>
- const size_t stack_size = getpagesize();<br>
+ const auto stack_size = static_cast<size_t>(getpagesize());<br>
// MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.<br>
- void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,<br>
+ void* const stack = mmap(nullptr, stack_size, PROT_READ | PROT_WRITE,<br>
MAP_ANON | MAP_PRIVATE, -1, 0);<br>
GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);<br>
<br>
@@ -1302,8 +1380,9 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {<br>
void* const stack_top =<br>
static_cast<char*>(stack) +<br>
(stack_grows_down ? stack_size - kMaxStackAlignment : 0);<br>
- GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&<br>
- reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);<br>
+ GTEST_DEATH_TEST_CHECK_(<br>
+ static_cast<size_t>(stack_size) > kMaxStackAlignment &&<br>
+ reinterpret_cast<uintptr_t>(stack_top) % kMaxStackAlignment == 0);<br>
<br>
child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);<br>
<br>
@@ -1320,7 +1399,7 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {<br>
# endif // GTEST_OS_QNX<br>
# if GTEST_OS_LINUX<br>
GTEST_DEATH_TEST_CHECK_SYSCALL_(<br>
- sigaction(SIGPROF, &saved_sigprof_action, NULL));<br>
+ sigaction(SIGPROF, &saved_sigprof_action, nullptr));<br>
# endif // GTEST_OS_LINUX<br>
<br>
GTEST_DEATH_TEST_CHECK_(child_pid != -1);<br>
@@ -1338,7 +1417,7 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {<br>
const TestInfo* const info = impl->current_test_info();<br>
const int death_test_index = info->result()->death_test_count();<br>
<br>
- if (flag != NULL) {<br>
+ if (flag != nullptr) {<br>
set_write_fd(flag->write_fd());<br>
return EXECUTE_TEST;<br>
}<br>
@@ -1349,9 +1428,9 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {<br>
// it be closed when the child process does an exec:<br>
GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);<br>
<br>
- const std::string filter_flag =<br>
- std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="<br>
- + info->test_case_name() + "." + info->name();<br>
+ const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ +<br>
+ kFilterFlag + "=" + info->test_suite_name() +<br>
+ "." + info->name();<br>
const std::string internal_flag =<br>
std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="<br>
+ file_ + "|" + StreamableToString(line_) + "|"<br>
@@ -1384,7 +1463,8 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {<br>
// by the "test" argument to its address. If the test should be<br>
// skipped, sets that pointer to NULL. Returns true, unless the<br>
// flag is set to an invalid value.<br>
-bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,<br>
+bool DefaultDeathTestFactory::Create(const char* statement,<br>
+ Matcher<const std::string&> matcher,<br>
const char* file, int line,<br>
DeathTest** test) {<br>
UnitTestImpl* const impl = GetUnitTestImpl();<br>
@@ -1393,7 +1473,7 @@ bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,<br>
const int death_test_index = impl->current_test_info()<br>
->increment_death_test_count();<br>
<br>
- if (flag != NULL) {<br>
+ if (flag != nullptr) {<br>
if (death_test_index > flag->index()) {<br>
DeathTest::set_last_death_test_message(<br>
"Death test count (" + StreamableToString(death_test_index)<br>
@@ -1404,7 +1484,7 @@ bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,<br>
<br>
if (!(flag->file() == file && flag->line() == line &&<br>
flag->index() == death_test_index)) {<br>
- *test = NULL;<br>
+ *test = nullptr;<br>
return true;<br>
}<br>
}<br>
@@ -1413,22 +1493,22 @@ bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,<br>
<br>
if (GTEST_FLAG(death_test_style) == "threadsafe" ||<br>
GTEST_FLAG(death_test_style) == "fast") {<br>
- *test = new WindowsDeathTest(statement, regex, file, line);<br>
+ *test = new WindowsDeathTest(statement, std::move(matcher), file, line);<br>
}<br>
<br>
# elif GTEST_OS_FUCHSIA<br>
<br>
if (GTEST_FLAG(death_test_style) == "threadsafe" ||<br>
GTEST_FLAG(death_test_style) == "fast") {<br>
- *test = new FuchsiaDeathTest(statement, regex, file, line);<br>
+ *test = new FuchsiaDeathTest(statement, std::move(matcher), file, line);<br>
}<br>
<br>
# else<br>
<br>
if (GTEST_FLAG(death_test_style) == "threadsafe") {<br>
- *test = new ExecDeathTest(statement, regex, file, line);<br>
+ *test = new ExecDeathTest(statement, std::move(matcher), file, line);<br>
} else if (GTEST_FLAG(death_test_style) == "fast") {<br>
- *test = new NoExecDeathTest(statement, regex);<br>
+ *test = new NoExecDeathTest(statement, std::move(matcher));<br>
}<br>
<br>
# endif // GTEST_OS_WINDOWS<br>
@@ -1458,8 +1538,6 @@ static int GetStatusFileDescriptor(unsigned int parent_process_id,<br>
StreamableToString(parent_process_id));<br>
}<br>
<br>
- // FIXME: Replace the following check with a<br>
- // compile-time assertion when available.<br>
GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));<br>
<br>
const HANDLE write_handle =<br>
@@ -1515,7 +1593,7 @@ static int GetStatusFileDescriptor(unsigned int parent_process_id,<br>
// initialized from the GTEST_FLAG(internal_run_death_test) flag if<br>
// the flag is specified; otherwise returns NULL.<br>
InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {<br>
- if (GTEST_FLAG(internal_run_death_test) == "") return NULL;<br>
+ if (GTEST_FLAG(internal_run_death_test) == "") return nullptr;<br>
<br>
// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we<br>
// can use it here.<br>
<br>
diff --git a/llvm/utils/unittest/googletest/src/gtest-filepath.cc b/llvm/utils/unittest/googletest/src/gtest-filepath.cc<br>
index a7e65c082a75f..bd7b99ff03e49 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-filepath.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-filepath.cc<br>
@@ -38,9 +38,6 @@<br>
#elif GTEST_OS_WINDOWS<br>
# include <direct.h><br>
# include <io.h><br>
-#elif GTEST_OS_SYMBIAN<br>
-// Symbian OpenC has PATH_MAX in sys/syslimits.h<br>
-# include <sys/syslimits.h><br>
#else<br>
# include <limits.h><br>
# include <climits> // Some Linux distributions define PATH_MAX here.<br>
@@ -95,13 +92,14 @@ static bool IsPathSeparator(char c) {<br>
<br>
// Returns the current working directory, or "" if unsuccessful.<br>
FilePath FilePath::GetCurrentDir() {<br>
-#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT<br>
- // Windows CE doesn't have a current directory, so we just return<br>
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \<br>
+ GTEST_OS_WINDOWS_RT || ARDUINO || defined(ESP_PLATFORM)<br>
+ // These platforms do not have a current directory, so we just return<br>
// something reasonable.<br>
return FilePath(kCurrentDirectoryString);<br>
#elif GTEST_OS_WINDOWS<br>
char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };<br>
- return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);<br>
+ return FilePath(_getcwd(cwd, sizeof(cwd)) == nullptr ? "" : cwd);<br>
#else<br>
char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };<br>
char* result = getcwd(cwd, sizeof(cwd));<br>
@@ -109,9 +107,9 @@ FilePath FilePath::GetCurrentDir() {<br>
// getcwd will likely fail in NaCl due to the sandbox, so return something<br>
// reasonable. The user may have provided a shim implementation for getcwd,<br>
// however, so fallback only when failure is detected.<br>
- return FilePath(result == NULL ? kCurrentDirectoryString : cwd);<br>
+ return FilePath(result == nullptr ? kCurrentDirectoryString : cwd);<br>
# endif // GTEST_OS_NACL<br>
- return FilePath(result == NULL ? "" : cwd);<br>
+ return FilePath(result == nullptr ? "" : cwd);<br>
#endif // GTEST_OS_WINDOWS_MOBILE<br>
}<br>
<br>
@@ -136,8 +134,8 @@ const char* FilePath::FindLastPathSeparator() const {<br>
#if GTEST_HAS_ALT_PATH_SEP_<br>
const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);<br>
// Comparing two pointers of which only one is NULL is undefined.<br>
- if (last_alt_sep != NULL &&<br>
- (last_sep == NULL || last_alt_sep > last_sep)) {<br>
+ if (last_alt_sep != nullptr &&<br>
+ (last_sep == nullptr || last_alt_sep > last_sep)) {<br>
return last_alt_sep;<br>
}<br>
#endif<br>
@@ -165,7 +163,7 @@ FilePath FilePath::RemoveFileName() const {<br>
const char* const last_sep = FindLastPathSeparator();<br>
std::string dir;<br>
if (last_sep) {<br>
- dir = std::string(c_str(), last_sep + 1 - c_str());<br>
+ dir = std::string(c_str(), static_cast<size_t>(last_sep + 1 - c_str()));<br>
} else {<br>
dir = kCurrentDirectoryString;<br>
}<br>
@@ -250,9 +248,6 @@ bool FilePath::DirectoryExists() const {<br>
// root directory per disk drive.)<br>
bool FilePath::IsRootDirectory() const {<br>
#if GTEST_OS_WINDOWS<br>
- // FIXME: on Windows a network share like<br>
- // \\server\share can be a root directory, although it cannot be the<br>
- // current directory. Handle this properly.<br>
return pathname_.length() == 3 && IsAbsolutePath();<br>
#else<br>
return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);<br>
@@ -324,7 +319,7 @@ bool FilePath::CreateFolder() const {<br>
#if GTEST_OS_WINDOWS_MOBILE<br>
FilePath removed_sep(this->RemoveTrailingPathSeparator());<br>
LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());<br>
- int result = CreateDirectory(unicode, NULL) ? 0 : -1;<br>
+ int result = CreateDirectory(unicode, nullptr) ? 0 : -1;<br>
delete [] unicode;<br>
#elif GTEST_OS_WINDOWS<br>
int result = _mkdir(pathname_.c_str());<br>
@@ -350,9 +345,8 @@ FilePath FilePath::RemoveTrailingPathSeparator() const {<br>
// Removes any redundant separators that might be in the pathname.<br>
// For example, "bar///foo" becomes "bar/foo". Does not eliminate other<br>
// redundancies that might be in a pathname involving "." or "..".<br>
-// FIXME: handle Windows network shares (e.g. \\server\share).<br>
void FilePath::Normalize() {<br>
- if (pathname_.c_str() == NULL) {<br>
+ if (pathname_.c_str() == nullptr) {<br>
pathname_ = "";<br>
return;<br>
}<br>
<br>
diff --git a/llvm/utils/unittest/googletest/src/gtest-internal-inl.h b/llvm/utils/unittest/googletest/src/gtest-internal-inl.h<br>
index 479004149b48c..8ed70daab0943 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-internal-inl.h<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-internal-inl.h<br>
@@ -42,6 +42,7 @@<br>
#include <string.h> // For memmove.<br>
<br>
#include <algorithm><br>
+#include <memory><br>
#include <string><br>
#include <vector><br>
<br>
@@ -98,14 +99,14 @@ const char kFlagfileFlag[] = "flagfile";<br>
// A valid random seed must be in [1, kMaxRandomSeed].<br>
const int kMaxRandomSeed = 99999;<br>
<br>
-// g_help_flag is true iff the --help flag or an equivalent form is<br>
-// specified on the command line.<br>
+// g_help_flag is true if and only if the --help flag or an equivalent form<br>
+// is specified on the command line.<br>
GTEST_API_ extern bool g_help_flag;<br>
<br>
// Returns the current time in milliseconds.<br>
GTEST_API_ TimeInMillis GetTimeInMillis();<br>
<br>
-// Returns true iff Google Test should use colors in the output.<br>
+// Returns true if and only if Google Test should use colors in the output.<br>
GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);<br>
<br>
// Formats the given time in milliseconds as seconds.<br>
@@ -230,7 +231,7 @@ GTEST_API_ std::string CodePointToUtf8(UInt32 code_point);<br>
<br>
// Converts a wide string to a narrow string in UTF-8 encoding.<br>
// The wide string is assumed to have the following encoding:<br>
-// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)<br>
+// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin)<br>
// UTF-32 if sizeof(wchar_t) == 4 (on Linux)<br>
// Parameter str points to a null-terminated wide string.<br>
// Parameter num_chars may additionally limit the number<br>
@@ -265,8 +266,8 @@ GTEST_API_ bool ShouldShard(const char* total_shards_str,<br>
GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);<br>
<br>
// Given the total number of shards, the shard index, and the test id,<br>
-// returns true iff the test should be run on this shard. The test id is<br>
-// some arbitrary but unique non-negative integer assigned to each test<br>
+// returns true if and only if the test should be run on this shard. The test id<br>
+// is some arbitrary but unique non-negative integer assigned to each test<br>
// method. Assumes that 0 <= shard_index < total_shards.<br>
GTEST_API_ bool ShouldRunTestOnShard(<br>
int total_shards, int shard_index, int test_id);<br>
@@ -297,7 +298,8 @@ void ForEach(const Container& c, Functor functor) {<br>
// in range [0, v.size()).<br>
template <typename E><br>
inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {<br>
- return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];<br>
+ return (i < 0 || i >= static_cast<int>(v.size())) ? default_value<br>
+ : v[static_cast<size_t>(i)];<br>
}<br>
<br>
// Performs an in-place shuffle of a range of the vector's elements.<br>
@@ -319,8 +321,11 @@ void ShuffleRange(internal::Random* random, int begin, int end,<br>
// <a href="http://en.wikipedia.org/wiki/Fisher-Yates_shuffle" rel="noreferrer" target="_blank">http://en.wikipedia.org/wiki/Fisher-Yates_shuffle</a><br>
for (int range_width = end - begin; range_width >= 2; range_width--) {<br>
const int last_in_range = begin + range_width - 1;<br>
- const int selected = begin + random->Generate(range_width);<br>
- std::swap((*v)[selected], (*v)[last_in_range]);<br>
+ const int selected =<br>
+ begin +<br>
+ static_cast<int>(random->Generate(static_cast<UInt32>(range_width)));<br>
+ std::swap((*v)[static_cast<size_t>(selected)],<br>
+ (*v)[static_cast<size_t>(last_in_range)]);<br>
}<br>
}<br>
<br>
@@ -347,7 +352,7 @@ class TestPropertyKeyIs {<br>
// TestPropertyKeyIs has NO default constructor.<br>
explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}<br>
<br>
- // Returns true iff the test name of test property matches on key_.<br>
+ // Returns true if and only if the test name of test property matches on key_.<br>
bool operator()(const TestProperty& test_property) const {<br>
return test_property.key() == key_;<br>
}<br>
@@ -380,17 +385,17 @@ class GTEST_API_ UnitTestOptions {<br>
<br>
// Functions for processing the gtest_filter flag.<br>
<br>
- // Returns true iff the wildcard pattern matches the string. The<br>
- // first ':' or '\0' character in pattern marks the end of it.<br>
+ // Returns true if and only if the wildcard pattern matches the string.<br>
+ // The first ':' or '\0' character in pattern marks the end of it.<br>
//<br>
// This recursive algorithm isn't very efficient, but is clear and<br>
// works well enough for matching test names, which are short.<br>
static bool PatternMatchesString(const char *pattern, const char *str);<br>
<br>
- // Returns true iff the user-specified filter matches the test case<br>
- // name and the test name.<br>
- static bool FilterMatchesTest(const std::string &test_case_name,<br>
- const std::string &test_name);<br>
+ // Returns true if and only if the user-specified filter matches the test<br>
+ // suite name and the test name.<br>
+ static bool FilterMatchesTest(const std::string& test_suite_name,<br>
+ const std::string& test_name);<br>
<br>
#if GTEST_OS_WINDOWS<br>
// Function for supporting the gtest_catch_exception flag.<br>
@@ -442,8 +447,8 @@ class OsStackTraceGetter : public OsStackTraceGetterInterface {<br>
public:<br>
OsStackTraceGetter() {}<br>
<br>
- virtual std::string CurrentStackTrace(int max_depth, int skip_count);<br>
- virtual void UponLeavingGTest();<br>
+ std::string CurrentStackTrace(int max_depth, int skip_count) override;<br>
+ void UponLeavingGTest() override;<br>
<br>
private:<br>
#if GTEST_HAS_ABSL<br>
@@ -474,7 +479,7 @@ class DefaultGlobalTestPartResultReporter<br>
explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);<br>
// Implements the TestPartResultReporterInterface. Reports the test part<br>
// result in the current test.<br>
- virtual void ReportTestPartResult(const TestPartResult& result);<br>
+ void ReportTestPartResult(const TestPartResult& result) override;<br>
<br>
private:<br>
UnitTestImpl* const unit_test_;<br>
@@ -490,7 +495,7 @@ class DefaultPerThreadTestPartResultReporter<br>
explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);<br>
// Implements the TestPartResultReporterInterface. The implementation just<br>
// delegates to the current global test part result reporter of *unit_test_.<br>
- virtual void ReportTestPartResult(const TestPartResult& result);<br>
+ void ReportTestPartResult(const TestPartResult& result) override;<br>
<br>
private:<br>
UnitTestImpl* const unit_test_;<br>
@@ -528,22 +533,25 @@ class GTEST_API_ UnitTestImpl {<br>
void SetTestPartResultReporterForCurrentThread(<br>
TestPartResultReporterInterface* reporter);<br>
<br>
- // Gets the number of successful test cases.<br>
- int successful_test_case_count() const;<br>
+ // Gets the number of successful test suites.<br>
+ int successful_test_suite_count() const;<br>
<br>
- // Gets the number of failed test cases.<br>
- int failed_test_case_count() const;<br>
+ // Gets the number of failed test suites.<br>
+ int failed_test_suite_count() const;<br>
<br>
- // Gets the number of all test cases.<br>
- int total_test_case_count() const;<br>
+ // Gets the number of all test suites.<br>
+ int total_test_suite_count() const;<br>
<br>
- // Gets the number of all test cases that contain at least one test<br>
+ // Gets the number of all test suites that contain at least one test<br>
// that should run.<br>
- int test_case_to_run_count() const;<br>
+ int test_suite_to_run_count() const;<br>
<br>
// Gets the number of successful tests.<br>
int successful_test_count() const;<br>
<br>
+ // Gets the number of skipped tests.<br>
+ int skipped_test_count() const;<br>
+<br>
// Gets the number of failed tests.<br>
int failed_test_count() const;<br>
<br>
@@ -569,27 +577,33 @@ class GTEST_API_ UnitTestImpl {<br>
// Gets the elapsed time, in milliseconds.<br>
TimeInMillis elapsed_time() const { return elapsed_time_; }<br>
<br>
- // Returns true iff the unit test passed (i.e. all test cases passed).<br>
+ // Returns true if and only if the unit test passed (i.e. all test suites<br>
+ // passed).<br>
bool Passed() const { return !Failed(); }<br>
<br>
- // Returns true iff the unit test failed (i.e. some test case failed<br>
- // or something outside of all tests failed).<br>
+ // Returns true if and only if the unit test failed (i.e. some test suite<br>
+ // failed or something outside of all tests failed).<br>
bool Failed() const {<br>
- return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();<br>
+ return failed_test_suite_count() > 0 || ad_hoc_test_result()->Failed();<br>
}<br>
<br>
- // Gets the i-th test case among all the test cases. i can range from 0 to<br>
- // total_test_case_count() - 1. If i is not in that range, returns NULL.<br>
- const TestCase* GetTestCase(int i) const {<br>
- const int index = GetElementOr(test_case_indices_, i, -1);<br>
- return index < 0 ? NULL : test_cases_[i];<br>
+ // Gets the i-th test suite among all the test suites. i can range from 0 to<br>
+ // total_test_suite_count() - 1. If i is not in that range, returns NULL.<br>
+ const TestSuite* GetTestSuite(int i) const {<br>
+ const int index = GetElementOr(test_suite_indices_, i, -1);<br>
+ return index < 0 ? nullptr : test_suites_[static_cast<size_t>(i)];<br>
}<br>
<br>
- // Gets the i-th test case among all the test cases. i can range from 0 to<br>
- // total_test_case_count() - 1. If i is not in that range, returns NULL.<br>
- TestCase* GetMutableTestCase(int i) {<br>
- const int index = GetElementOr(test_case_indices_, i, -1);<br>
- return index < 0 ? NULL : test_cases_[index];<br>
+ // Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ const TestCase* GetTestCase(int i) const { return GetTestSuite(i); }<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
+ // Gets the i-th test suite among all the test suites. i can range from 0 to<br>
+ // total_test_suite_count() - 1. If i is not in that range, returns NULL.<br>
+ TestSuite* GetMutableSuiteCase(int i) {<br>
+ const int index = GetElementOr(test_suite_indices_, i, -1);<br>
+ return index < 0 ? nullptr : test_suites_[static_cast<size_t>(index)];<br>
}<br>
<br>
// Provides access to the event listener list.<br>
@@ -626,30 +640,38 @@ class GTEST_API_ UnitTestImpl {<br>
// trace but Bar() and CurrentOsStackTraceExceptTop() won't.<br>
std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;<br>
<br>
- // Finds and returns a TestCase with the given name. If one doesn't<br>
+ // Finds and returns a TestSuite with the given name. If one doesn't<br>
// exist, creates one and returns it.<br>
//<br>
// Arguments:<br>
//<br>
- // test_case_name: name of the test case<br>
+ // test_suite_name: name of the test suite<br>
// type_param: the name of the test's type parameter, or NULL if<br>
// this is not a typed or a type-parameterized test.<br>
- // set_up_tc: pointer to the function that sets up the test case<br>
- // tear_down_tc: pointer to the function that tears down the test case<br>
- TestCase* GetTestCase(const char* test_case_name,<br>
- const char* type_param,<br>
- Test::SetUpTestCaseFunc set_up_tc,<br>
- Test::TearDownTestCaseFunc tear_down_tc);<br>
+ // set_up_tc: pointer to the function that sets up the test suite<br>
+ // tear_down_tc: pointer to the function that tears down the test suite<br>
+ TestSuite* GetTestSuite(const char* test_suite_name, const char* type_param,<br>
+ internal::SetUpTestSuiteFunc set_up_tc,<br>
+ internal::TearDownTestSuiteFunc tear_down_tc);<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ TestCase* GetTestCase(const char* test_case_name, const char* type_param,<br>
+ internal::SetUpTestSuiteFunc set_up_tc,<br>
+ internal::TearDownTestSuiteFunc tear_down_tc) {<br>
+ return GetTestSuite(test_case_name, type_param, set_up_tc, tear_down_tc);<br>
+ }<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
// Adds a TestInfo to the unit test.<br>
//<br>
// Arguments:<br>
//<br>
- // set_up_tc: pointer to the function that sets up the test case<br>
- // tear_down_tc: pointer to the function that tears down the test case<br>
+ // set_up_tc: pointer to the function that sets up the test suite<br>
+ // tear_down_tc: pointer to the function that tears down the test suite<br>
// test_info: the TestInfo object<br>
- void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,<br>
- Test::TearDownTestCaseFunc tear_down_tc,<br>
+ void AddTestInfo(internal::SetUpTestSuiteFunc set_up_tc,<br>
+ internal::TearDownTestSuiteFunc tear_down_tc,<br>
TestInfo* test_info) {<br>
// In order to support thread-safe death tests, we need to<br>
// remember the original working directory when the test program<br>
@@ -664,21 +686,20 @@ class GTEST_API_ UnitTestImpl {<br>
<< "Failed to get the current working directory.";<br>
}<br>
<br>
- GetTestCase(test_info->test_case_name(),<br>
- test_info->type_param(),<br>
- set_up_tc,<br>
- tear_down_tc)->AddTestInfo(test_info);<br>
+ GetTestSuite(test_info->test_suite_name(), test_info->type_param(),<br>
+ set_up_tc, tear_down_tc)<br>
+ ->AddTestInfo(test_info);<br>
}<br>
<br>
- // Returns ParameterizedTestCaseRegistry object used to keep track of<br>
+ // Returns ParameterizedTestSuiteRegistry object used to keep track of<br>
// value-parameterized tests and instantiate and register them.<br>
- internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {<br>
+ internal::ParameterizedTestSuiteRegistry& parameterized_test_registry() {<br>
return parameterized_test_registry_;<br>
}<br>
<br>
- // Sets the TestCase object for the test that's currently running.<br>
- void set_current_test_case(TestCase* a_current_test_case) {<br>
- current_test_case_ = a_current_test_case;<br>
+ // Sets the TestSuite object for the test that's currently running.<br>
+ void set_current_test_suite(TestSuite* a_current_test_suite) {<br>
+ current_test_suite_ = a_current_test_suite;<br>
}<br>
<br>
// Sets the TestInfo object for the test that's currently running. If<br>
@@ -689,7 +710,7 @@ class GTEST_API_ UnitTestImpl {<br>
}<br>
<br>
// Registers all parameterized tests defined using TEST_P and<br>
- // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter<br>
+ // INSTANTIATE_TEST_SUITE_P, creating regular tests for each test/parameter<br>
// combination. This method can be called more then once; it has guards<br>
// protecting from registering the tests more then once. If<br>
// value-parameterized tests are disabled, RegisterParameterizedTests is<br>
@@ -704,7 +725,7 @@ class GTEST_API_ UnitTestImpl {<br>
<br>
// Clears the results of all tests, except the ad hoc tests.<br>
void ClearNonAdHocTestResult() {<br>
- ForEach(test_cases_, TestCase::ClearTestCaseResult);<br>
+ ForEach(test_suites_, TestSuite::ClearTestSuiteResult);<br>
}<br>
<br>
// Clears the results of ad-hoc test assertions.<br>
@@ -713,7 +734,7 @@ class GTEST_API_ UnitTestImpl {<br>
}<br>
<br>
// Adds a TestProperty to the current TestResult object when invoked in a<br>
- // context of a test or a test case, or to the global property set. If the<br>
+ // context of a test or a test suite, or to the global property set. If the<br>
// result already contains a property with the same key, the value will be<br>
// updated.<br>
void RecordProperty(const TestProperty& test_property);<br>
@@ -725,7 +746,7 @@ class GTEST_API_ UnitTestImpl {<br>
<br>
// Matches the full name of each test against the user-specified<br>
// filter to decide whether the test should run, then records the<br>
- // result in each TestCase and TestInfo object.<br>
+ // result in each TestSuite and TestInfo object.<br>
// If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests<br>
// based on sharding variables in the environment.<br>
// Returns the number of tests that should run.<br>
@@ -734,7 +755,7 @@ class GTEST_API_ UnitTestImpl {<br>
// Prints the names of the tests matching the user-specified filter flag.<br>
void ListTestsMatchingFilter();<br>
<br>
- const TestCase* current_test_case() const { return current_test_case_; }<br>
+ const TestSuite* current_test_suite() const { return current_test_suite_; }<br>
TestInfo* current_test_info() { return current_test_info_; }<br>
const TestInfo* current_test_info() const { return current_test_info_; }<br>
<br>
@@ -795,11 +816,11 @@ class GTEST_API_ UnitTestImpl {<br>
// Gets the random number generator.<br>
internal::Random* random() { return &random_; }<br>
<br>
- // Shuffles all test cases, and the tests within each test case,<br>
+ // Shuffles all test suites, and the tests within each test suite,<br>
// making sure that death tests are still run first.<br>
void ShuffleTests();<br>
<br>
- // Restores the test cases and tests to their order before the first shuffle.<br>
+ // Restores the test suites and tests to their order before the first shuffle.<br>
void UnshuffleTests();<br>
<br>
// Returns the value of GTEST_FLAG(catch_exceptions) at the moment<br>
@@ -839,31 +860,31 @@ class GTEST_API_ UnitTestImpl {<br>
// before/after the tests are run.<br>
std::vector<Environment*> environments_;<br>
<br>
- // The vector of TestCases in their original order. It owns the<br>
+ // The vector of TestSuites in their original order. It owns the<br>
// elements in the vector.<br>
- std::vector<TestCase*> test_cases_;<br>
+ std::vector<TestSuite*> test_suites_;<br>
<br>
- // Provides a level of indirection for the test case list to allow<br>
- // easy shuffling and restoring the test case order. The i-th<br>
- // element of this vector is the index of the i-th test case in the<br>
+ // Provides a level of indirection for the test suite list to allow<br>
+ // easy shuffling and restoring the test suite order. The i-th<br>
+ // element of this vector is the index of the i-th test suite in the<br>
// shuffled order.<br>
- std::vector<int> test_case_indices_;<br>
+ std::vector<int> test_suite_indices_;<br>
<br>
// ParameterizedTestRegistry object used to register value-parameterized<br>
// tests.<br>
- internal::ParameterizedTestCaseRegistry parameterized_test_registry_;<br>
+ internal::ParameterizedTestSuiteRegistry parameterized_test_registry_;<br>
<br>
// Indicates whether RegisterParameterizedTests() has been called already.<br>
bool parameterized_tests_registered_;<br>
<br>
- // Index of the last death test case registered. Initially -1.<br>
- int last_death_test_case_;<br>
+ // Index of the last death test suite registered. Initially -1.<br>
+ int last_death_test_suite_;<br>
<br>
- // This points to the TestCase for the currently running test. It<br>
- // changes as Google Test goes through one test case after another.<br>
+ // This points to the TestSuite for the currently running test. It<br>
+ // changes as Google Test goes through one test suite after another.<br>
// When no test is running, this is set to NULL and Google Test<br>
// stores assertion results in ad_hoc_test_result_. Initially NULL.<br>
- TestCase* current_test_case_;<br>
+ TestSuite* current_test_suite_;<br>
<br>
// This points to the TestInfo for the currently running test. It<br>
// changes as Google Test goes through one test after another. When<br>
@@ -891,7 +912,7 @@ class GTEST_API_ UnitTestImpl {<br>
// desired.<br>
OsStackTraceGetterInterface* os_stack_trace_getter_;<br>
<br>
- // True iff PostFlagParsingInit() has been called.<br>
+ // True if and only if PostFlagParsingInit() has been called.<br>
bool post_flag_parse_init_performed_;<br>
<br>
// The random number seed used at the beginning of the test run.<br>
@@ -910,8 +931,8 @@ class GTEST_API_ UnitTestImpl {<br>
#if GTEST_HAS_DEATH_TEST<br>
// The decomposed components of the gtest_internal_run_death_test flag,<br>
// parsed when RUN_ALL_TESTS is called.<br>
- internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;<br>
- internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;<br>
+ std::unique_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;<br>
+ std::unique_ptr<internal::DeathTestFactory> death_test_factory_;<br>
#endif // GTEST_HAS_DEATH_TEST<br>
<br>
// A per-thread stack of traces created by the SCOPED_TRACE() macro.<br>
@@ -994,8 +1015,6 @@ bool ParseNaturalNumber(const ::std::string& str, Integer* number) {<br>
<br>
const bool parse_success = *end == '\0' && errno == 0;<br>
<br>
- // FIXME: Convert this to compile time assertion when it is<br>
- // available.<br>
GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));<br>
<br>
const Integer result = static_cast<Integer>(parsed);<br>
@@ -1059,18 +1078,18 @@ class StreamingListener : public EmptyTestEventListener {<br>
MakeConnection();<br>
}<br>
<br>
- virtual ~SocketWriter() {<br>
+ ~SocketWriter() override {<br>
if (sockfd_ != -1)<br>
CloseConnection();<br>
}<br>
<br>
// Sends a string to the socket.<br>
- virtual void Send(const std::string& message) {<br>
+ void Send(const std::string& message) override {<br>
GTEST_CHECK_(sockfd_ != -1)<br>
<< "Send() can be called only when there is a connection.";<br>
<br>
- const int len = static_cast<int>(message.length());<br>
- if (write(sockfd_, message.c_str(), len) != len) {<br>
+ const auto len = static_cast<size_t>(message.length());<br>
+ if (write(sockfd_, message.c_str(), len) != static_cast<ssize_t>(len)) {<br>
GTEST_LOG_(WARNING)<br>
<< "stream_result_to: failed to stream to "<br>
<< host_name_ << ":" << port_num_;<br>
@@ -1082,7 +1101,7 @@ class StreamingListener : public EmptyTestEventListener {<br>
void MakeConnection();<br>
<br>
// Closes the socket.<br>
- void CloseConnection() {<br>
+ void CloseConnection() override {<br>
GTEST_CHECK_(sockfd_ != -1)<br>
<< "CloseConnection() can be called only when there is a connection.";<br>
<br>
@@ -1108,11 +1127,11 @@ class StreamingListener : public EmptyTestEventListener {<br>
explicit StreamingListener(AbstractSocketWriter* socket_writer)<br>
: socket_writer_(socket_writer) { Start(); }<br>
<br>
- void OnTestProgramStart(const UnitTest& /* unit_test */) {<br>
+ void OnTestProgramStart(const UnitTest& /* unit_test */) override {<br>
SendLn("event=TestProgramStart");<br>
}<br>
<br>
- void OnTestProgramEnd(const UnitTest& unit_test) {<br>
+ void OnTestProgramEnd(const UnitTest& unit_test) override {<br>
// Note that Google Test current only report elapsed time for each<br>
// test iteration, not for the entire test program.<br>
SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));<br>
@@ -1121,42 +1140,47 @@ class StreamingListener : public EmptyTestEventListener {<br>
socket_writer_->CloseConnection();<br>
}<br>
<br>
- void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {<br>
+ void OnTestIterationStart(const UnitTest& /* unit_test */,<br>
+ int iteration) override {<br>
SendLn("event=TestIterationStart&iteration=" +<br>
StreamableToString(iteration));<br>
}<br>
<br>
- void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {<br>
+ void OnTestIterationEnd(const UnitTest& unit_test,<br>
+ int /* iteration */) override {<br>
SendLn("event=TestIterationEnd&passed=" +<br>
FormatBool(unit_test.Passed()) + "&elapsed_time=" +<br>
StreamableToString(unit_test.elapsed_time()) + "ms");<br>
}<br>
<br>
- void OnTestCaseStart(const TestCase& test_case) {<br>
+ // Note that "event=TestCaseStart" is a wire format and has to remain<br>
+ // "case" for compatibilty<br>
+ void OnTestCaseStart(const TestCase& test_case) override {<br>
SendLn(std::string("event=TestCaseStart&name=") + <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>());<br>
}<br>
<br>
- void OnTestCaseEnd(const TestCase& test_case) {<br>
- SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed())<br>
- + "&elapsed_time=" + StreamableToString(test_case.elapsed_time())<br>
- + "ms");<br>
+ // Note that "event=TestCaseEnd" is a wire format and has to remain<br>
+ // "case" for compatibilty<br>
+ void OnTestCaseEnd(const TestCase& test_case) override {<br>
+ SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed()) +<br>
+ "&elapsed_time=" + StreamableToString(test_case.elapsed_time()) +<br>
+ "ms");<br>
}<br>
<br>
- void OnTestStart(const TestInfo& test_info) {<br>
+ void OnTestStart(const TestInfo& test_info) override {<br>
SendLn(std::string("event=TestStart&name=") + <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
}<br>
<br>
- void OnTestEnd(const TestInfo& test_info) {<br>
+ void OnTestEnd(const TestInfo& test_info) override {<br>
SendLn("event=TestEnd&passed=" +<br>
FormatBool((test_info.result())->Passed()) +<br>
"&elapsed_time=" +<br>
StreamableToString((test_info.result())->elapsed_time()) + "ms");<br>
}<br>
<br>
- void OnTestPartResult(const TestPartResult& test_part_result) {<br>
+ void OnTestPartResult(const TestPartResult& test_part_result) override {<br>
const char* file_name = test_part_result.file_name();<br>
- if (file_name == NULL)<br>
- file_name = "";<br>
+ if (file_name == nullptr) file_name = "";<br>
SendLn("event=TestPartResult&file=" + UrlEncode(file_name) +<br>
"&line=" + StreamableToString(test_part_result.line_number()) +<br>
"&message=" + UrlEncode(test_part_result.message()));<br>
@@ -1172,7 +1196,7 @@ class StreamingListener : public EmptyTestEventListener {<br>
<br>
std::string FormatBool(bool value) { return value ? "1" : "0"; }<br>
<br>
- const scoped_ptr<AbstractSocketWriter> socket_writer_;<br>
+ const std::unique_ptr<AbstractSocketWriter> socket_writer_;<br>
<br>
GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);<br>
}; // class StreamingListener<br>
<br>
diff --git a/llvm/utils/unittest/googletest/src/gtest-matchers.cc b/llvm/utils/unittest/googletest/src/gtest-matchers.cc<br>
new file mode 100644<br>
index 0000000000000..7d2fb6851ec41<br>
--- /dev/null<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-matchers.cc<br>
@@ -0,0 +1,97 @@<br>
+// Copyright 2007, Google Inc.<br>
+// All rights reserved.<br>
+//<br>
+// Redistribution and use in source and binary forms, with or without<br>
+// modification, are permitted provided that the following conditions are<br>
+// met:<br>
+//<br>
+// * Redistributions of source code must retain the above copyright<br>
+// notice, this list of conditions and the following disclaimer.<br>
+// * Redistributions in binary form must reproduce the above<br>
+// copyright notice, this list of conditions and the following disclaimer<br>
+// in the documentation and/or other materials provided with the<br>
+// distribution.<br>
+// * Neither the name of Google Inc. nor the names of its<br>
+// contributors may be used to endorse or promote products derived from<br>
+// this software without specific prior written permission.<br>
+//<br>
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
+<br>
+// The Google C++ Testing and Mocking Framework (Google Test)<br>
+//<br>
+// This file implements just enough of the matcher interface to allow<br>
+// EXPECT_DEATH and friends to accept a matcher argument.<br>
+<br>
+#include "gtest/internal/gtest-internal.h"<br>
+#include "gtest/internal/gtest-port.h"<br>
+#include "gtest/gtest-matchers.h"<br>
+<br>
+#include <string><br>
+<br>
+namespace testing {<br>
+<br>
+// Constructs a matcher that matches a const std::string& whose value is<br>
+// equal to s.<br>
+Matcher<const std::string&>::Matcher(const std::string& s) { *this = Eq(s); }<br>
+<br>
+// Constructs a matcher that matches a const std::string& whose value is<br>
+// equal to s.<br>
+Matcher<const std::string&>::Matcher(const char* s) {<br>
+ *this = Eq(std::string(s));<br>
+}<br>
+<br>
+// Constructs a matcher that matches a std::string whose value is equal to<br>
+// s.<br>
+Matcher<std::string>::Matcher(const std::string& s) { *this = Eq(s); }<br>
+<br>
+// Constructs a matcher that matches a std::string whose value is equal to<br>
+// s.<br>
+Matcher<std::string>::Matcher(const char* s) { *this = Eq(std::string(s)); }<br>
+<br>
+#if GTEST_HAS_ABSL<br>
+// Constructs a matcher that matches a const absl::string_view& whose value is<br>
+// equal to s.<br>
+Matcher<const absl::string_view&>::Matcher(const std::string& s) {<br>
+ *this = Eq(s);<br>
+}<br>
+<br>
+// Constructs a matcher that matches a const absl::string_view& whose value is<br>
+// equal to s.<br>
+Matcher<const absl::string_view&>::Matcher(const char* s) {<br>
+ *this = Eq(std::string(s));<br>
+}<br>
+<br>
+// Constructs a matcher that matches a const absl::string_view& whose value is<br>
+// equal to s.<br>
+Matcher<const absl::string_view&>::Matcher(absl::string_view s) {<br>
+ *this = Eq(std::string(s));<br>
+}<br>
+<br>
+// Constructs a matcher that matches a absl::string_view whose value is equal to<br>
+// s.<br>
+Matcher<absl::string_view>::Matcher(const std::string& s) { *this = Eq(s); }<br>
+<br>
+// Constructs a matcher that matches a absl::string_view whose value is equal to<br>
+// s.<br>
+Matcher<absl::string_view>::Matcher(const char* s) {<br>
+ *this = Eq(std::string(s));<br>
+}<br>
+<br>
+// Constructs a matcher that matches a absl::string_view whose value is equal to<br>
+// s.<br>
+Matcher<absl::string_view>::Matcher(absl::string_view s) {<br>
+ *this = Eq(std::string(s));<br>
+}<br>
+#endif // GTEST_HAS_ABSL<br>
+<br>
+} // namespace testing<br>
<br>
diff --git a/llvm/utils/unittest/googletest/src/gtest-port.cc b/llvm/utils/unittest/googletest/src/gtest-port.cc<br>
index fecb5d11c2129..fc5ba6becc55f 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-port.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-port.cc<br>
@@ -31,16 +31,20 @@<br>
#include "gtest/internal/gtest-port.h"<br>
<br>
#include <limits.h><br>
-#include <stdlib.h><br>
#include <stdio.h><br>
+#include <stdlib.h><br>
#include <string.h><br>
#include <fstream><br>
+#include <memory><br>
<br>
#if GTEST_OS_WINDOWS<br>
# include <windows.h><br>
# include <io.h><br>
# include <sys/stat.h><br>
# include <map> // Used in ThreadLocal.<br>
+# ifdef _MSC_VER<br>
+# include <crtdbg.h><br>
+# endif // _MSC_VER<br>
#else<br>
# include <unistd.h><br>
#endif // GTEST_OS_WINDOWS<br>
@@ -51,6 +55,14 @@<br>
# include <mach/vm_map.h><br>
#endif // GTEST_OS_MAC<br>
<br>
+#if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \<br>
+ GTEST_OS_NETBSD || GTEST_OS_OPENBSD<br>
+# include <sys/sysctl.h><br>
+# if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD<br>
+# include <sys/user.h><br>
+# endif<br>
+#endif<br>
+<br>
#if GTEST_OS_QNX<br>
# include <devctl.h><br>
# include <fcntl.h><br>
@@ -105,7 +117,7 @@ T ReadProcFileField(const std::string& filename, int field) {<br>
size_t GetThreadCount() {<br>
const std::string filename =<br>
(Message() << "/proc/" << getpid() << "/stat").GetString();<br>
- return ReadProcFileField<int>(filename, 19);<br>
+ return ReadProcFileField<size_t>(filename, 19);<br>
}<br>
<br>
#elif GTEST_OS_MAC<br>
@@ -127,6 +139,81 @@ size_t GetThreadCount() {<br>
}<br>
}<br>
<br>
+#elif GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \<br>
+ GTEST_OS_NETBSD<br>
+<br>
+#if GTEST_OS_NETBSD<br>
+#undef KERN_PROC<br>
+#define KERN_PROC KERN_PROC2<br>
+#define kinfo_proc kinfo_proc2<br>
+#endif<br>
+<br>
+#if GTEST_OS_DRAGONFLY<br>
+#define KP_NLWP(kp) (kp.kp_nthreads)<br>
+#elif GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD<br>
+#define KP_NLWP(kp) (kp.ki_numthreads)<br>
+#elif GTEST_OS_NETBSD<br>
+#define KP_NLWP(kp) (kp.p_nlwps)<br>
+#endif<br>
+<br>
+// Returns the number of threads running in the process, or 0 to indicate that<br>
+// we cannot detect it.<br>
+size_t GetThreadCount() {<br>
+ int mib[] = {<br>
+ CTL_KERN,<br>
+ KERN_PROC,<br>
+ KERN_PROC_PID,<br>
+ getpid(),<br>
+#if GTEST_OS_NETBSD<br>
+ sizeof(struct kinfo_proc),<br>
+ 1,<br>
+#endif<br>
+ };<br>
+ u_int miblen = sizeof(mib) / sizeof(mib[0]);<br>
+ struct kinfo_proc info;<br>
+ size_t size = sizeof(info);<br>
+ if (sysctl(mib, miblen, &info, &size, NULL, 0)) {<br>
+ return 0;<br>
+ }<br>
+ return static_cast<size_t>(KP_NLWP(info));<br>
+}<br>
+#elif GTEST_OS_OPENBSD<br>
+<br>
+// Returns the number of threads running in the process, or 0 to indicate that<br>
+// we cannot detect it.<br>
+size_t GetThreadCount() {<br>
+ int mib[] = {<br>
+ CTL_KERN,<br>
+ KERN_PROC,<br>
+ KERN_PROC_PID | KERN_PROC_SHOW_THREADS,<br>
+ getpid(),<br>
+ sizeof(struct kinfo_proc),<br>
+ 0,<br>
+ };<br>
+ u_int miblen = sizeof(mib) / sizeof(mib[0]);<br>
+<br>
+ // get number of structs<br>
+ size_t size;<br>
+ if (sysctl(mib, miblen, NULL, &size, NULL, 0)) {<br>
+ return 0;<br>
+ }<br>
+ mib[5] = size / mib[4];<br>
+<br>
+ // populate array of structs<br>
+ struct kinfo_proc info[mib[5]];<br>
+ if (sysctl(mib, miblen, &info, &size, NULL, 0)) {<br>
+ return 0;<br>
+ }<br>
+<br>
+ // exclude empty members<br>
+ int nthreads = 0;<br>
+ for (int i = 0; i < size / mib[4]; i++) {<br>
+ if (info[i].p_tid != -1)<br>
+ nthreads++;<br>
+ }<br>
+ return nthreads;<br>
+}<br>
+<br>
#elif GTEST_OS_QNX<br>
<br>
// Returns the number of threads running in the process, or 0 to indicate that<br>
@@ -138,7 +225,7 @@ size_t GetThreadCount() {<br>
}<br>
procfs_info process_info;<br>
const int status =<br>
- devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);<br>
+ devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), nullptr);<br>
close(fd);<br>
if (status == EOK) {<br>
return static_cast<size_t>(process_info.num_threads);<br>
@@ -152,7 +239,7 @@ size_t GetThreadCount() {<br>
size_t GetThreadCount() {<br>
struct procentry64 entry;<br>
pid_t pid = getpid();<br>
- int status = getprocs64(&entry, sizeof(entry), NULL, 0, &pid, 1);<br>
+ int status = getprocs64(&entry, sizeof(entry), nullptr, 0, &pid, 1);<br>
if (status == 1) {<br>
return entry.pi_thcount;<br>
} else {<br>
@@ -192,7 +279,7 @@ size_t GetThreadCount() {<br>
#if GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS<br>
<br>
void SleepMilliseconds(int n) {<br>
- ::Sleep(n);<br>
+ ::Sleep(static_cast<DWORD>(n));<br>
}<br>
<br>
AutoHandle::AutoHandle()<br>
@@ -230,15 +317,15 @@ void AutoHandle::Reset(HANDLE handle) {<br>
bool AutoHandle::IsCloseable() const {<br>
// Different Windows APIs may use either of these values to represent an<br>
// invalid handle.<br>
- return handle_ != NULL && handle_ != INVALID_HANDLE_VALUE;<br>
+ return handle_ != nullptr && handle_ != INVALID_HANDLE_VALUE;<br>
}<br>
<br>
Notification::Notification()<br>
- : event_(::CreateEvent(NULL, // Default security attributes.<br>
- TRUE, // Do not reset automatically.<br>
- FALSE, // Initially unset.<br>
- NULL)) { // Anonymous event.<br>
- GTEST_CHECK_(event_.Get() != NULL);<br>
+ : event_(::CreateEvent(nullptr, // Default security attributes.<br>
+ TRUE, // Do not reset automatically.<br>
+ FALSE, // Initially unset.<br>
+ nullptr)) { // Anonymous event.<br>
+ GTEST_CHECK_(event_.Get() != nullptr);<br>
}<br>
<br>
void Notification::Notify() {<br>
@@ -261,13 +348,10 @@ Mutex::Mutex()<br>
Mutex::~Mutex() {<br>
// Static mutexes are leaked intentionally. It is not thread-safe to try<br>
// to clean them up.<br>
- // FIXME: Switch to Slim Reader/Writer (SRW) Locks, which requires<br>
- // nothing to clean it up but is available only on Vista and later.<br>
- // <a href="https://docs.microsoft.com/en-us/windows/desktop/Sync/slim-reader-writer--srw--locks" rel="noreferrer" target="_blank">https://docs.microsoft.com/en-us/windows/desktop/Sync/slim-reader-writer--srw--locks</a><br>
if (type_ == kDynamic) {<br>
::DeleteCriticalSection(critical_section_);<br>
delete critical_section_;<br>
- critical_section_ = NULL;<br>
+ critical_section_ = nullptr;<br>
}<br>
}<br>
<br>
@@ -296,6 +380,7 @@ void Mutex::AssertHeld() {<br>
<br>
namespace {<br>
<br>
+#ifdef _MSC_VER<br>
// Use the RAII idiom to flag mem allocs that are intentionally never<br>
// deallocated. The motivation is to silence the false positive mem leaks<br>
// that are reported by the debug version of MS's CRT which can only detect<br>
@@ -308,19 +393,15 @@ class MemoryIsNotDeallocated<br>
{<br>
public:<br>
MemoryIsNotDeallocated() : old_crtdbg_flag_(0) {<br>
-#ifdef _MSC_VER<br>
old_crtdbg_flag_ = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);<br>
// Set heap allocation block type to _IGNORE_BLOCK so that MS debug CRT<br>
// doesn't report mem leak if there's no matching deallocation.<br>
_CrtSetDbgFlag(old_crtdbg_flag_ & ~_CRTDBG_ALLOC_MEM_DF);<br>
-#endif // _MSC_VER<br>
}<br>
<br>
~MemoryIsNotDeallocated() {<br>
-#ifdef _MSC_VER<br>
// Restore the original _CRTDBG_ALLOC_MEM_DF flag<br>
_CrtSetDbgFlag(old_crtdbg_flag_);<br>
-#endif // _MSC_VER<br>
}<br>
<br>
private:<br>
@@ -328,6 +409,7 @@ class MemoryIsNotDeallocated<br>
<br>
GTEST_DISALLOW_COPY_AND_ASSIGN_(MemoryIsNotDeallocated);<br>
};<br>
+#endif // _MSC_VER<br>
<br>
} // namespace<br>
<br>
@@ -343,7 +425,9 @@ void Mutex::ThreadSafeLazyInit() {<br>
owner_thread_id_ = 0;<br>
{<br>
// Use RAII to flag that following mem alloc is never deallocated.<br>
+#ifdef _MSC_VER<br>
MemoryIsNotDeallocated memory_is_not_deallocated;<br>
+#endif // _MSC_VER<br>
critical_section_ = new CRITICAL_SECTION;<br>
}<br>
::InitializeCriticalSection(critical_section_);<br>
@@ -384,17 +468,16 @@ class ThreadWithParamSupport : public ThreadWithParamBase {<br>
Notification* thread_can_start) {<br>
ThreadMainParam* param = new ThreadMainParam(runnable, thread_can_start);<br>
DWORD thread_id;<br>
- // FIXME: Consider to use _beginthreadex instead.<br>
HANDLE thread_handle = ::CreateThread(<br>
- NULL, // Default security.<br>
- 0, // Default stack size.<br>
+ nullptr, // Default security.<br>
+ 0, // Default stack size.<br>
&ThreadWithParamSupport::ThreadMain,<br>
- param, // Parameter to ThreadMainStatic<br>
- 0x0, // Default creation flags.<br>
+ param, // Parameter to ThreadMainStatic<br>
+ 0x0, // Default creation flags.<br>
&thread_id); // Need a valid pointer for the call to work under Win98.<br>
- GTEST_CHECK_(thread_handle != NULL) << "CreateThread failed with error "<br>
- << ::GetLastError() << ".";<br>
- if (thread_handle == NULL) {<br>
+ GTEST_CHECK_(thread_handle != nullptr)<br>
+ << "CreateThread failed with error " << ::GetLastError() << ".";<br>
+ if (thread_handle == nullptr) {<br>
delete param;<br>
}<br>
return thread_handle;<br>
@@ -406,15 +489,15 @@ class ThreadWithParamSupport : public ThreadWithParamBase {<br>
: runnable_(runnable),<br>
thread_can_start_(thread_can_start) {<br>
}<br>
- scoped_ptr<Runnable> runnable_;<br>
+ std::unique_ptr<Runnable> runnable_;<br>
// Does not own.<br>
Notification* thread_can_start_;<br>
};<br>
<br>
static DWORD WINAPI ThreadMain(void* ptr) {<br>
// Transfers ownership.<br>
- scoped_ptr<ThreadMainParam> param(static_cast<ThreadMainParam*>(ptr));<br>
- if (param->thread_can_start_ != NULL)<br>
+ std::unique_ptr<ThreadMainParam> param(static_cast<ThreadMainParam*>(ptr));<br>
+ if (param->thread_can_start_ != nullptr)<br>
param->thread_can_start_->WaitForNotification();<br>
param->runnable_->Run();<br>
return 0;<br>
@@ -472,7 +555,7 @@ class ThreadLocalRegistryImpl {<br>
thread_local_values<br>
.insert(std::make_pair(<br>
thread_local_instance,<br>
- linked_ptr<ThreadLocalValueHolderBase>(<br>
+ std::shared_ptr<ThreadLocalValueHolderBase>(<br>
thread_local_instance->NewValueForCurrentThread())))<br>
.first;<br>
}<br>
@@ -481,7 +564,7 @@ class ThreadLocalRegistryImpl {<br>
<br>
static void OnThreadLocalDestroyed(<br>
const ThreadLocalBase* thread_local_instance) {<br>
- std::vector<linked_ptr<ThreadLocalValueHolderBase> > value_holders;<br>
+ std::vector<std::shared_ptr<ThreadLocalValueHolderBase> > value_holders;<br>
// Clean up the ThreadLocalValues data structure while holding the lock, but<br>
// defer the destruction of the ThreadLocalValueHolderBases.<br>
{<br>
@@ -509,7 +592,7 @@ class ThreadLocalRegistryImpl {<br>
<br>
static void OnThreadExit(DWORD thread_id) {<br>
GTEST_CHECK_(thread_id != 0) << ::GetLastError();<br>
- std::vector<linked_ptr<ThreadLocalValueHolderBase> > value_holders;<br>
+ std::vector<std::shared_ptr<ThreadLocalValueHolderBase> > value_holders;<br>
// Clean up the ThreadIdToThreadLocals data structure while holding the<br>
// lock, but defer the destruction of the ThreadLocalValueHolderBases.<br>
{<br>
@@ -536,7 +619,8 @@ class ThreadLocalRegistryImpl {<br>
private:<br>
// In a particular thread, maps a ThreadLocal object to its value.<br>
typedef std::map<const ThreadLocalBase*,<br>
- linked_ptr<ThreadLocalValueHolderBase> > ThreadLocalValues;<br>
+ std::shared_ptr<ThreadLocalValueHolderBase> ><br>
+ ThreadLocalValues;<br>
// Stores all ThreadIdToThreadLocals having values in a thread, indexed by<br>
// thread's ID.<br>
typedef std::map<DWORD, ThreadLocalValues> ThreadIdToThreadLocals;<br>
@@ -551,18 +635,17 @@ class ThreadLocalRegistryImpl {<br>
HANDLE thread = ::OpenThread(SYNCHRONIZE | THREAD_QUERY_INFORMATION,<br>
FALSE,<br>
thread_id);<br>
- GTEST_CHECK_(thread != NULL);<br>
+ GTEST_CHECK_(thread != nullptr);<br>
// We need to pass a valid thread ID pointer into CreateThread for it<br>
// to work correctly under Win98.<br>
DWORD watcher_thread_id;<br>
HANDLE watcher_thread = ::CreateThread(<br>
- NULL, // Default security.<br>
- 0, // Default stack size<br>
+ nullptr, // Default security.<br>
+ 0, // Default stack size<br>
&ThreadLocalRegistryImpl::WatcherThreadFunc,<br>
reinterpret_cast<LPVOID>(new ThreadIdAndHandle(thread_id, thread)),<br>
- CREATE_SUSPENDED,<br>
- &watcher_thread_id);<br>
- GTEST_CHECK_(watcher_thread != NULL);<br>
+ CREATE_SUSPENDED, &watcher_thread_id);<br>
+ GTEST_CHECK_(watcher_thread != nullptr);<br>
// Give the watcher thread the same priority as ours to avoid being<br>
// blocked by it.<br>
::SetThreadPriority(watcher_thread,<br>
@@ -587,7 +670,9 @@ class ThreadLocalRegistryImpl {<br>
// Returns map of thread local instances.<br>
static ThreadIdToThreadLocals* GetThreadLocalsMapLocked() {<br>
mutex_.AssertHeld();<br>
+#ifdef _MSC_VER<br>
MemoryIsNotDeallocated memory_is_not_deallocated;<br>
+#endif // _MSC_VER<br>
static ThreadIdToThreadLocals* map = new ThreadIdToThreadLocals();<br>
return map;<br>
}<br>
@@ -630,7 +715,7 @@ RE::~RE() {<br>
free(const_cast<char*>(pattern_));<br>
}<br>
<br>
-// Returns true iff regular expression re matches the entire str.<br>
+// Returns true if and only if regular expression re matches the entire str.<br>
bool RE::FullMatch(const char* str, const RE& re) {<br>
if (!re.is_valid_) return false;<br>
<br>
@@ -638,8 +723,8 @@ bool RE::FullMatch(const char* str, const RE& re) {<br>
return regexec(&re.full_regex_, str, 1, &match, 0) == 0;<br>
}<br>
<br>
-// Returns true iff regular expression re matches a substring of str<br>
-// (including str itself).<br>
+// Returns true if and only if regular expression re matches a substring of<br>
+// str (including str itself).<br>
bool RE::PartialMatch(const char* str, const RE& re) {<br>
if (!re.is_valid_) return false;<br>
<br>
@@ -679,14 +764,14 @@ void RE::Init(const char* regex) {<br>
<br>
#elif GTEST_USES_SIMPLE_RE<br>
<br>
-// Returns true iff ch appears anywhere in str (excluding the<br>
+// Returns true if and only if ch appears anywhere in str (excluding the<br>
// terminating '\0' character).<br>
bool IsInSet(char ch, const char* str) {<br>
- return ch != '\0' && strchr(str, ch) != NULL;<br>
+ return ch != '\0' && strchr(str, ch) != nullptr;<br>
}<br>
<br>
-// Returns true iff ch belongs to the given classification. Unlike<br>
-// similar functions in <ctype.h>, these aren't affected by the<br>
+// Returns true if and only if ch belongs to the given classification.<br>
+// Unlike similar functions in <ctype.h>, these aren't affected by the<br>
// current locale.<br>
bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }<br>
bool IsAsciiPunct(char ch) {<br>
@@ -699,13 +784,13 @@ bool IsAsciiWordChar(char ch) {<br>
('0' <= ch && ch <= '9') || ch == '_';<br>
}<br>
<br>
-// Returns true iff "\\c" is a supported escape sequence.<br>
+// Returns true if and only if "\\c" is a supported escape sequence.<br>
bool IsValidEscape(char c) {<br>
return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));<br>
}<br>
<br>
-// Returns true iff the given atom (specified by escaped and pattern)<br>
-// matches ch. The result is undefined if the atom is invalid.<br>
+// Returns true if and only if the given atom (specified by escaped and<br>
+// pattern) matches ch. The result is undefined if the atom is invalid.<br>
bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {<br>
if (escaped) { // "\\p" where p is pattern_char.<br>
switch (pattern_char) {<br>
@@ -736,17 +821,14 @@ static std::string FormatRegexSyntaxError(const char* regex, int index) {<br>
// Generates non-fatal failures and returns false if regex is invalid;<br>
// otherwise returns true.<br>
bool ValidateRegex(const char* regex) {<br>
- if (regex == NULL) {<br>
- // FIXME: fix the source file location in the<br>
- // assertion failures to match where the regex is used in user<br>
- // code.<br>
+ if (regex == nullptr) {<br>
ADD_FAILURE() << "NULL is not a valid simple regular expression.";<br>
return false;<br>
}<br>
<br>
bool is_valid = true;<br>
<br>
- // True iff ?, *, or + can follow the previous atom.<br>
+ // True if and only if ?, *, or + can follow the previous atom.<br>
bool prev_repeatable = false;<br>
for (int i = 0; regex[i]; i++) {<br>
if (regex[i] == '\\') { // An escape sequence<br>
@@ -822,8 +904,8 @@ bool MatchRepetitionAndRegexAtHead(<br>
return false;<br>
}<br>
<br>
-// Returns true iff regex matches a prefix of str. regex must be a<br>
-// valid simple regular expression and not start with "^", or the<br>
+// Returns true if and only if regex matches a prefix of str. regex must<br>
+// be a valid simple regular expression and not start with "^", or the<br>
// result is undefined.<br>
bool MatchRegexAtHead(const char* regex, const char* str) {<br>
if (*regex == '\0') // An empty regex matches a prefix of anything.<br>
@@ -853,8 +935,8 @@ bool MatchRegexAtHead(const char* regex, const char* str) {<br>
}<br>
}<br>
<br>
-// Returns true iff regex matches any substring of str. regex must be<br>
-// a valid simple regular expression, or the result is undefined.<br>
+// Returns true if and only if regex matches any substring of str. regex must<br>
+// be a valid simple regular expression, or the result is undefined.<br>
//<br>
// The algorithm is recursive, but the recursion depth doesn't exceed<br>
// the regex length, so we won't need to worry about running out of<br>
@@ -862,8 +944,7 @@ bool MatchRegexAtHead(const char* regex, const char* str) {<br>
// exponential with respect to the regex length + the string length,<br>
// but usually it's must faster (often close to linear).<br>
bool MatchRegexAnywhere(const char* regex, const char* str) {<br>
- if (regex == NULL || str == NULL)<br>
- return false;<br>
+ if (regex == nullptr || str == nullptr) return false;<br>
<br>
if (*regex == '^')<br>
return MatchRegexAtHead(regex + 1, str);<br>
@@ -883,21 +964,21 @@ RE::~RE() {<br>
free(const_cast<char*>(full_pattern_));<br>
}<br>
<br>
-// Returns true iff regular expression re matches the entire str.<br>
+// Returns true if and only if regular expression re matches the entire str.<br>
bool RE::FullMatch(const char* str, const RE& re) {<br>
return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);<br>
}<br>
<br>
-// Returns true iff regular expression re matches a substring of str<br>
-// (including str itself).<br>
+// Returns true if and only if regular expression re matches a substring of<br>
+// str (including str itself).<br>
bool RE::PartialMatch(const char* str, const RE& re) {<br>
return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);<br>
}<br>
<br>
// Initializes an RE from its string representation.<br>
void RE::Init(const char* regex) {<br>
- pattern_ = full_pattern_ = NULL;<br>
- if (regex != NULL) {<br>
+ pattern_ = full_pattern_ = nullptr;<br>
+ if (regex != nullptr) {<br>
pattern_ = posix::StrDup(regex);<br>
}<br>
<br>
@@ -935,7 +1016,7 @@ const char kUnknownFile[] = "unknown file";<br>
// Formats a source file path and a line number as they would appear<br>
// in an error message from the compiler used to compile this code.<br>
GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {<br>
- const std::string file_name(file == NULL ? kUnknownFile : file);<br>
+ const std::string file_name(file == nullptr ? kUnknownFile : file);<br>
<br>
if (line < 0) {<br>
return file_name + ":";<br>
@@ -954,7 +1035,7 @@ GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {<br>
// to the file location it produces, unlike FormatFileLocation().<br>
GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(<br>
const char* file, int line) {<br>
- const std::string file_name(file == NULL ? kUnknownFile : file);<br>
+ const std::string file_name(file == nullptr ? kUnknownFile : file);<br>
<br>
if (line < 0)<br>
return file_name;<br>
@@ -1021,20 +1102,22 @@ class CapturedStream {<br>
// code as part of a regular standalone executable, which doesn't<br>
// run in a Dalvik process (e.g. when running it through 'adb shell').<br>
//<br>
- // The location /sdcard is directly accessible from native code<br>
- // and is the only location (unofficially) supported by the Android<br>
- // team. It's generally a symlink to the real SD Card mount point<br>
- // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or<br>
- // other OEM-customized locations. Never rely on these, and always<br>
- // use /sdcard.<br>
- char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX";<br>
+ // The location /data/local/tmp is directly accessible from native code.<br>
+ // '/sdcard' and other variants cannot be relied on, as they are not<br>
+ // guaranteed to be mounted, or may have a delay in mounting.<br>
+ char name_template[] = "/data/local/tmp/gtest_captured_stream.XXXXXX";<br>
# else<br>
char name_template[] = "/tmp/captured_stream.XXXXXX";<br>
# endif // GTEST_OS_LINUX_ANDROID<br>
const int captured_fd = mkstemp(name_template);<br>
+ if (captured_fd == -1) {<br>
+ GTEST_LOG_(WARNING)<br>
+ << "Failed to create tmp file " << name_template<br>
+ << " for test; does the test have access to the /tmp directory?";<br>
+ }<br>
filename_ = name_template;<br>
# endif // GTEST_OS_WINDOWS<br>
- fflush(NULL);<br>
+ fflush(nullptr);<br>
dup2(captured_fd, fd_);<br>
close(captured_fd);<br>
}<br>
@@ -1046,13 +1129,17 @@ class CapturedStream {<br>
std::string GetCapturedString() {<br>
if (uncaptured_fd_ != -1) {<br>
// Restores the original stream.<br>
- fflush(NULL);<br>
+ fflush(nullptr);<br>
dup2(uncaptured_fd_, fd_);<br>
close(uncaptured_fd_);<br>
uncaptured_fd_ = -1;<br>
}<br>
<br>
FILE* const file = posix::FOpen(filename_.c_str(), "r");<br>
+ if (file == nullptr) {<br>
+ GTEST_LOG_(FATAL) << "Failed to open tmp file " << filename_<br>
+ << " for capturing stream.";<br>
+ }<br>
const std::string content = ReadEntireFile(file);<br>
posix::FClose(file);<br>
return content;<br>
@@ -1069,13 +1156,13 @@ class CapturedStream {<br>
<br>
GTEST_DISABLE_MSC_DEPRECATED_POP_()<br>
<br>
-static CapturedStream* g_captured_stderr = NULL;<br>
-static CapturedStream* g_captured_stdout = NULL;<br>
+static CapturedStream* g_captured_stderr = nullptr;<br>
+static CapturedStream* g_captured_stdout = nullptr;<br>
<br>
// Starts capturing an output stream (stdout/stderr).<br>
static void CaptureStream(int fd, const char* stream_name,<br>
CapturedStream** stream) {<br>
- if (*stream != NULL) {<br>
+ if (*stream != nullptr) {<br>
GTEST_LOG_(FATAL) << "Only one " << stream_name<br>
<< " capturer can exist at a time.";<br>
}<br>
@@ -1087,7 +1174,7 @@ static std::string GetCapturedStream(CapturedStream** captured_stream) {<br>
const std::string content = (*captured_stream)->GetCapturedString();<br>
<br>
delete *captured_stream;<br>
- *captured_stream = NULL;<br>
+ *captured_stream = nullptr;<br>
<br>
return content;<br>
}<br>
@@ -1146,10 +1233,11 @@ std::string ReadEntireFile(FILE* file) {<br>
}<br>
<br>
#if GTEST_HAS_DEATH_TEST<br>
-static const std::vector<std::string>* g_injected_test_argvs = NULL; // Owned.<br>
+static const std::vector<std::string>* g_injected_test_argvs =<br>
+ nullptr; // Owned.<br>
<br>
std::vector<std::string> GetInjectableArgvs() {<br>
- if (g_injected_test_argvs != NULL) {<br>
+ if (g_injected_test_argvs != nullptr) {<br>
return *g_injected_test_argvs;<br>
}<br>
return GetArgvs();<br>
@@ -1165,16 +1253,9 @@ void SetInjectableArgvs(const std::vector<std::string>& new_argvs) {<br>
new std::vector<std::string>(new_argvs.begin(), new_argvs.end()));<br>
}<br>
<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-void SetInjectableArgvs(const std::vector< ::string>& new_argvs) {<br>
- SetInjectableArgvs(<br>
- new std::vector<std::string>(new_argvs.begin(), new_argvs.end()));<br>
-}<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
void ClearInjectableArgvs() {<br>
delete g_injected_test_argvs;<br>
- g_injected_test_argvs = NULL;<br>
+ g_injected_test_argvs = nullptr;<br>
}<br>
#endif // GTEST_HAS_DEATH_TEST<br>
<br>
@@ -1207,7 +1288,7 @@ static std::string FlagToEnvVar(const char* flag) {<br>
// unchanged and returns false.<br>
bool ParseInt32(const Message& src_text, const char* str, Int32* value) {<br>
// Parses the environment variable as a decimal integer.<br>
- char* end = NULL;<br>
+ char* end = nullptr;<br>
const long long_value = strtol(str, &end, 10); // NOLINT<br>
<br>
// Has strtol() consumed all characters in the string?<br>
@@ -1246,15 +1327,15 @@ bool ParseInt32(const Message& src_text, const char* str, Int32* value) {<br>
// Reads and returns the Boolean environment variable corresponding to<br>
// the given flag; if it's not set, returns default_value.<br>
//<br>
-// The value is considered true iff it's not "0".<br>
+// The value is considered true if and only if it's not "0".<br>
bool BoolFromGTestEnv(const char* flag, bool default_value) {<br>
#if defined(GTEST_GET_BOOL_FROM_ENV_)<br>
return GTEST_GET_BOOL_FROM_ENV_(flag, default_value);<br>
#else<br>
const std::string env_var = FlagToEnvVar(flag);<br>
const char* const string_value = posix::GetEnv(env_var.c_str());<br>
- return string_value == NULL ?<br>
- default_value : strcmp(string_value, "0") != 0;<br>
+ return string_value == nullptr ? default_value<br>
+ : strcmp(string_value, "0") != 0;<br>
#endif // defined(GTEST_GET_BOOL_FROM_ENV_)<br>
}<br>
<br>
@@ -1267,7 +1348,7 @@ Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {<br>
#else<br>
const std::string env_var = FlagToEnvVar(flag);<br>
const char* const string_value = posix::GetEnv(env_var.c_str());<br>
- if (string_value == NULL) {<br>
+ if (string_value == nullptr) {<br>
// The environment variable is not set.<br>
return default_value;<br>
}<br>
@@ -1296,7 +1377,7 @@ Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {<br>
std::string OutputFlagAlsoCheckEnvVar(){<br>
std::string default_value_for_output_flag = "";<br>
const char* xml_output_file_env = posix::GetEnv("XML_OUTPUT_FILE");<br>
- if (NULL != xml_output_file_env) {<br>
+ if (nullptr != xml_output_file_env) {<br>
default_value_for_output_flag = std::string("xml:") + xml_output_file_env;<br>
}<br>
return default_value_for_output_flag;<br>
@@ -1310,7 +1391,7 @@ const char* StringFromGTestEnv(const char* flag, const char* default_value) {<br>
#else<br>
const std::string env_var = FlagToEnvVar(flag);<br>
const char* const value = posix::GetEnv(env_var.c_str());<br>
- return value == NULL ? default_value : value;<br>
+ return value == nullptr ? default_value : value;<br>
#endif // defined(GTEST_GET_STRING_FROM_ENV_)<br>
}<br>
<br>
<br>
diff --git a/llvm/utils/unittest/googletest/src/gtest-printers.cc b/llvm/utils/unittest/googletest/src/gtest-printers.cc<br>
index de4d245e9fc88..3337be312ea40 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-printers.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-printers.cc<br>
@@ -59,6 +59,7 @@ using ::std::ostream;<br>
// Prints a segment of bytes in the given object.<br>
GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_<br>
GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_<br>
+GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_<br>
GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_<br>
void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,<br>
size_t count, ostream* os) {<br>
@@ -89,7 +90,6 @@ void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,<br>
// If the object size is bigger than kThreshold, we'll have to omit<br>
// some details by printing only the first and the last kChunkSize<br>
// bytes.<br>
- // FIXME: let the user control the threshold using a flag.<br>
if (count < kThreshold) {<br>
PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);<br>
} else {<br>
@@ -144,7 +144,8 @@ inline bool IsPrintableAscii(wchar_t c) {<br>
// which is the type of c.<br>
template <typename UnsignedChar, typename Char><br>
static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {<br>
- switch (static_cast<wchar_t>(c)) {<br>
+ wchar_t w_c = static_cast<wchar_t>(c);<br>
+ switch (w_c) {<br>
case L'\0':<br>
*os << "\\0";<br>
break;<br>
@@ -176,7 +177,7 @@ static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {<br>
*os << "\\v";<br>
break;<br>
default:<br>
- if (IsPrintableAscii(c)) {<br>
+ if (IsPrintableAscii(w_c)) {<br>
*os << static_cast<char>(c);<br>
return kAsIs;<br>
} else {<br>
@@ -236,7 +237,7 @@ void PrintCharAndCodeTo(Char c, ostream* os) {<br>
if (format == kHexEscape || (1 <= c && c <= 9)) {<br>
// Do nothing.<br>
} else {<br>
- *os << ", 0x" << String::FormatHexInt(static_cast<UnsignedChar>(c));<br>
+ *os << ", 0x" << String::FormatHexInt(static_cast<int>(c));<br>
}<br>
*os << ")";<br>
}<br>
@@ -261,6 +262,7 @@ void PrintTo(wchar_t wc, ostream* os) {<br>
template <typename CharType><br>
GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_<br>
GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_<br>
+GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_<br>
GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_<br>
static CharFormat PrintCharsAsStringTo(<br>
const CharType* begin, size_t len, ostream* os) {<br>
@@ -291,6 +293,7 @@ static CharFormat PrintCharsAsStringTo(<br>
template <typename CharType><br>
GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_<br>
GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_<br>
+GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_<br>
GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_<br>
static void UniversalPrintCharArray(<br>
const CharType* begin, size_t len, ostream* os) {<br>
@@ -327,7 +330,7 @@ void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {<br>
<br>
// Prints the given C string to the ostream.<br>
void PrintTo(const char* s, ostream* os) {<br>
- if (s == NULL) {<br>
+ if (s == nullptr) {<br>
*os << "NULL";<br>
} else {<br>
*os << ImplicitCast_<const void*>(s) << " pointing to ";<br>
@@ -344,11 +347,11 @@ void PrintTo(const char* s, ostream* os) {<br>
#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)<br>
// Prints the given wide C string to the ostream.<br>
void PrintTo(const wchar_t* s, ostream* os) {<br>
- if (s == NULL) {<br>
+ if (s == nullptr) {<br>
*os << "NULL";<br>
} else {<br>
*os << ImplicitCast_<const void*>(s) << " pointing to ";<br>
- PrintCharsAsStringTo(s, std::wcslen(s), os);<br>
+ PrintCharsAsStringTo(s, wcslen(s), os);<br>
}<br>
}<br>
#endif // wchar_t is native<br>
@@ -420,17 +423,6 @@ void ConditionalPrintAsText(const char* str, size_t length, ostream* os) {<br>
<br>
} // anonymous namespace<br>
<br>
-// Prints a ::string object.<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-void PrintStringTo(const ::string& s, ostream* os) {<br>
- if (PrintCharsAsStringTo(s.data(), s.size(), os) == kHexEscape) {<br>
- if (GTEST_FLAG(print_utf8)) {<br>
- ConditionalPrintAsText(s.data(), s.size(), os);<br>
- }<br>
- }<br>
-}<br>
-#endif // GTEST_HAS_GLOBAL_STRING<br>
-<br>
void PrintStringTo(const ::std::string& s, ostream* os) {<br>
if (PrintCharsAsStringTo(s.data(), s.size(), os) == kHexEscape) {<br>
if (GTEST_FLAG(print_utf8)) {<br>
@@ -439,13 +431,6 @@ void PrintStringTo(const ::std::string& s, ostream* os) {<br>
}<br>
}<br>
<br>
-// Prints a ::wstring object.<br>
-#if GTEST_HAS_GLOBAL_WSTRING<br>
-void PrintWideStringTo(const ::wstring& s, ostream* os) {<br>
- PrintCharsAsStringTo(s.data(), s.size(), os);<br>
-}<br>
-#endif // GTEST_HAS_GLOBAL_WSTRING<br>
-<br>
#if GTEST_HAS_STD_WSTRING<br>
void PrintWideStringTo(const ::std::wstring& s, ostream* os) {<br>
PrintCharsAsStringTo(s.data(), s.size(), os);<br>
<br>
diff --git a/llvm/utils/unittest/googletest/src/gtest-test-part.cc b/llvm/utils/unittest/googletest/src/gtest-test-part.cc<br>
index c88860d923856..178317a6bcdbd 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-test-part.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-test-part.cc<br>
@@ -41,18 +41,21 @@ using internal::GetUnitTestImpl;<br>
// in it.<br>
std::string TestPartResult::ExtractSummary(const char* message) {<br>
const char* const stack_trace = strstr(message, internal::kStackTraceMarker);<br>
- return stack_trace == NULL ? message :<br>
- std::string(message, stack_trace);<br>
+ return stack_trace == nullptr ? message : std::string(message, stack_trace);<br>
}<br>
<br>
// Prints a TestPartResult object.<br>
std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {<br>
- return os<br>
- << result.file_name() << ":" << result.line_number() << ": "<br>
- << (result.type() == TestPartResult::kSuccess ? "Success" :<br>
- result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :<br>
- "Non-fatal failure") << ":\n"<br>
- << result.message() << std::endl;<br>
+ return os << result.file_name() << ":" << result.line_number() << ": "<br>
+ << (result.type() == TestPartResult::kSuccess<br>
+ ? "Success"<br>
+ : result.type() == TestPartResult::kSkip<br>
+ ? "Skipped"<br>
+ : result.type() == TestPartResult::kFatalFailure<br>
+ ? "Fatal failure"<br>
+ : "Non-fatal failure")<br>
+ << ":\n"<br>
+ << result.message() << std::endl;<br>
}<br>
<br>
// Appends a TestPartResult to the array.<br>
@@ -67,7 +70,7 @@ const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {<br>
internal::posix::Abort();<br>
}<br>
<br>
- return array_[index];<br>
+ return array_[static_cast<size_t>(index)];<br>
}<br>
<br>
// Returns the number of TestPartResult objects in the array.<br>
<br>
diff --git a/llvm/utils/unittest/googletest/src/gtest-typed-test.cc b/llvm/utils/unittest/googletest/src/gtest-typed-test.cc<br>
index 1dc2ad38bab98..8677caf732b42 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-typed-test.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-typed-test.cc<br>
@@ -48,7 +48,7 @@ static const char* SkipSpaces(const char* str) {<br>
static std::vector<std::string> SplitIntoTestNames(const char* src) {<br>
std::vector<std::string> name_vec;<br>
src = SkipSpaces(src);<br>
- for (; src != NULL; src = SkipComma(src)) {<br>
+ for (; src != nullptr; src = SkipComma(src)) {<br>
name_vec.push_back(StripTrailingSpaces(GetPrefixUntilComma(src)));<br>
}<br>
return name_vec;<br>
@@ -57,7 +57,7 @@ static std::vector<std::string> SplitIntoTestNames(const char* src) {<br>
// Verifies that registered_tests match the test names in<br>
// registered_tests_; returns registered_tests if successful, or<br>
// aborts the program otherwise.<br>
-const char* TypedTestCasePState::VerifyRegisteredTestNames(<br>
+const char* TypedTestSuitePState::VerifyRegisteredTestNames(<br>
const char* file, int line, const char* registered_tests) {<br>
typedef RegisteredTestsMap::const_iterator RegisteredTestIter;<br>
registered_ = true;<br>
@@ -89,7 +89,7 @@ const char* TypedTestCasePState::VerifyRegisteredTestNames(<br>
tests.insert(name);<br>
} else {<br>
errors << "No test named " << name<br>
- << " can be found in this test case.\n";<br>
+ << " can be found in this test suite.\n";<br>
}<br>
}<br>
<br>
<br>
diff --git a/llvm/utils/unittest/googletest/src/gtest.cc b/llvm/utils/unittest/googletest/src/gtest.cc<br>
index 96b07c68abb05..a5b4e5ac78ca1 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest.cc<br>
@@ -54,8 +54,6 @@<br>
<br>
#if GTEST_OS_LINUX<br>
<br>
-// FIXME: Use autoconf to detect availability of<br>
-// gettimeofday().<br>
# define GTEST_HAS_GETTIMEOFDAY_ 1<br>
<br>
# include <fcntl.h> // NOLINT<br>
@@ -68,10 +66,6 @@<br>
# include <unistd.h> // NOLINT<br>
# include <string><br>
<br>
-#elif GTEST_OS_SYMBIAN<br>
-# define GTEST_HAS_GETTIMEOFDAY_ 1<br>
-# include <sys/time.h> // NOLINT<br>
-<br>
#elif GTEST_OS_ZOS<br>
# define GTEST_HAS_GETTIMEOFDAY_ 1<br>
# include <sys/time.h> // NOLINT<br>
@@ -86,6 +80,11 @@<br>
<br>
#elif GTEST_OS_WINDOWS // We are on Windows proper.<br>
<br>
+# include <windows.h> // NOLINT<br>
+# undef min<br>
+<br>
+# include <crtdbg.h> // NOLINT<br>
+# include <debugapi.h> // NOLINT<br>
# include <io.h> // NOLINT<br>
# include <sys/timeb.h> // NOLINT<br>
# include <sys/types.h> // NOLINT<br>
@@ -93,25 +92,13 @@<br>
<br>
# if GTEST_OS_WINDOWS_MINGW<br>
// MinGW has gettimeofday() but not _ftime64().<br>
-// FIXME: Use autoconf to detect availability of<br>
-// gettimeofday().<br>
-// FIXME: There are other ways to get the time on<br>
-// Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW<br>
-// supports these. consider using them instead.<br>
# define GTEST_HAS_GETTIMEOFDAY_ 1<br>
# include <sys/time.h> // NOLINT<br>
# endif // GTEST_OS_WINDOWS_MINGW<br>
<br>
-// cpplint thinks that the header is already included, so we want to<br>
-// silence it.<br>
-# include <windows.h> // NOLINT<br>
-# undef min<br>
-<br>
#else<br>
<br>
// Assume other platforms have gettimeofday().<br>
-// FIXME: Use autoconf to detect availability of<br>
-// gettimeofday().<br>
# define GTEST_HAS_GETTIMEOFDAY_ 1<br>
<br>
// cpplint thinks that the header is already included, so we want to<br>
@@ -160,14 +147,14 @@ using internal::Shuffle;<br>
<br>
// Constants.<br>
<br>
-// A test whose test case name or test name matches this filter is<br>
+// A test whose test suite name or test name matches this filter is<br>
// disabled and not run.<br>
static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";<br>
<br>
-// A test case whose name matches this filter is considered a death<br>
-// test case and will be run before test cases whose name doesn't<br>
+// A test suite whose name matches this filter is considered a death<br>
+// test suite and will be run before test suites whose name doesn't<br>
// match this filter.<br>
-static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";<br>
+static const char kDeathTestSuiteFilter[] = "*DeathTest:*DeathTest/*";<br>
<br>
// A test filter that matches everything.<br>
static const char kUniversalFilter[] = "*";<br>
@@ -190,20 +177,20 @@ namespace internal {<br>
// stack trace.<br>
const char kStackTraceMarker[] = "\nStack trace:\n";<br>
<br>
-// g_help_flag is true iff the --help flag or an equivalent form is<br>
-// specified on the command line.<br>
+// g_help_flag is true if and only if the --help flag or an equivalent form<br>
+// is specified on the command line.<br>
bool g_help_flag = false;<br>
<br>
// Utilty function to Open File for Writing<br>
static FILE* OpenFileForWriting(const std::string& output_file) {<br>
- FILE* fileout = NULL;<br>
+ FILE* fileout = nullptr;<br>
FilePath output_file_path(output_file);<br>
FilePath output_dir(output_file_path.RemoveFileName());<br>
<br>
if (output_dir.CreateDirectoriesRecursively()) {<br>
fileout = posix::FOpen(output_file.c_str(), "w");<br>
}<br>
- if (fileout == NULL) {<br>
+ if (fileout == nullptr) {<br>
GTEST_LOG_(FATAL) << "Unable to open file \"" << output_file << "\"";<br>
}<br>
return fileout;<br>
@@ -216,7 +203,7 @@ static FILE* OpenFileForWriting(const std::string& output_file) {<br>
static const char* GetDefaultFilter() {<br>
const char* const testbridge_test_only =<br>
internal::posix::GetEnv("TESTBRIDGE_TEST_ONLY");<br>
- if (testbridge_test_only != NULL) {<br>
+ if (testbridge_test_only != nullptr) {<br>
return testbridge_test_only;<br>
}<br>
return kUniversalFilter;<br>
@@ -228,15 +215,14 @@ GTEST_DEFINE_bool_(<br>
"Run disabled tests too, in addition to the tests normally being run.");<br>
<br>
GTEST_DEFINE_bool_(<br>
- break_on_failure,<br>
- internal::BoolFromGTestEnv("break_on_failure", false),<br>
- "True iff a failed assertion should be a debugger break-point.");<br>
+ break_on_failure, internal::BoolFromGTestEnv("break_on_failure", false),<br>
+ "True if and only if a failed assertion should be a debugger "<br>
+ "break-point.");<br>
<br>
-GTEST_DEFINE_bool_(<br>
- catch_exceptions,<br>
- internal::BoolFromGTestEnv("catch_exceptions", true),<br>
- "True iff " GTEST_NAME_<br>
- " should catch exceptions and treat them as test failures.");<br>
+GTEST_DEFINE_bool_(catch_exceptions,<br>
+ internal::BoolFromGTestEnv("catch_exceptions", true),<br>
+ "True if and only if " GTEST_NAME_<br>
+ " should catch exceptions and treat them as test failures.");<br>
<br>
GTEST_DEFINE_string_(<br>
color,<br>
@@ -283,17 +269,13 @@ GTEST_DEFINE_string_(<br>
"executable's name and, if necessary, made unique by adding "<br>
"digits.");<br>
<br>
-GTEST_DEFINE_bool_(<br>
- print_time,<br>
- internal::BoolFromGTestEnv("print_time", true),<br>
- "True iff " GTEST_NAME_<br>
- " should display elapsed time in text output.");<br>
+GTEST_DEFINE_bool_(print_time, internal::BoolFromGTestEnv("print_time", true),<br>
+ "True if and only if " GTEST_NAME_<br>
+ " should display elapsed time in text output.");<br>
<br>
-GTEST_DEFINE_bool_(<br>
- print_utf8,<br>
- internal::BoolFromGTestEnv("print_utf8", true),<br>
- "True iff " GTEST_NAME_<br>
- " prints UTF8 characters as text.");<br>
+GTEST_DEFINE_bool_(print_utf8, internal::BoolFromGTestEnv("print_utf8", true),<br>
+ "True if and only if " GTEST_NAME_<br>
+ " prints UTF8 characters as text.");<br>
<br>
GTEST_DEFINE_int32_(<br>
random_seed,<br>
@@ -307,16 +289,14 @@ GTEST_DEFINE_int32_(<br>
"How many times to repeat each test. Specify a negative number "<br>
"for repeating forever. Useful for shaking out flaky tests.");<br>
<br>
-GTEST_DEFINE_bool_(<br>
- show_internal_stack_frames, false,<br>
- "True iff " GTEST_NAME_ " should include internal stack frames when "<br>
- "printing test failure stack traces.");<br>
+GTEST_DEFINE_bool_(show_internal_stack_frames, false,<br>
+ "True if and only if " GTEST_NAME_<br>
+ " should include internal stack frames when "<br>
+ "printing test failure stack traces.");<br>
<br>
-GTEST_DEFINE_bool_(<br>
- shuffle,<br>
- internal::BoolFromGTestEnv("shuffle", false),<br>
- "True iff " GTEST_NAME_<br>
- " should randomize tests' order on every run.");<br>
+GTEST_DEFINE_bool_(shuffle, internal::BoolFromGTestEnv("shuffle", false),<br>
+ "True if and only if " GTEST_NAME_<br>
+ " should randomize tests' order on every run.");<br>
<br>
GTEST_DEFINE_int32_(<br>
stack_trace_depth,<br>
@@ -367,16 +347,16 @@ UInt32 Random::Generate(UInt32 range) {<br>
return state_ % range;<br>
}<br>
<br>
-// GTestIsInitialized() returns true iff the user has initialized<br>
+// GTestIsInitialized() returns true if and only if the user has initialized<br>
// Google Test. Useful for catching the user mistake of not initializing<br>
// Google Test before calling RUN_ALL_TESTS().<br>
static bool GTestIsInitialized() { return GetArgvs().size() > 0; }<br>
<br>
-// Iterates over a vector of TestCases, keeping a running sum of the<br>
+// Iterates over a vector of TestSuites, keeping a running sum of the<br>
// results of calling a given int-returning method on each.<br>
// Returns the sum.<br>
-static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,<br>
- int (TestCase::*method)() const) {<br>
+static int SumOverTestSuiteList(const std::vector<TestSuite*>& case_list,<br>
+ int (TestSuite::*method)() const) {<br>
int sum = 0;<br>
for (size_t i = 0; i < case_list.size(); i++) {<br>
sum += (case_list[i]->*method)();<br>
@@ -384,20 +364,20 @@ static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,<br>
return sum;<br>
}<br>
<br>
-// Returns true iff the test case passed.<br>
-static bool TestCasePassed(const TestCase* test_case) {<br>
- return test_case->should_run() && test_case->Passed();<br>
+// Returns true if and only if the test suite passed.<br>
+static bool TestSuitePassed(const TestSuite* test_suite) {<br>
+ return test_suite->should_run() && test_suite->Passed();<br>
}<br>
<br>
-// Returns true iff the test case failed.<br>
-static bool TestCaseFailed(const TestCase* test_case) {<br>
- return test_case->should_run() && test_case->Failed();<br>
+// Returns true if and only if the test suite failed.<br>
+static bool TestSuiteFailed(const TestSuite* test_suite) {<br>
+ return test_suite->should_run() && test_suite->Failed();<br>
}<br>
<br>
-// Returns true iff test_case contains at least one test that should<br>
-// run.<br>
-static bool ShouldRunTestCase(const TestCase* test_case) {<br>
- return test_case->should_run();<br>
+// Returns true if and only if test_suite contains at least one test that<br>
+// should run.<br>
+static bool ShouldRunTestSuite(const TestSuite* test_suite) {<br>
+ return test_suite->should_run();<br>
}<br>
<br>
// AssertHelper constructor.<br>
@@ -423,9 +403,6 @@ void AssertHelper::operator=(const Message& message) const {<br>
); // NOLINT<br>
}<br>
<br>
-// Mutex for linked pointers.<br>
-GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);<br>
-<br>
// A copy of all command line arguments. Set by InitGoogleTest().<br>
static ::std::vector<std::string> g_argvs;<br>
<br>
@@ -445,7 +422,7 @@ ::std::vector<std::string> GetArgvs() {<br>
FilePath GetCurrentExecutableName() {<br>
FilePath result;<br>
<br>
-#if GTEST_OS_WINDOWS<br>
+#if GTEST_OS_WINDOWS || GTEST_OS_OS2<br>
result.Set(FilePath(GetArgvs()[0]).RemoveExtension("exe"));<br>
#else<br>
result.Set(FilePath(GetArgvs()[0]));<br>
@@ -460,9 +437,10 @@ FilePath GetCurrentExecutableName() {<br>
std::string UnitTestOptions::GetOutputFormat() {<br>
const char* const gtest_output_flag = GTEST_FLAG(output).c_str();<br>
const char* const colon = strchr(gtest_output_flag, ':');<br>
- return (colon == NULL) ?<br>
- std::string(gtest_output_flag) :<br>
- std::string(gtest_output_flag, colon - gtest_output_flag);<br>
+ return (colon == nullptr)<br>
+ ? std::string(gtest_output_flag)<br>
+ : std::string(gtest_output_flag,<br>
+ static_cast<size_t>(colon - gtest_output_flag));<br>
}<br>
<br>
// Returns the name of the requested output file, or the default if none<br>
@@ -475,7 +453,7 @@ std::string UnitTestOptions::GetAbsolutePathToOutputFile() {<br>
format = std::string(kDefaultOutputFormat);<br>
<br>
const char* const colon = strchr(gtest_output_flag, ':');<br>
- if (colon == NULL)<br>
+ if (colon == nullptr)<br>
return internal::FilePath::MakeFileName(<br>
internal::FilePath(<br>
UnitTest::GetInstance()->original_working_dir()),<br>
@@ -484,10 +462,6 @@ std::string UnitTestOptions::GetAbsolutePathToOutputFile() {<br>
<br>
internal::FilePath output_name(colon + 1);<br>
if (!output_name.IsAbsolutePath())<br>
- // FIXME: on Windows \some\path is not an absolute<br>
- // path (as its meaning depends on the current drive), yet the<br>
- // following logic for turning it into an absolute path is wrong.<br>
- // Fix it.<br>
output_name = internal::FilePath::ConcatPaths(<br>
internal::FilePath(UnitTest::GetInstance()->original_working_dir()),<br>
internal::FilePath(colon + 1));<br>
@@ -501,8 +475,8 @@ std::string UnitTestOptions::GetAbsolutePathToOutputFile() {<br>
return result.string();<br>
}<br>
<br>
-// Returns true iff the wildcard pattern matches the string. The<br>
-// first ':' or '\0' character in pattern marks the end of it.<br>
+// Returns true if and only if the wildcard pattern matches the string.<br>
+// The first ':' or '\0' character in pattern marks the end of it.<br>
//<br>
// This recursive algorithm isn't very efficient, but is clear and<br>
// works well enough for matching test names, which are short.<br>
@@ -535,7 +509,7 @@ bool UnitTestOptions::MatchesFilter(<br>
cur_pattern = strchr(cur_pattern, ':');<br>
<br>
// Returns if no more pattern can be found.<br>
- if (cur_pattern == NULL) {<br>
+ if (cur_pattern == nullptr) {<br>
return false;<br>
}<br>
<br>
@@ -544,11 +518,11 @@ bool UnitTestOptions::MatchesFilter(<br>
}<br>
}<br>
<br>
-// Returns true iff the user-specified filter matches the test case<br>
-// name and the test name.<br>
-bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,<br>
- const std::string &test_name) {<br>
- const std::string& full_name = test_case_name + "." + test_name.c_str();<br>
+// Returns true if and only if the user-specified filter matches the test<br>
+// suite name and the test name.<br>
+bool UnitTestOptions::FilterMatchesTest(const std::string& test_suite_name,<br>
+ const std::string& test_name) {<br>
+ const std::string& full_name = test_suite_name + "." + test_name.c_str();<br>
<br>
// Split --gtest_filter at '-', if there is one, to separate into<br>
// positive filter and negative filter portions<br>
@@ -556,7 +530,7 @@ bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,<br>
const char* const dash = strchr(p, '-');<br>
std::string positive;<br>
std::string negative;<br>
- if (dash == NULL) {<br>
+ if (dash == nullptr) {<br>
positive = GTEST_FLAG(filter).c_str(); // Whole string is a positive filter<br>
negative = "";<br>
} else {<br>
@@ -701,7 +675,7 @@ static AssertionResult HasOneFailure(const char* /* results_expr */,<br>
<< r;<br>
}<br>
<br>
- if (strstr(r.message(), substr.c_str()) == NULL) {<br>
+ if (strstr(r.message(), substr.c_str()) == nullptr) {<br>
return AssertionFailure() << "Expected: " << expected << " containing \""<br>
<< substr << "\"\n"<br>
<< " Actual:\n"<br>
@@ -770,61 +744,66 @@ void UnitTestImpl::SetTestPartResultReporterForCurrentThread(<br>
per_thread_test_part_result_reporter_.set(reporter);<br>
}<br>
<br>
-// Gets the number of successful test cases.<br>
-int UnitTestImpl::successful_test_case_count() const {<br>
- return CountIf(test_cases_, TestCasePassed);<br>
+// Gets the number of successful test suites.<br>
+int UnitTestImpl::successful_test_suite_count() const {<br>
+ return CountIf(test_suites_, TestSuitePassed);<br>
}<br>
<br>
-// Gets the number of failed test cases.<br>
-int UnitTestImpl::failed_test_case_count() const {<br>
- return CountIf(test_cases_, TestCaseFailed);<br>
+// Gets the number of failed test suites.<br>
+int UnitTestImpl::failed_test_suite_count() const {<br>
+ return CountIf(test_suites_, TestSuiteFailed);<br>
}<br>
<br>
-// Gets the number of all test cases.<br>
-int UnitTestImpl::total_test_case_count() const {<br>
- return static_cast<int>(test_cases_.size());<br>
+// Gets the number of all test suites.<br>
+int UnitTestImpl::total_test_suite_count() const {<br>
+ return static_cast<int>(test_suites_.size());<br>
}<br>
<br>
-// Gets the number of all test cases that contain at least one test<br>
+// Gets the number of all test suites that contain at least one test<br>
// that should run.<br>
-int UnitTestImpl::test_case_to_run_count() const {<br>
- return CountIf(test_cases_, ShouldRunTestCase);<br>
+int UnitTestImpl::test_suite_to_run_count() const {<br>
+ return CountIf(test_suites_, ShouldRunTestSuite);<br>
}<br>
<br>
// Gets the number of successful tests.<br>
int UnitTestImpl::successful_test_count() const {<br>
- return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);<br>
+ return SumOverTestSuiteList(test_suites_, &TestSuite::successful_test_count);<br>
+}<br>
+<br>
+// Gets the number of skipped tests.<br>
+int UnitTestImpl::skipped_test_count() const {<br>
+ return SumOverTestSuiteList(test_suites_, &TestSuite::skipped_test_count);<br>
}<br>
<br>
// Gets the number of failed tests.<br>
int UnitTestImpl::failed_test_count() const {<br>
- return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);<br>
+ return SumOverTestSuiteList(test_suites_, &TestSuite::failed_test_count);<br>
}<br>
<br>
// Gets the number of disabled tests that will be reported in the XML report.<br>
int UnitTestImpl::reportable_disabled_test_count() const {<br>
- return SumOverTestCaseList(test_cases_,<br>
- &TestCase::reportable_disabled_test_count);<br>
+ return SumOverTestSuiteList(test_suites_,<br>
+ &TestSuite::reportable_disabled_test_count);<br>
}<br>
<br>
// Gets the number of disabled tests.<br>
int UnitTestImpl::disabled_test_count() const {<br>
- return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);<br>
+ return SumOverTestSuiteList(test_suites_, &TestSuite::disabled_test_count);<br>
}<br>
<br>
// Gets the number of tests to be printed in the XML report.<br>
int UnitTestImpl::reportable_test_count() const {<br>
- return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count);<br>
+ return SumOverTestSuiteList(test_suites_, &TestSuite::reportable_test_count);<br>
}<br>
<br>
// Gets the number of all tests.<br>
int UnitTestImpl::total_test_count() const {<br>
- return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);<br>
+ return SumOverTestSuiteList(test_suites_, &TestSuite::total_test_count);<br>
}<br>
<br>
// Gets the number of tests that should run.<br>
int UnitTestImpl::test_to_run_count() const {<br>
- return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);<br>
+ return SumOverTestSuiteList(test_suites_, &TestSuite::test_to_run_count);<br>
}<br>
<br>
// Returns the current OS stack trace as an std::string.<br>
@@ -858,8 +837,6 @@ TimeInMillis GetTimeInMillis() {<br>
SYSTEMTIME now_systime;<br>
FILETIME now_filetime;<br>
ULARGE_INTEGER now_int64;<br>
- // FIXME: Shouldn't this just use<br>
- // GetSystemTimeAsFileTime()?<br>
GetSystemTime(&now_systime);<br>
if (SystemTimeToFileTime(&now_systime, &now_filetime)) {<br>
now_int64.LowPart = now_filetime.dwLowDateTime;<br>
@@ -874,8 +851,6 @@ TimeInMillis GetTimeInMillis() {<br>
<br>
// MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996<br>
// (deprecated function) there.<br>
- // FIXME: Use GetTickCount()? Or use<br>
- // SystemTimeToFileTime()<br>
GTEST_DISABLE_MSC_DEPRECATED_PUSH_()<br>
_ftime64(&now);<br>
GTEST_DISABLE_MSC_DEPRECATED_POP_()<br>
@@ -883,7 +858,7 @@ TimeInMillis GetTimeInMillis() {<br>
return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;<br>
#elif GTEST_HAS_GETTIMEOFDAY_<br>
struct timeval now;<br>
- gettimeofday(&now, NULL);<br>
+ gettimeofday(&now, nullptr);<br>
return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;<br>
#else<br>
# error "Don't know how to get the current time on your system."<br>
@@ -900,11 +875,10 @@ TimeInMillis GetTimeInMillis() {<br>
// value using delete[]. Returns the wide string, or NULL if the<br>
// input is NULL.<br>
LPCWSTR String::AnsiToUtf16(const char* ansi) {<br>
- if (!ansi) return NULL;<br>
+ if (!ansi) return nullptr;<br>
const int length = strlen(ansi);<br>
const int unicode_length =<br>
- MultiByteToWideChar(CP_ACP, 0, ansi, length,<br>
- NULL, 0);<br>
+ MultiByteToWideChar(CP_ACP, 0, ansi, length, nullptr, 0);<br>
WCHAR* unicode = new WCHAR[unicode_length + 1];<br>
MultiByteToWideChar(CP_ACP, 0, ansi, length,<br>
unicode, unicode_length);<br>
@@ -917,33 +891,33 @@ LPCWSTR String::AnsiToUtf16(const char* ansi) {<br>
// value using delete[]. Returns the ANSI string, or NULL if the<br>
// input is NULL.<br>
const char* String::Utf16ToAnsi(LPCWSTR utf16_str) {<br>
- if (!utf16_str) return NULL;<br>
- const int ansi_length =<br>
- WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,<br>
- NULL, 0, NULL, NULL);<br>
+ if (!utf16_str) return nullptr;<br>
+ const int ansi_length = WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, nullptr,<br>
+ 0, nullptr, nullptr);<br>
char* ansi = new char[ansi_length + 1];<br>
- WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,<br>
- ansi, ansi_length, NULL, NULL);<br>
+ WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, ansi, ansi_length, nullptr,<br>
+ nullptr);<br>
ansi[ansi_length] = 0;<br>
return ansi;<br>
}<br>
<br>
#endif // GTEST_OS_WINDOWS_MOBILE<br>
<br>
-// Compares two C strings. Returns true iff they have the same content.<br>
+// Compares two C strings. Returns true if and only if they have the same<br>
+// content.<br>
//<br>
// Unlike strcmp(), this function can handle NULL argument(s). A NULL<br>
// C string is considered <br>
diff erent to any non-NULL C string,<br>
// including the empty string.<br>
bool String::CStringEquals(const char * lhs, const char * rhs) {<br>
- if ( lhs == NULL ) return rhs == NULL;<br>
+ if (lhs == nullptr) return rhs == nullptr;<br>
<br>
- if ( rhs == NULL ) return false;<br>
+ if (rhs == nullptr) return false;<br>
<br>
return strcmp(lhs, rhs) == 0;<br>
}<br>
<br>
-#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING<br>
+#if GTEST_HAS_STD_WSTRING<br>
<br>
// Converts an array of wide chars to a narrow string using the UTF-8<br>
// encoding, and streams the result to the given Message object.<br>
@@ -961,7 +935,7 @@ static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,<br>
}<br>
}<br>
<br>
-#endif // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING<br>
+#endif // GTEST_HAS_STD_WSTRING<br>
<br>
void SplitString(const ::std::string& str, char delimiter,<br>
::std::vector< ::std::string>* dest) {<br>
@@ -1011,15 +985,6 @@ Message& Message::operator <<(const ::std::wstring& wstr) {<br>
}<br>
#endif // GTEST_HAS_STD_WSTRING<br>
<br>
-#if GTEST_HAS_GLOBAL_WSTRING<br>
-// Converts the given wide string to a narrow string using the UTF-8<br>
-// encoding, and streams the result to this Message object.<br>
-Message& Message::operator <<(const ::wstring& wstr) {<br>
- internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);<br>
- return *this;<br>
-}<br>
-#endif // GTEST_HAS_GLOBAL_WSTRING<br>
-<br>
// Gets the text streamed to this object so far as an std::string.<br>
// Each '\0' character in the buffer is replaced with "\\0".<br>
std::string Message::GetString() const {<br>
@@ -1030,10 +995,9 @@ std::string Message::GetString() const {<br>
// Used in EXPECT_TRUE/FALSE(assertion_result).<br>
AssertionResult::AssertionResult(const AssertionResult& other)<br>
: success_(other.success_),<br>
- message_(other.message_.get() != NULL ?<br>
- new ::std::string(*other.message_) :<br>
- static_cast< ::std::string*>(NULL)) {<br>
-}<br>
+ message_(other.message_.get() != nullptr<br>
+ ? new ::std::string(*other.message_)<br>
+ : static_cast< ::std::string*>(nullptr)) {}<br>
<br>
// Swaps two AssertionResults.<br>
void AssertionResult::swap(AssertionResult& other) {<br>
@@ -1045,8 +1009,7 @@ void AssertionResult::swap(AssertionResult& other) {<br>
// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.<br>
AssertionResult AssertionResult::operator!() const {<br>
AssertionResult negation(!success_);<br>
- if (message_.get() != NULL)<br>
- negation << *message_;<br>
+ if (message_.get() != nullptr) negation << *message_;<br>
return negation;<br>
}<br>
<br>
@@ -1272,9 +1235,10 @@ std::string CreateUnifiedDiff(const std::vector<std::string>& left,<br>
for (; edit_i < edits.size(); ++edit_i) {<br>
if (n_suffix >= context) {<br>
// Continue only if the next hunk is very close.<br>
- std::vector<EditType>::const_iterator it = edits.begin() + edit_i;<br>
+ auto it = edits.begin() + static_cast<int>(edit_i);<br>
while (it != edits.end() && *it == kMatch) ++it;<br>
- if (it == edits.end() || (it - edits.begin()) - edit_i >= context) {<br>
+ if (it == edits.end() ||<br>
+ static_cast<size_t>(it - edits.begin()) - edit_i >= context) {<br>
// There is no next edit or it is too far away.<br>
break;<br>
}<br>
@@ -1350,7 +1314,7 @@ std::vector<std::string> SplitEscapedString(const std::string& str) {<br>
// lhs_value: "5"<br>
// rhs_value: "6"<br>
//<br>
-// The ignoring_case parameter is true iff the assertion is a<br>
+// The ignoring_case parameter is true if and only if the assertion is a<br>
// *_STRCASEEQ*. When it's true, the string "Ignoring case" will<br>
// be inserted into the message.<br>
AssertionResult EqFailure(const char* lhs_expression,<br>
@@ -1413,8 +1377,6 @@ AssertionResult DoubleNearPredFormat(const char* expr1,<br>
const double <br>
diff = fabs(val1 - val2);<br>
if (<br>
diff <= abs_error) return AssertionSuccess();<br>
<br>
- // FIXME: do not print the value of an expression if it's<br>
- // already a literal.<br>
return AssertionFailure()<br>
<< "The <br>
diff erence between " << expr1 << " and " << expr2<br>
<< " is " << <br>
diff << ", which exceeds " << abs_error_expr << ", where\n"<br>
@@ -1595,22 +1557,20 @@ namespace {<br>
<br>
// Helper functions for implementing IsSubString() and IsNotSubstring().<br>
<br>
-// This group of overloaded functions return true iff needle is a<br>
-// substring of haystack. NULL is considered a substring of itself<br>
-// only.<br>
+// This group of overloaded functions return true if and only if needle<br>
+// is a substring of haystack. NULL is considered a substring of<br>
+// itself only.<br>
<br>
bool IsSubstringPred(const char* needle, const char* haystack) {<br>
- if (needle == NULL || haystack == NULL)<br>
- return needle == haystack;<br>
+ if (needle == nullptr || haystack == nullptr) return needle == haystack;<br>
<br>
- return strstr(haystack, needle) != NULL;<br>
+ return strstr(haystack, needle) != nullptr;<br>
}<br>
<br>
bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {<br>
- if (needle == NULL || haystack == NULL)<br>
- return needle == haystack;<br>
+ if (needle == nullptr || haystack == nullptr) return needle == haystack;<br>
<br>
- return wcsstr(haystack, needle) != NULL;<br>
+ return wcsstr(haystack, needle) != nullptr;<br>
}<br>
<br>
// StringType here can be either ::std::string or ::std::wstring.<br>
@@ -1724,12 +1684,12 @@ AssertionResult HRESULTFailureHelper(const char* expr,<br>
// Gets the system's human readable message string for this HRESULT.<br>
char error_text[kBufSize] = { '\0' };<br>
DWORD message_length = ::FormatMessageA(kFlags,<br>
- 0, // no source, we're asking system<br>
- hr, // the error<br>
- 0, // no line width restrictions<br>
+ 0, // no source, we're asking system<br>
+ static_cast<DWORD>(hr), // the error<br>
+ 0, // no line width restrictions<br>
error_text, // output buffer<br>
- kBufSize, // buf size<br>
- NULL); // no arguments for inserts<br>
+ kBufSize, // buf size<br>
+ nullptr); // no arguments for inserts<br>
// Trims tailing white space (FormatMessage leaves a trailing CR-LF)<br>
for (; message_length && IsSpace(error_text[message_length - 1]);<br>
--message_length) {<br>
@@ -1803,7 +1763,7 @@ inline UInt32 ChopLowBits(UInt32* bits, int n) {<br>
// to "(Invalid Unicode 0xXXXXXXXX)".<br>
std::string CodePointToUtf8(UInt32 code_point) {<br>
if (code_point > kMaxCodePoint4) {<br>
- return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")";<br>
+ return "(Invalid Unicode 0x" + String::FormatHexUInt32(code_point) + ")";<br>
}<br>
<br>
char str[5]; // Big enough for the largest valid code point.<br>
@@ -1831,7 +1791,7 @@ std::string CodePointToUtf8(UInt32 code_point) {<br>
<br>
// The following two functions only make sense if the system<br>
// uses UTF-16 for wide string encoding. All supported systems<br>
-// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.<br>
+// with 16 bit wchar_t (Windows, Cygwin) do use UTF-16.<br>
<br>
// Determines if the arguments constitute UTF-16 surrogate pair<br>
// and thus should be combined into a single Unicode code point<br>
@@ -1844,17 +1804,20 @@ inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {<br>
// Creates a Unicode code point from UTF16 surrogate pair.<br>
inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,<br>
wchar_t second) {<br>
+ const auto first_u = static_cast<UInt32>(first);<br>
+ const auto second_u = static_cast<UInt32>(second);<br>
const UInt32 mask = (1 << 10) - 1;<br>
- return (sizeof(wchar_t) == 2) ?<br>
- (((first & mask) << 10) | (second & mask)) + 0x10000 :<br>
- // This function should not be called when the condition is<br>
- // false, but we provide a sensible default in case it is.<br>
- static_cast<UInt32>(first);<br>
+ return (sizeof(wchar_t) == 2)<br>
+ ? (((first_u & mask) << 10) | (second_u & mask)) + 0x10000<br>
+ :<br>
+ // This function should not be called when the condition is<br>
+ // false, but we provide a sensible default in case it is.<br>
+ first_u;<br>
}<br>
<br>
// Converts a wide string to a narrow string in UTF-8 encoding.<br>
// The wide string is assumed to have the following encoding:<br>
-// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)<br>
+// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin)<br>
// UTF-32 if sizeof(wchar_t) == 4 (on Linux)<br>
// Parameter str points to a null-terminated wide string.<br>
// Parameter num_chars may additionally limit the number<br>
@@ -1891,21 +1854,21 @@ std::string WideStringToUtf8(const wchar_t* str, int num_chars) {<br>
// Converts a wide C string to an std::string using the UTF-8 encoding.<br>
// NULL will be converted to "(null)".<br>
std::string String::ShowWideCString(const wchar_t * wide_c_str) {<br>
- if (wide_c_str == NULL) return "(null)";<br>
+ if (wide_c_str == nullptr) return "(null)";<br>
<br>
return internal::WideStringToUtf8(wide_c_str, -1);<br>
}<br>
<br>
-// Compares two wide C strings. Returns true iff they have the same<br>
-// content.<br>
+// Compares two wide C strings. Returns true if and only if they have the<br>
+// same content.<br>
//<br>
// Unlike wcscmp(), this function can handle NULL argument(s). A NULL<br>
// C string is considered <br>
diff erent to any non-NULL C string,<br>
// including the empty string.<br>
bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {<br>
- if (lhs == NULL) return rhs == NULL;<br>
+ if (lhs == nullptr) return rhs == nullptr;<br>
<br>
- if (rhs == NULL) return false;<br>
+ if (rhs == nullptr) return false;<br>
<br>
return wcscmp(lhs, rhs) == 0;<br>
}<br>
@@ -1941,37 +1904,35 @@ AssertionResult CmpHelperSTRNE(const char* s1_expression,<br>
<< " vs " << PrintToString(s2);<br>
}<br>
<br>
-// Compares two C strings, ignoring case. Returns true iff they have<br>
+// Compares two C strings, ignoring case. Returns true if and only if they have<br>
// the same content.<br>
//<br>
// Unlike strcasecmp(), this function can handle NULL argument(s). A<br>
// NULL C string is considered <br>
diff erent to any non-NULL C string,<br>
// including the empty string.<br>
bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {<br>
- if (lhs == NULL)<br>
- return rhs == NULL;<br>
- if (rhs == NULL)<br>
- return false;<br>
+ if (lhs == nullptr) return rhs == nullptr;<br>
+ if (rhs == nullptr) return false;<br>
return posix::StrCaseCmp(lhs, rhs) == 0;<br>
}<br>
<br>
- // Compares two wide C strings, ignoring case. Returns true iff they<br>
- // have the same content.<br>
- //<br>
- // Unlike wcscasecmp(), this function can handle NULL argument(s).<br>
- // A NULL C string is considered <br>
diff erent to any non-NULL wide C string,<br>
- // including the empty string.<br>
- // NB: The implementations on <br>
diff erent platforms slightly <br>
diff er.<br>
- // On windows, this method uses _wcsicmp which compares according to LC_CTYPE<br>
- // environment variable. On GNU platform this method uses wcscasecmp<br>
- // which compares according to LC_CTYPE category of the current locale.<br>
- // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the<br>
- // current locale.<br>
+// Compares two wide C strings, ignoring case. Returns true if and only if they<br>
+// have the same content.<br>
+//<br>
+// Unlike wcscasecmp(), this function can handle NULL argument(s).<br>
+// A NULL C string is considered <br>
diff erent to any non-NULL wide C string,<br>
+// including the empty string.<br>
+// NB: The implementations on <br>
diff erent platforms slightly <br>
diff er.<br>
+// On windows, this method uses _wcsicmp which compares according to LC_CTYPE<br>
+// environment variable. On GNU platform this method uses wcscasecmp<br>
+// which compares according to LC_CTYPE category of the current locale.<br>
+// On MacOS X, it uses towlower, which also uses LC_CTYPE category of the<br>
+// current locale.<br>
bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,<br>
const wchar_t* rhs) {<br>
- if (lhs == NULL) return rhs == NULL;<br>
+ if (lhs == nullptr) return rhs == nullptr;<br>
<br>
- if (rhs == NULL) return false;<br>
+ if (rhs == nullptr) return false;<br>
<br>
#if GTEST_OS_WINDOWS<br>
return _wcsicmp(lhs, rhs) == 0;<br>
@@ -1982,14 +1943,14 @@ bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,<br>
// Other unknown OSes may not define it either.<br>
wint_t left, right;<br>
do {<br>
- left = towlower(*lhs++);<br>
- right = towlower(*rhs++);<br>
+ left = towlower(static_cast<wint_t>(*lhs++));<br>
+ right = towlower(static_cast<wint_t>(*rhs++));<br>
} while (left && left == right);<br>
return left == right;<br>
#endif // OS selector<br>
}<br>
<br>
-// Returns true iff str ends with the given suffix, ignoring case.<br>
+// Returns true if and only if str ends with the given suffix, ignoring case.<br>
// Any string is considered to end with an empty suffix.<br>
bool String::EndsWithCaseInsensitive(<br>
const std::string& str, const std::string& suffix) {<br>
@@ -2008,12 +1969,17 @@ std::string String::FormatIntWidth2(int value) {<br>
}<br>
<br>
// Formats an int value as "%X".<br>
-std::string String::FormatHexInt(int value) {<br>
+std::string String::FormatHexUInt32(UInt32 value) {<br>
std::stringstream ss;<br>
ss << std::hex << std::uppercase << value;<br>
return ss.str();<br>
}<br>
<br>
+// Formats an int value as "%X".<br>
+std::string String::FormatHexInt(int value) {<br>
+ return FormatHexUInt32(static_cast<UInt32>(value));<br>
+}<br>
+<br>
// Formats a byte as "%02X".<br>
std::string String::FormatByte(unsigned char value) {<br>
std::stringstream ss;<br>
@@ -2030,7 +1996,7 @@ std::string StringStreamToString(::std::stringstream* ss) {<br>
const char* const end = start + str.length();<br>
<br>
std::string result;<br>
- result.reserve(2 * (end - start));<br>
+ result.reserve(static_cast<size_t>(2 * (end - start)));<br>
for (const char* ch = start; ch != end; ++ch) {<br>
if (*ch == '\0') {<br>
result += "\\0"; // Replaces NUL with "\\0";<br>
@@ -2060,9 +2026,7 @@ std::string AppendUserMessage(const std::string& gtest_msg,<br>
<br>
// Creates an empty TestResult.<br>
TestResult::TestResult()<br>
- : death_test_count_(0),<br>
- elapsed_time_(0) {<br>
-}<br>
+ : death_test_count_(0), start_timestamp_(0), elapsed_time_(0) {}<br>
<br>
// D'tor.<br>
TestResult::~TestResult() {<br>
@@ -2074,7 +2038,7 @@ TestResult::~TestResult() {<br>
const TestPartResult& TestResult::GetTestPartResult(int i) const {<br>
if (i < 0 || i >= total_part_count())<br>
internal::posix::Abort();<br>
- return test_part_results_.at(i);<br>
+ return test_part_results_.at(static_cast<size_t>(i));<br>
}<br>
<br>
// Returns the i-th test property. i can range from 0 to<br>
@@ -2083,7 +2047,7 @@ const TestPartResult& TestResult::GetTestPartResult(int i) const {<br>
const TestProperty& TestResult::GetTestProperty(int i) const {<br>
if (i < 0 || i >= test_property_count())<br>
internal::posix::Abort();<br>
- return test_properties_.at(i);<br>
+ return test_properties_.at(static_cast<size_t>(i));<br>
}<br>
<br>
// Clears the test part results.<br>
@@ -2131,18 +2095,18 @@ static const char* const kReservedTestSuitesAttributes[] = {<br>
// The list of reserved attributes used in the <testsuite> element of XML<br>
// output.<br>
static const char* const kReservedTestSuiteAttributes[] = {<br>
- "disabled",<br>
- "errors",<br>
- "failures",<br>
- "name",<br>
- "tests",<br>
- "time"<br>
-};<br>
+ "disabled", "errors", "failures", "name", "tests", "time", "timestamp"};<br>
<br>
// The list of reserved attributes used in the <testcase> element of XML output.<br>
static const char* const kReservedTestCaseAttributes[] = {<br>
- "classname", "name", "status", "time",<br>
- "type_param", "value_param", "file", "line"};<br>
+ "classname", "name", "status", "time", "type_param",<br>
+ "value_param", "file", "line"};<br>
+<br>
+// Use a slightly <br>
diff erent set for allowed output to ensure existing tests can<br>
+// still RecordProperty("result") or "RecordProperty(timestamp")<br>
+static const char* const kReservedOutputTestCaseAttributes[] = {<br>
+ "classname", "name", "status", "time", "type_param",<br>
+ "value_param", "file", "line", "result", "timestamp"};<br>
<br>
template <int kSize><br>
std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {<br>
@@ -2164,6 +2128,22 @@ static std::vector<std::string> GetReservedAttributesForElement(<br>
return std::vector<std::string>();<br>
}<br>
<br>
+// TODO(jdesprez): Merge the two getReserved attributes once skip is improved<br>
+static std::vector<std::string> GetReservedOutputAttributesForElement(<br>
+ const std::string& xml_element) {<br>
+ if (xml_element == "testsuites") {<br>
+ return ArrayAsVector(kReservedTestSuitesAttributes);<br>
+ } else if (xml_element == "testsuite") {<br>
+ return ArrayAsVector(kReservedTestSuiteAttributes);<br>
+ } else if (xml_element == "testcase") {<br>
+ return ArrayAsVector(kReservedOutputTestCaseAttributes);<br>
+ } else {<br>
+ GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;<br>
+ }<br>
+ // This code is unreachable but some compilers may not realizes that.<br>
+ return std::vector<std::string>();<br>
+}<br>
+<br>
static std::string FormatWordList(const std::vector<std::string>& words) {<br>
Message word_list;<br>
for (size_t i = 0; i < words.size(); ++i) {<br>
@@ -2207,7 +2187,17 @@ void TestResult::Clear() {<br>
elapsed_time_ = 0;<br>
}<br>
<br>
-// Returns true iff the test failed.<br>
+// Returns true off the test part was skipped.<br>
+static bool TestPartSkipped(const TestPartResult& result) {<br>
+ return result.skipped();<br>
+}<br>
+<br>
+// Returns true if and only if the test was skipped.<br>
+bool TestResult::Skipped() const {<br>
+ return !Failed() && CountIf(test_part_results_, TestPartSkipped) > 0;<br>
+}<br>
+<br>
+// Returns true if and only if the test failed.<br>
bool TestResult::Failed() const {<br>
for (int i = 0; i < total_part_count(); ++i) {<br>
if (GetTestPartResult(i).failed())<br>
@@ -2216,22 +2206,22 @@ bool TestResult::Failed() const {<br>
return false;<br>
}<br>
<br>
-// Returns true iff the test part fatally failed.<br>
+// Returns true if and only if the test part fatally failed.<br>
static bool TestPartFatallyFailed(const TestPartResult& result) {<br>
return result.fatally_failed();<br>
}<br>
<br>
-// Returns true iff the test fatally failed.<br>
+// Returns true if and only if the test fatally failed.<br>
bool TestResult::HasFatalFailure() const {<br>
return CountIf(test_part_results_, TestPartFatallyFailed) > 0;<br>
}<br>
<br>
-// Returns true iff the test part non-fatally failed.<br>
+// Returns true if and only if the test part non-fatally failed.<br>
static bool TestPartNonfatallyFailed(const TestPartResult& result) {<br>
return result.nonfatally_failed();<br>
}<br>
<br>
-// Returns true iff the test has a non-fatal failure.<br>
+// Returns true if and only if the test has a non-fatal failure.<br>
bool TestResult::HasNonfatalFailure() const {<br>
return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;<br>
}<br>
@@ -2294,25 +2284,25 @@ void ReportFailureInUnknownLocation(TestPartResult::Type result_type,<br>
// AddTestPartResult.<br>
UnitTest::GetInstance()->AddTestPartResult(<br>
result_type,<br>
- NULL, // No info about the source file where the exception occurred.<br>
- -1, // We have no info on which line caused the exception.<br>
+ nullptr, // No info about the source file where the exception occurred.<br>
+ -1, // We have no info on which line caused the exception.<br>
message,<br>
- ""); // No stack trace, either.<br>
+ ""); // No stack trace, either.<br>
}<br>
<br>
} // namespace internal<br>
<br>
-// Google Test requires all tests in the same test case to use the same test<br>
+// Google Test requires all tests in the same test suite to use the same test<br>
// fixture class. This function checks if the current test has the<br>
-// same fixture class as the first test in the current test case. If<br>
+// same fixture class as the first test in the current test suite. If<br>
// yes, it returns true; otherwise it generates a Google Test failure and<br>
// returns false.<br>
bool Test::HasSameFixtureClass() {<br>
internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();<br>
- const TestCase* const test_case = impl->current_test_case();<br>
+ const TestSuite* const test_suite = impl->current_test_suite();<br>
<br>
- // Info about the first test in the current test case.<br>
- const TestInfo* const first_test_info = test_case->test_info_list()[0];<br>
+ // Info about the first test in the current test suite.<br>
+ const TestInfo* const first_test_info = test_suite->test_info_list()[0];<br>
const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;<br>
const char* const first_test_name = first_test_info->name();<br>
<br>
@@ -2328,7 +2318,7 @@ bool Test::HasSameFixtureClass() {<br>
const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();<br>
<br>
if (first_is_TEST || this_is_TEST) {<br>
- // Both TEST and TEST_F appear in same test case, which is incorrect.<br>
+ // Both TEST and TEST_F appear in same test suite, which is incorrect.<br>
// Tell the user how to fix this.<br>
<br>
// Gets the name of the TEST and the name of the TEST_F. Note<br>
@@ -2340,9 +2330,9 @@ bool Test::HasSameFixtureClass() {<br>
first_is_TEST ? this_test_name : first_test_name;<br>
<br>
ADD_FAILURE()<br>
- << "All tests in the same test case must use the same test fixture\n"<br>
- << "class, so mixing TEST_F and TEST in the same test case is\n"<br>
- << "illegal. In test case " << this_test_info->test_case_name()<br>
+ << "All tests in the same test suite must use the same test fixture\n"<br>
+ << "class, so mixing TEST_F and TEST in the same test suite is\n"<br>
+ << "illegal. In test suite " << this_test_info->test_suite_name()<br>
<< ",\n"<br>
<< "test " << TEST_F_name << " is defined using TEST_F but\n"<br>
<< "test " << TEST_name << " is defined using TEST. You probably\n"<br>
@@ -2352,15 +2342,15 @@ bool Test::HasSameFixtureClass() {<br>
// Two fixture classes with the same name appear in two <br>
diff erent<br>
// namespaces, which is not allowed. Tell the user how to fix this.<br>
ADD_FAILURE()<br>
- << "All tests in the same test case must use the same test fixture\n"<br>
- << "class. However, in test case "<br>
- << this_test_info->test_case_name() << ",\n"<br>
- << "you defined test " << first_test_name<br>
- << " and test " << this_test_name << "\n"<br>
+ << "All tests in the same test suite must use the same test fixture\n"<br>
+ << "class. However, in test suite "<br>
+ << this_test_info->test_suite_name() << ",\n"<br>
+ << "you defined test " << first_test_name << " and test "<br>
+ << this_test_name << "\n"<br>
<< "using two <br>
diff erent test fixture classes. This can happen if\n"<br>
<< "the two classes are from <br>
diff erent namespaces or translation\n"<br>
<< "units and have the same name. You should probably rename one\n"<br>
- << "of the classes to put the tests into <br>
diff erent test cases.";<br>
+ << "of the classes to put the tests into <br>
diff erent test suites.";<br>
}<br>
return false;<br>
}<br>
@@ -2393,7 +2383,7 @@ namespace internal {<br>
static std::string FormatCxxExceptionMessage(const char* description,<br>
const char* location) {<br>
Message message;<br>
- if (description != NULL) {<br>
+ if (description != nullptr) {<br>
message << "C++ exception with description \"" << description << "\"";<br>
} else {<br>
message << "Unknown C++ exception";<br>
@@ -2491,7 +2481,7 @@ Result HandleExceptionsInMethodIfSupported(<br>
} catch (...) { // NOLINT<br>
internal::ReportFailureInUnknownLocation(<br>
TestPartResult::kFatalFailure,<br>
- FormatCxxExceptionMessage(NULL, location));<br>
+ FormatCxxExceptionMessage(nullptr, location));<br>
}<br>
return static_cast<Result>(0);<br>
#else<br>
@@ -2511,8 +2501,9 @@ void Test::Run() {<br>
internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();<br>
impl->os_stack_trace_getter()->UponLeavingGTest();<br>
internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");<br>
- // We will run the test only if SetUp() was successful.<br>
- if (!HasFatalFailure()) {<br>
+ // We will run the test only if SetUp() was successful and didn't call<br>
+ // GTEST_SKIP().<br>
+ if (!HasFatalFailure() && !IsSkipped()) {<br>
impl->os_stack_trace_getter()->UponLeavingGTest();<br>
internal::HandleExceptionsInMethodIfSupported(<br>
this, &Test::TestBody, "the test body");<br>
@@ -2526,32 +2517,36 @@ void Test::Run() {<br>
this, &Test::TearDown, "TearDown()");<br>
}<br>
<br>
-// Returns true iff the current test has a fatal failure.<br>
+// Returns true if and only if the current test has a fatal failure.<br>
bool Test::HasFatalFailure() {<br>
return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();<br>
}<br>
<br>
-// Returns true iff the current test has a non-fatal failure.<br>
+// Returns true if and only if the current test has a non-fatal failure.<br>
bool Test::HasNonfatalFailure() {<br>
return internal::GetUnitTestImpl()->current_test_result()-><br>
HasNonfatalFailure();<br>
}<br>
<br>
+// Returns true if and only if the current test was skipped.<br>
+bool Test::IsSkipped() {<br>
+ return internal::GetUnitTestImpl()->current_test_result()->Skipped();<br>
+}<br>
+<br>
// class TestInfo<br>
<br>
// Constructs a TestInfo object. It assumes ownership of the test factory<br>
// object.<br>
-TestInfo::TestInfo(const std::string& a_test_case_name,<br>
- const std::string& a_name,<br>
- const char* a_type_param,<br>
+TestInfo::TestInfo(const std::string& a_test_suite_name,<br>
+ const std::string& a_name, const char* a_type_param,<br>
const char* a_value_param,<br>
internal::CodeLocation a_code_location,<br>
internal::TypeId fixture_class_id,<br>
internal::TestFactoryBase* factory)<br>
- : test_case_name_(a_test_case_name),<br>
+ : test_suite_name_(a_test_suite_name),<br>
name_(a_name),<br>
- type_param_(a_type_param ? new std::string(a_type_param) : NULL),<br>
- value_param_(a_value_param ? new std::string(a_value_param) : NULL),<br>
+ type_param_(a_type_param ? new std::string(a_type_param) : nullptr),<br>
+ value_param_(a_value_param ? new std::string(a_value_param) : nullptr),<br>
location_(a_code_location),<br>
fixture_class_id_(fixture_class_id),<br>
should_run_(false),<br>
@@ -2570,7 +2565,7 @@ namespace internal {<br>
//<br>
// Arguments:<br>
//<br>
-// test_case_name: name of the test case<br>
+// test_suite_name: name of the test suite<br>
// name: name of the test<br>
// type_param: the name of the test's type parameter, or NULL if<br>
// this is not a typed or a type-parameterized test.<br>
@@ -2578,40 +2573,35 @@ namespace internal {<br>
// or NULL if this is not a value-parameterized test.<br>
// code_location: code location where the test is defined<br>
// fixture_class_id: ID of the test fixture class<br>
-// set_up_tc: pointer to the function that sets up the test case<br>
-// tear_down_tc: pointer to the function that tears down the test case<br>
+// set_up_tc: pointer to the function that sets up the test suite<br>
+// tear_down_tc: pointer to the function that tears down the test suite<br>
// factory: pointer to the factory that creates a test object.<br>
// The newly created TestInfo instance will assume<br>
// ownership of the factory object.<br>
TestInfo* MakeAndRegisterTestInfo(<br>
- const char* test_case_name,<br>
- const char* name,<br>
- const char* type_param,<br>
- const char* value_param,<br>
- CodeLocation code_location,<br>
- TypeId fixture_class_id,<br>
- SetUpTestCaseFunc set_up_tc,<br>
- TearDownTestCaseFunc tear_down_tc,<br>
- TestFactoryBase* factory) {<br>
+ const char* test_suite_name, const char* name, const char* type_param,<br>
+ const char* value_param, CodeLocation code_location,<br>
+ TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc,<br>
+ TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory) {<br>
TestInfo* const test_info =<br>
- new TestInfo(test_case_name, name, type_param, value_param,<br>
+ new TestInfo(test_suite_name, name, type_param, value_param,<br>
code_location, fixture_class_id, factory);<br>
GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);<br>
return test_info;<br>
}<br>
<br>
-void ReportInvalidTestCaseType(const char* test_case_name,<br>
- CodeLocation code_location) {<br>
+void ReportInvalidTestSuiteType(const char* test_suite_name,<br>
+ CodeLocation code_location) {<br>
Message errors;<br>
errors<br>
- << "Attempted redefinition of test case " << test_case_name << ".\n"<br>
- << "All tests in the same test case must use the same test fixture\n"<br>
- << "class. However, in test case " << test_case_name << ", you tried\n"<br>
+ << "Attempted redefinition of test suite " << test_suite_name << ".\n"<br>
+ << "All tests in the same test suite must use the same test fixture\n"<br>
+ << "class. However, in test suite " << test_suite_name << ", you tried\n"<br>
<< "to define a test using a fixture class <br>
diff erent from the one\n"<br>
<< "used earlier. This can happen if the two fixture classes are\n"<br>
<< "from <br>
diff erent namespaces and have the same name. You should\n"<br>
<< "probably rename one of the classes to put the tests into <br>
diff erent\n"<br>
- << "test cases.";<br>
+ << "test suites.";<br>
<br>
GTEST_LOG_(ERROR) << FormatFileLocation(code_location.file.c_str(),<br>
code_location.line)<br>
@@ -2624,7 +2614,7 @@ namespace {<br>
// A predicate that checks the test name of a TestInfo against a known<br>
// value.<br>
//<br>
-// This is used for implementation of the TestCase class only. We put<br>
+// This is used for implementation of the TestSuite class only. We put<br>
// it in the anonymous namespace to prevent polluting the outer<br>
// namespace.<br>
//<br>
@@ -2637,7 +2627,7 @@ class TestNameIs {<br>
explicit TestNameIs(const char* name)<br>
: name_(name) {}<br>
<br>
- // Returns true iff the test name of test_info matches name_.<br>
+ // Returns true if and only if the test name of test_info matches name_.<br>
bool operator()(const TestInfo * test_info) const {<br>
return test_info && test_info->name() == name_;<br>
}<br>
@@ -2651,7 +2641,7 @@ class TestNameIs {<br>
namespace internal {<br>
<br>
// This method expands all parameterized tests registered with macros TEST_P<br>
-// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.<br>
+// and INSTANTIATE_TEST_SUITE_P into regular tests and registers those.<br>
// This will be done just once during the program runtime.<br>
void UnitTestImpl::RegisterParameterizedTests() {<br>
if (!parameterized_tests_registered_) {<br>
@@ -2685,19 +2675,23 @@ void TestInfo::Run() {<br>
factory_, &internal::TestFactoryBase::CreateTest,<br>
"the test fixture's constructor");<br>
<br>
- // Runs the test if the constructor didn't generate a fatal failure.<br>
+ // Runs the test if the constructor didn't generate a fatal failure or invoke<br>
+ // GTEST_SKIP().<br>
// Note that the object will not be null<br>
- if (!Test::HasFatalFailure()) {<br>
+ if (!Test::HasFatalFailure() && !Test::IsSkipped()) {<br>
// This doesn't throw as all user code that can throw are wrapped into<br>
// exception handling code.<br>
test->Run();<br>
}<br>
<br>
+ if (test != nullptr) {<br>
// Deletes the test object.<br>
impl->os_stack_trace_getter()->UponLeavingGTest();<br>
internal::HandleExceptionsInMethodIfSupported(<br>
test, &Test::DeleteSelf_, "the test fixture's destructor");<br>
+ }<br>
<br>
+ result_.set_start_timestamp(start);<br>
result_.set_elapsed_time(internal::GetTimeInMillis() - start);<br>
<br>
// Notifies the unit test event listener that a test has just finished.<br>
@@ -2705,134 +2699,151 @@ void TestInfo::Run() {<br>
<br>
// Tells UnitTest to stop associating assertion results to this<br>
// test.<br>
- impl->set_current_test_info(NULL);<br>
+ impl->set_current_test_info(nullptr);<br>
}<br>
<br>
-// class TestCase<br>
+// class TestSuite<br>
<br>
-// Gets the number of successful tests in this test case.<br>
-int TestCase::successful_test_count() const {<br>
+// Gets the number of successful tests in this test suite.<br>
+int TestSuite::successful_test_count() const {<br>
return CountIf(test_info_list_, TestPassed);<br>
}<br>
<br>
-// Gets the number of failed tests in this test case.<br>
-int TestCase::failed_test_count() const {<br>
+// Gets the number of successful tests in this test suite.<br>
+int TestSuite::skipped_test_count() const {<br>
+ return CountIf(test_info_list_, TestSkipped);<br>
+}<br>
+<br>
+// Gets the number of failed tests in this test suite.<br>
+int TestSuite::failed_test_count() const {<br>
return CountIf(test_info_list_, TestFailed);<br>
}<br>
<br>
// Gets the number of disabled tests that will be reported in the XML report.<br>
-int TestCase::reportable_disabled_test_count() const {<br>
+int TestSuite::reportable_disabled_test_count() const {<br>
return CountIf(test_info_list_, TestReportableDisabled);<br>
}<br>
<br>
-// Gets the number of disabled tests in this test case.<br>
-int TestCase::disabled_test_count() const {<br>
+// Gets the number of disabled tests in this test suite.<br>
+int TestSuite::disabled_test_count() const {<br>
return CountIf(test_info_list_, TestDisabled);<br>
}<br>
<br>
// Gets the number of tests to be printed in the XML report.<br>
-int TestCase::reportable_test_count() const {<br>
+int TestSuite::reportable_test_count() const {<br>
return CountIf(test_info_list_, TestReportable);<br>
}<br>
<br>
-// Get the number of tests in this test case that should run.<br>
-int TestCase::test_to_run_count() const {<br>
+// Get the number of tests in this test suite that should run.<br>
+int TestSuite::test_to_run_count() const {<br>
return CountIf(test_info_list_, ShouldRunTest);<br>
}<br>
<br>
// Gets the number of all tests.<br>
-int TestCase::total_test_count() const {<br>
+int TestSuite::total_test_count() const {<br>
return static_cast<int>(test_info_list_.size());<br>
}<br>
<br>
-// Creates a TestCase with the given name.<br>
+// Creates a TestSuite with the given name.<br>
//<br>
// Arguments:<br>
//<br>
-// name: name of the test case<br>
-// a_type_param: the name of the test case's type parameter, or NULL if<br>
-// this is not a typed or a type-parameterized test case.<br>
-// set_up_tc: pointer to the function that sets up the test case<br>
-// tear_down_tc: pointer to the function that tears down the test case<br>
-TestCase::TestCase(const char* a_name, const char* a_type_param,<br>
- Test::SetUpTestCaseFunc set_up_tc,<br>
- Test::TearDownTestCaseFunc tear_down_tc)<br>
+// name: name of the test suite<br>
+// a_type_param: the name of the test suite's type parameter, or NULL if<br>
+// this is not a typed or a type-parameterized test suite.<br>
+// set_up_tc: pointer to the function that sets up the test suite<br>
+// tear_down_tc: pointer to the function that tears down the test suite<br>
+TestSuite::TestSuite(const char* a_name, const char* a_type_param,<br>
+ internal::SetUpTestSuiteFunc set_up_tc,<br>
+ internal::TearDownTestSuiteFunc tear_down_tc)<br>
: name_(a_name),<br>
- type_param_(a_type_param ? new std::string(a_type_param) : NULL),<br>
+ type_param_(a_type_param ? new std::string(a_type_param) : nullptr),<br>
set_up_tc_(set_up_tc),<br>
tear_down_tc_(tear_down_tc),<br>
should_run_(false),<br>
- elapsed_time_(0) {<br>
-}<br>
+ start_timestamp_(0),<br>
+ elapsed_time_(0) {}<br>
<br>
-// Destructor of TestCase.<br>
-TestCase::~TestCase() {<br>
+// Destructor of TestSuite.<br>
+TestSuite::~TestSuite() {<br>
// Deletes every Test in the collection.<br>
ForEach(test_info_list_, internal::Delete<TestInfo>);<br>
}<br>
<br>
// Returns the i-th test among all the tests. i can range from 0 to<br>
// total_test_count() - 1. If i is not in that range, returns NULL.<br>
-const TestInfo* TestCase::GetTestInfo(int i) const {<br>
+const TestInfo* TestSuite::GetTestInfo(int i) const {<br>
const int index = GetElementOr(test_indices_, i, -1);<br>
- return index < 0 ? NULL : test_info_list_[index];<br>
+ return index < 0 ? nullptr : test_info_list_[static_cast<size_t>(index)];<br>
}<br>
<br>
// Returns the i-th test among all the tests. i can range from 0 to<br>
// total_test_count() - 1. If i is not in that range, returns NULL.<br>
-TestInfo* TestCase::GetMutableTestInfo(int i) {<br>
+TestInfo* TestSuite::GetMutableTestInfo(int i) {<br>
const int index = GetElementOr(test_indices_, i, -1);<br>
- return index < 0 ? NULL : test_info_list_[index];<br>
+ return index < 0 ? nullptr : test_info_list_[static_cast<size_t>(index)];<br>
}<br>
<br>
-// Adds a test to this test case. Will delete the test upon<br>
-// destruction of the TestCase object.<br>
-void TestCase::AddTestInfo(TestInfo * test_info) {<br>
+// Adds a test to this test suite. Will delete the test upon<br>
+// destruction of the TestSuite object.<br>
+void TestSuite::AddTestInfo(TestInfo* test_info) {<br>
test_info_list_.push_back(test_info);<br>
test_indices_.push_back(static_cast<int>(test_indices_.size()));<br>
}<br>
<br>
-// Runs every test in this TestCase.<br>
-void TestCase::Run() {<br>
+// Runs every test in this TestSuite.<br>
+void TestSuite::Run() {<br>
if (!should_run_) return;<br>
<br>
internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();<br>
- impl->set_current_test_case(this);<br>
+ impl->set_current_test_suite(this);<br>
<br>
TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();<br>
<br>
+ // Call both legacy and the new API<br>
+ repeater->OnTestSuiteStart(*this);<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI<br>
repeater->OnTestCaseStart(*this);<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI<br>
+<br>
impl->os_stack_trace_getter()->UponLeavingGTest();<br>
internal::HandleExceptionsInMethodIfSupported(<br>
- this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");<br>
+ this, &TestSuite::RunSetUpTestSuite, "SetUpTestSuite()");<br>
<br>
- const internal::TimeInMillis start = internal::GetTimeInMillis();<br>
+ start_timestamp_ = internal::GetTimeInMillis();<br>
for (int i = 0; i < total_test_count(); i++) {<br>
GetMutableTestInfo(i)->Run();<br>
}<br>
- elapsed_time_ = internal::GetTimeInMillis() - start;<br>
+ elapsed_time_ = internal::GetTimeInMillis() - start_timestamp_;<br>
<br>
impl->os_stack_trace_getter()->UponLeavingGTest();<br>
internal::HandleExceptionsInMethodIfSupported(<br>
- this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");<br>
+ this, &TestSuite::RunTearDownTestSuite, "TearDownTestSuite()");<br>
<br>
+ // Call both legacy and the new API<br>
+ repeater->OnTestSuiteEnd(*this);<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI<br>
repeater->OnTestCaseEnd(*this);<br>
- impl->set_current_test_case(NULL);<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI<br>
+<br>
+ impl->set_current_test_suite(nullptr);<br>
}<br>
<br>
-// Clears the results of all tests in this test case.<br>
-void TestCase::ClearResult() {<br>
+// Clears the results of all tests in this test suite.<br>
+void TestSuite::ClearResult() {<br>
ad_hoc_test_result_.Clear();<br>
ForEach(test_info_list_, TestInfo::ClearTestResult);<br>
}<br>
<br>
-// Shuffles the tests in this test case.<br>
-void TestCase::ShuffleTests(internal::Random* random) {<br>
+// Shuffles the tests in this test suite.<br>
+void TestSuite::ShuffleTests(internal::Random* random) {<br>
Shuffle(random, &test_indices_);<br>
}<br>
<br>
// Restores the test order to before the first shuffle.<br>
-void TestCase::UnshuffleTests() {<br>
+void TestSuite::UnshuffleTests() {<br>
for (size_t i = 0; i < test_indices_.size(); i++) {<br>
test_indices_[i] = static_cast<int>(i);<br>
}<br>
@@ -2855,9 +2866,9 @@ static std::string FormatTestCount(int test_count) {<br>
return FormatCountableNoun(test_count, "test", "tests");<br>
}<br>
<br>
-// Formats the count of test cases.<br>
-static std::string FormatTestCaseCount(int test_case_count) {<br>
- return FormatCountableNoun(test_case_count, "test case", "test cases");<br>
+// Formats the count of test suites.<br>
+static std::string FormatTestSuiteCount(int test_suite_count) {<br>
+ return FormatCountableNoun(test_suite_count, "test suite", "test suites");<br>
}<br>
<br>
// Converts a TestPartResult::Type enum to human-friendly string<br>
@@ -2866,6 +2877,8 @@ static std::string FormatTestCaseCount(int test_case_count) {<br>
// between the two when viewing the test result.<br>
static const char * TestPartResultTypeToString(TestPartResult::Type type) {<br>
switch (type) {<br>
+ case TestPartResult::kSkip:<br>
+ return "Skipped";<br>
case TestPartResult::kSuccess:<br>
return "Success";<br>
<br>
@@ -2913,14 +2926,6 @@ static void PrintTestPartResult(const TestPartResult& test_part_result) {<br>
}<br>
<br>
// class PrettyUnitTestResultPrinter<br>
-<br>
-enum GTestColor {<br>
- COLOR_DEFAULT,<br>
- COLOR_RED,<br>
- COLOR_GREEN,<br>
- COLOR_YELLOW<br>
-};<br>
-<br>
#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \<br>
!GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT && !GTEST_OS_WINDOWS_MINGW<br>
<br>
@@ -2974,13 +2979,14 @@ static const char* GetAnsiColorCode(GTestColor color) {<br>
case COLOR_RED: return "1";<br>
case COLOR_GREEN: return "2";<br>
case COLOR_YELLOW: return "3";<br>
- default: return NULL;<br>
- };<br>
+ default:<br>
+ return nullptr;<br>
+ }<br>
}<br>
<br>
#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE<br>
<br>
-// Returns true iff Google Test should use colors in the output.<br>
+// Returns true if and only if Google Test should use colors in the output.<br>
bool ShouldUseColor(bool stdout_is_tty) {<br>
const char* const gtest_color = GTEST_FLAG(color).c_str();<br>
<br>
@@ -3021,19 +3027,18 @@ bool ShouldUseColor(bool stdout_is_tty) {<br>
// cannot simply emit special characters and have the terminal change colors.<br>
// This routine must actually emit the characters rather than return a string<br>
// that would be colored when printed, as can be done on Linux.<br>
-static void ColoredPrintf(GTestColor color, const char* fmt, ...) {<br>
+void ColoredPrintf(GTestColor color, const char* fmt, ...) {<br>
va_list args;<br>
va_start(args, fmt);<br>
<br>
-#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || \<br>
- GTEST_OS_IOS || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT<br>
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS || GTEST_OS_IOS || \<br>
+ GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT || defined(ESP_PLATFORM)<br>
const bool use_color = AlwaysFalse();<br>
#else<br>
static const bool in_color_mode =<br>
ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);<br>
const bool use_color = in_color_mode && (color != COLOR_DEFAULT);<br>
-#endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS<br>
- // The '!= 0' comparison is necessary to satisfy MSVC 7.1.<br>
+#endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS<br>
<br>
if (!use_color) {<br>
vprintf(fmt, args);<br>
@@ -3079,14 +3084,13 @@ static void PrintFullTestCommentIfPresent(const TestInfo& test_info) {<br>
const char* const type_param = test_info.type_param();<br>
const char* const value_param = test_info.value_param();<br>
<br>
- if (type_param != NULL || value_param != NULL) {<br>
+ if (type_param != nullptr || value_param != nullptr) {<br>
printf(", where ");<br>
- if (type_param != NULL) {<br>
+ if (type_param != nullptr) {<br>
printf("%s = %s", kTypeParamLabel, type_param);<br>
- if (value_param != NULL)<br>
- printf(" and ");<br>
+ if (value_param != nullptr) printf(" and ");<br>
}<br>
- if (value_param != NULL) {<br>
+ if (value_param != nullptr) {<br>
printf("%s = %s", kValueParamLabel, value_param);<br>
}<br>
}<br>
@@ -3098,27 +3102,39 @@ static void PrintFullTestCommentIfPresent(const TestInfo& test_info) {<br>
class PrettyUnitTestResultPrinter : public TestEventListener {<br>
public:<br>
PrettyUnitTestResultPrinter() {}<br>
- static void PrintTestName(const char * test_case, const char * test) {<br>
- printf("%s.%s", test_case, test);<br>
+ static void PrintTestName(const char* test_suite, const char* test) {<br>
+ printf("%s.%s", test_suite, test);<br>
}<br>
<br>
// The following methods override what's in the TestEventListener class.<br>
- virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}<br>
- virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);<br>
- virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);<br>
- virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}<br>
- virtual void OnTestCaseStart(const TestCase& test_case);<br>
- virtual void OnTestStart(const TestInfo& test_info);<br>
- virtual void OnTestPartResult(const TestPartResult& result);<br>
- virtual void OnTestEnd(const TestInfo& test_info);<br>
- virtual void OnTestCaseEnd(const TestCase& test_case);<br>
- virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);<br>
- virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}<br>
- virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);<br>
- virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}<br>
+ void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}<br>
+ void OnTestIterationStart(const UnitTest& unit_test, int iteration) override;<br>
+ void OnEnvironmentsSetUpStart(const UnitTest& unit_test) override;<br>
+ void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {}<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ void OnTestCaseStart(const TestCase& test_case) override;<br>
+#else<br>
+ void OnTestSuiteStart(const TestSuite& test_suite) override;<br>
+#endif // OnTestCaseStart<br>
+<br>
+ void OnTestStart(const TestInfo& test_info) override;<br>
+<br>
+ void OnTestPartResult(const TestPartResult& result) override;<br>
+ void OnTestEnd(const TestInfo& test_info) override;<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ void OnTestCaseEnd(const TestCase& test_case) override;<br>
+#else<br>
+ void OnTestSuiteEnd(const TestSuite& test_suite) override;<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
+ void OnEnvironmentsTearDownStart(const UnitTest& unit_test) override;<br>
+ void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {}<br>
+ void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;<br>
+ void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}<br>
<br>
private:<br>
static void PrintFailedTests(const UnitTest& unit_test);<br>
+ static void PrintSkippedTests(const UnitTest& unit_test);<br>
};<br>
<br>
// Fired before each iteration of tests starts.<br>
@@ -3153,7 +3169,7 @@ void PrettyUnitTestResultPrinter::OnTestIterationStart(<br>
ColoredPrintf(COLOR_GREEN, "[==========] ");<br>
printf("Running %s from %s.\n",<br>
FormatTestCount(unit_test.test_to_run_count()).c_str(),<br>
- FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());<br>
+ FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str());<br>
fflush(stdout);<br>
}<br>
<br>
@@ -3164,22 +3180,38 @@ void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(<br>
fflush(stdout);<br>
}<br>
<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {<br>
const std::string counts =<br>
FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");<br>
ColoredPrintf(COLOR_GREEN, "[----------] ");<br>
printf("%s from %s", counts.c_str(), <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>());<br>
- if (test_case.type_param() == NULL) {<br>
+ if (test_case.type_param() == nullptr) {<br>
printf("\n");<br>
} else {<br>
printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param());<br>
}<br>
fflush(stdout);<br>
}<br>
+#else<br>
+void PrettyUnitTestResultPrinter::OnTestSuiteStart(<br>
+ const TestSuite& test_suite) {<br>
+ const std::string counts =<br>
+ FormatCountableNoun(test_suite.test_to_run_count(), "test", "tests");<br>
+ ColoredPrintf(COLOR_GREEN, "[----------] ");<br>
+ printf("%s from %s", counts.c_str(), <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>());<br>
+ if (test_suite.type_param() == nullptr) {<br>
+ printf("\n");<br>
+ } else {<br>
+ printf(", where %s = %s\n", kTypeParamLabel, test_suite.type_param());<br>
+ }<br>
+ fflush(stdout);<br>
+}<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {<br>
ColoredPrintf(COLOR_GREEN, "[ RUN ] ");<br>
- PrintTestName(test_info.test_case_name(), <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
+ PrintTestName(test_info.test_suite_name(), <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
printf("\n");<br>
fflush(stdout);<br>
}<br>
@@ -3187,22 +3219,29 @@ void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {<br>
// Called after an assertion failure.<br>
void PrettyUnitTestResultPrinter::OnTestPartResult(<br>
const TestPartResult& result) {<br>
- // If the test part succeeded, we don't need to do anything.<br>
- if (result.type() == TestPartResult::kSuccess)<br>
- return;<br>
-<br>
- // Print failure message from the assertion (e.g. expected this and got that).<br>
- PrintTestPartResult(result);<br>
- fflush(stdout);<br>
+ switch (result.type()) {<br>
+ // If the test part succeeded, or was skipped,<br>
+ // we don't need to do anything.<br>
+ case TestPartResult::kSkip:<br>
+ case TestPartResult::kSuccess:<br>
+ return;<br>
+ default:<br>
+ // Print failure message from the assertion<br>
+ // (e.g. expected this and got that).<br>
+ PrintTestPartResult(result);<br>
+ fflush(stdout);<br>
+ }<br>
}<br>
<br>
void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {<br>
if (test_info.result()->Passed()) {<br>
ColoredPrintf(COLOR_GREEN, "[ OK ] ");<br>
+ } else if (test_info.result()->Skipped()) {<br>
+ ColoredPrintf(COLOR_GREEN, "[ SKIPPED ] ");<br>
} else {<br>
ColoredPrintf(COLOR_RED, "[ FAILED ] ");<br>
}<br>
- PrintTestName(test_info.test_case_name(), <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
+ PrintTestName(test_info.test_suite_name(), <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
if (test_info.result()->Failed())<br>
PrintFullTestCommentIfPresent(test_info);<br>
<br>
@@ -3215,17 +3254,29 @@ void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {<br>
fflush(stdout);<br>
}<br>
<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {<br>
if (!GTEST_FLAG(print_time)) return;<br>
<br>
const std::string counts =<br>
FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");<br>
ColoredPrintf(COLOR_GREEN, "[----------] ");<br>
- printf("%s from %s (%s ms total)\n\n",<br>
- counts.c_str(), <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>(),<br>
+ printf("%s from %s (%s ms total)\n\n", counts.c_str(), <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>(),<br>
internal::StreamableToString(test_case.elapsed_time()).c_str());<br>
fflush(stdout);<br>
}<br>
+#else<br>
+void PrettyUnitTestResultPrinter::OnTestSuiteEnd(const TestSuite& test_suite) {<br>
+ if (!GTEST_FLAG(print_time)) return;<br>
+<br>
+ const std::string counts =<br>
+ FormatCountableNoun(test_suite.test_to_run_count(), "test", "tests");<br>
+ ColoredPrintf(COLOR_GREEN, "[----------] ");<br>
+ printf("%s from %s (%s ms total)\n\n", counts.c_str(), <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>(),<br>
+ internal::StreamableToString(test_suite.elapsed_time()).c_str());<br>
+ fflush(stdout);<br>
+}<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(<br>
const UnitTest& /*unit_test*/) {<br>
@@ -3241,30 +3292,54 @@ void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {<br>
return;<br>
}<br>
<br>
- for (int i = 0; i < unit_test.total_test_case_count(); ++i) {<br>
- const TestCase& test_case = *unit_test.GetTestCase(i);<br>
- if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {<br>
+ for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {<br>
+ const TestSuite& test_suite = *unit_test.GetTestSuite(i);<br>
+ if (!test_suite.should_run() || (test_suite.failed_test_count() == 0)) {<br>
continue;<br>
}<br>
- for (int j = 0; j < test_case.total_test_count(); ++j) {<br>
- const TestInfo& test_info = *test_case.GetTestInfo(j);<br>
- if (!test_info.should_run() || test_info.result()->Passed()) {<br>
+ for (int j = 0; j < test_suite.total_test_count(); ++j) {<br>
+ const TestInfo& test_info = *test_suite.GetTestInfo(j);<br>
+ if (!test_info.should_run() || !test_info.result()->Failed()) {<br>
continue;<br>
}<br>
ColoredPrintf(COLOR_RED, "[ FAILED ] ");<br>
- printf("%s.%s", <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>(), <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
+ printf("%s.%s", <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>(), <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
PrintFullTestCommentIfPresent(test_info);<br>
printf("\n");<br>
}<br>
}<br>
}<br>
<br>
+// Internal helper for printing the list of skipped tests.<br>
+void PrettyUnitTestResultPrinter::PrintSkippedTests(const UnitTest& unit_test) {<br>
+ const int skipped_test_count = unit_test.skipped_test_count();<br>
+ if (skipped_test_count == 0) {<br>
+ return;<br>
+ }<br>
+<br>
+ for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {<br>
+ const TestSuite& test_suite = *unit_test.GetTestSuite(i);<br>
+ if (!test_suite.should_run() || (test_suite.skipped_test_count() == 0)) {<br>
+ continue;<br>
+ }<br>
+ for (int j = 0; j < test_suite.total_test_count(); ++j) {<br>
+ const TestInfo& test_info = *test_suite.GetTestInfo(j);<br>
+ if (!test_info.should_run() || !test_info.result()->Skipped()) {<br>
+ continue;<br>
+ }<br>
+ ColoredPrintf(COLOR_GREEN, "[ SKIPPED ] ");<br>
+ printf("%s.%s", <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>(), <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
+ printf("\n");<br>
+ }<br>
+ }<br>
+}<br>
+<br>
void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,<br>
int /*iteration*/) {<br>
ColoredPrintf(COLOR_GREEN, "[==========] ");<br>
printf("%s from %s ran.",<br>
FormatTestCount(unit_test.test_to_run_count()).c_str(),<br>
- FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());<br>
+ FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str());<br>
if (GTEST_FLAG(print_time)) {<br>
printf(" (%s ms total)",<br>
internal::StreamableToString(unit_test.elapsed_time()).c_str());<br>
@@ -3273,6 +3348,13 @@ void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,<br>
ColoredPrintf(COLOR_GREEN, "[ PASSED ] ");<br>
printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());<br>
<br>
+ const int skipped_test_count = unit_test.skipped_test_count();<br>
+ if (skipped_test_count > 0) {<br>
+ ColoredPrintf(COLOR_GREEN, "[ SKIPPED ] ");<br>
+ printf("%s, listed below:\n", FormatTestCount(skipped_test_count).c_str());<br>
+ PrintSkippedTests(unit_test);<br>
+ }<br>
+<br>
int num_failures = unit_test.failed_test_count();<br>
if (!unit_test.Passed()) {<br>
const int failed_test_count = unit_test.failed_test_count();<br>
@@ -3305,7 +3387,7 @@ void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,<br>
class TestEventRepeater : public TestEventListener {<br>
public:<br>
TestEventRepeater() : forwarding_enabled_(true) {}<br>
- virtual ~TestEventRepeater();<br>
+ ~TestEventRepeater() override;<br>
void Append(TestEventListener *listener);<br>
TestEventListener* Release(TestEventListener* listener);<br>
<br>
@@ -3314,19 +3396,27 @@ class TestEventRepeater : public TestEventListener {<br>
bool forwarding_enabled() const { return forwarding_enabled_; }<br>
void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }<br>
<br>
- virtual void OnTestProgramStart(const UnitTest& unit_test);<br>
- virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);<br>
- virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);<br>
- virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);<br>
- virtual void OnTestCaseStart(const TestCase& test_case);<br>
- virtual void OnTestStart(const TestInfo& test_info);<br>
- virtual void OnTestPartResult(const TestPartResult& result);<br>
- virtual void OnTestEnd(const TestInfo& test_info);<br>
- virtual void OnTestCaseEnd(const TestCase& test_case);<br>
- virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);<br>
- virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);<br>
- virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);<br>
- virtual void OnTestProgramEnd(const UnitTest& unit_test);<br>
+ void OnTestProgramStart(const UnitTest& unit_test) override;<br>
+ void OnTestIterationStart(const UnitTest& unit_test, int iteration) override;<br>
+ void OnEnvironmentsSetUpStart(const UnitTest& unit_test) override;<br>
+ void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) override;<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ void OnTestCaseStart(const TestSuite& parameter) override;<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ void OnTestSuiteStart(const TestSuite& parameter) override;<br>
+ void OnTestStart(const TestInfo& test_info) override;<br>
+ void OnTestPartResult(const TestPartResult& result) override;<br>
+ void OnTestEnd(const TestInfo& test_info) override;<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ void OnTestCaseEnd(const TestCase& parameter) override;<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+ void OnTestSuiteEnd(const TestSuite& parameter) override;<br>
+ void OnEnvironmentsTearDownStart(const UnitTest& unit_test) override;<br>
+ void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) override;<br>
+ void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;<br>
+ void OnTestProgramEnd(const UnitTest& unit_test) override;<br>
<br>
private:<br>
// Controls whether events will be forwarded to listeners_. Set to false<br>
@@ -3346,16 +3436,15 @@ void TestEventRepeater::Append(TestEventListener *listener) {<br>
listeners_.push_back(listener);<br>
}<br>
<br>
-// FIXME: Factor the search functionality into Vector::Find.<br>
TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {<br>
for (size_t i = 0; i < listeners_.size(); ++i) {<br>
if (listeners_[i] == listener) {<br>
- listeners_.erase(listeners_.begin() + i);<br>
+ listeners_.erase(listeners_.begin() + static_cast<int>(i));<br>
return listener;<br>
}<br>
}<br>
<br>
- return NULL;<br>
+ return nullptr;<br>
}<br>
<br>
// Since most methods are very similar, use macros to reduce boilerplate.<br>
@@ -3370,25 +3459,33 @@ void TestEventRepeater::Name(const Type& parameter) { \<br>
}<br>
// This defines a member that forwards the call to all listeners in reverse<br>
// order.<br>
-#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \<br>
-void TestEventRepeater::Name(const Type& parameter) { \<br>
- if (forwarding_enabled_) { \<br>
- for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \<br>
- listeners_[i]->Name(parameter); \<br>
- } \<br>
- } \<br>
-}<br>
+#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \<br>
+ void TestEventRepeater::Name(const Type& parameter) { \<br>
+ if (forwarding_enabled_) { \<br>
+ for (size_t i = listeners_.size(); i != 0; i--) { \<br>
+ listeners_[i - 1]->Name(parameter); \<br>
+ } \<br>
+ } \<br>
+ }<br>
<br>
GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)<br>
GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)<br>
-GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+GTEST_REPEATER_METHOD_(OnTestCaseStart, TestSuite)<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+GTEST_REPEATER_METHOD_(OnTestSuiteStart, TestSuite)<br>
GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)<br>
GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)<br>
GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)<br>
GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)<br>
GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)<br>
GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)<br>
-GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestSuite)<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+GTEST_REVERSE_REPEATER_METHOD_(OnTestSuiteEnd, TestSuite)<br>
GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)<br>
<br>
#undef GTEST_REPEATER_METHOD_<br>
@@ -3406,8 +3503,8 @@ void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,<br>
void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,<br>
int iteration) {<br>
if (forwarding_enabled_) {<br>
- for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {<br>
- listeners_[i]->OnTestIterationEnd(unit_test, iteration);<br>
+ for (size_t i = listeners_.size(); i > 0; i--) {<br>
+ listeners_[i - 1]->OnTestIterationEnd(unit_test, iteration);<br>
}<br>
}<br>
}<br>
@@ -3419,12 +3516,12 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener {<br>
public:<br>
explicit XmlUnitTestResultPrinter(const char* output_file);<br>
<br>
- virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);<br>
- void ListTestsMatchingFilter(const std::vector<TestCase*>& test_cases);<br>
+ void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;<br>
+ void ListTestsMatchingFilter(const std::vector<TestSuite*>& test_suites);<br>
<br>
// Prints an XML summary of all unit tests.<br>
static void PrintXmlTestsList(std::ostream* stream,<br>
- const std::vector<TestCase*>& test_cases);<br>
+ const std::vector<TestSuite*>& test_suites);<br>
<br>
private:<br>
// Is c a whitespace character that is normalized to a space character<br>
@@ -3469,12 +3566,12 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener {<br>
<br>
// Streams an XML representation of a TestInfo object.<br>
static void OutputXmlTestInfo(::std::ostream* stream,<br>
- const char* test_case_name,<br>
+ const char* test_suite_name,<br>
const TestInfo& test_info);<br>
<br>
- // Prints an XML representation of a TestCase object<br>
- static void PrintXmlTestCase(::std::ostream* stream,<br>
- const TestCase& test_case);<br>
+ // Prints an XML representation of a TestSuite object<br>
+ static void PrintXmlTestSuite(::std::ostream* stream,<br>
+ const TestSuite& test_suite);<br>
<br>
// Prints an XML summary of unit_test to output stream out.<br>
static void PrintXmlUnitTest(::std::ostream* stream,<br>
@@ -3516,10 +3613,10 @@ void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,<br>
}<br>
<br>
void XmlUnitTestResultPrinter::ListTestsMatchingFilter(<br>
- const std::vector<TestCase*>& test_cases) {<br>
+ const std::vector<TestSuite*>& test_suites) {<br>
FILE* xmlout = OpenFileForWriting(output_file_);<br>
std::stringstream stream;<br>
- PrintXmlTestsList(&stream, test_cases);<br>
+ PrintXmlTestsList(&stream, test_suites);<br>
fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());<br>
fclose(xmlout);<br>
}<br>
@@ -3534,8 +3631,6 @@ void XmlUnitTestResultPrinter::ListTestsMatchingFilter(<br>
// module will consist of ordinary English text.<br>
// If this module is ever modified to produce version 1.1 XML output,<br>
// most invalid characters can be retained using character references.<br>
-// FIXME: It might be nice to have a minimally invasive, human-readable<br>
-// escaping scheme for invalid characters, rather than dropping them.<br>
std::string XmlUnitTestResultPrinter::EscapeXml(<br>
const std::string& str, bool is_attribute) {<br>
Message m;<br>
@@ -3600,7 +3695,7 @@ std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(<br>
// This is how Google Test concepts map to the DTD:<br>
//<br>
// <testsuites name="AllTests"> <-- corresponds to a UnitTest object<br>
-// <testsuite name="testcase-name"> <-- corresponds to a TestCase object<br>
+// <testsuite name="testcase-name"> <-- corresponds to a TestSuite object<br>
// <testcase name="test-name"> <-- corresponds to a TestInfo object<br>
// <failure message="...">...</failure><br>
// <failure message="...">...</failure><br>
@@ -3624,12 +3719,11 @@ static bool PortableLocaltime(time_t seconds, struct tm* out) {<br>
// MINGW <time.h> provides neither localtime_r nor localtime_s, but uses<br>
// Windows' localtime(), which has a thread-local tm buffer.<br>
struct tm* tm_ptr = localtime(&seconds); // NOLINT<br>
- if (tm_ptr == NULL)<br>
- return false;<br>
+ if (tm_ptr == nullptr) return false;<br>
*out = *tm_ptr;<br>
return true;<br>
#else<br>
- return localtime_r(&seconds, out) != NULL;<br>
+ return localtime_r(&seconds, out) != nullptr;<br>
#endif<br>
}<br>
<br>
@@ -3655,7 +3749,7 @@ void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,<br>
*stream << "<![CDATA[";<br>
for (;;) {<br>
const char* const next_segment = strstr(segment, "]]>");<br>
- if (next_segment != NULL) {<br>
+ if (next_segment != nullptr) {<br>
stream->write(<br>
segment, static_cast<std::streamsize>(next_segment - segment));<br>
*stream << "]]>]]><![CDATA[";<br>
@@ -3674,7 +3768,7 @@ void XmlUnitTestResultPrinter::OutputXmlAttribute(<br>
const std::string& name,<br>
const std::string& value) {<br>
const std::vector<std::string>& allowed_names =<br>
- GetReservedAttributesForElement(element_name);<br>
+ GetReservedOutputAttributesForElement(element_name);<br>
<br>
GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=<br>
allowed_names.end())<br>
@@ -3685,40 +3779,47 @@ void XmlUnitTestResultPrinter::OutputXmlAttribute(<br>
}<br>
<br>
// Prints an XML representation of a TestInfo object.<br>
-// FIXME: There is also value in printing properties with the plain printer.<br>
void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,<br>
- const char* test_case_name,<br>
+ const char* test_suite_name,<br>
const TestInfo& test_info) {<br>
const TestResult& result = *test_info.result();<br>
- const std::string kTestcase = "testcase";<br>
+ const std::string kTestsuite = "testcase";<br>
<br>
if (test_info.is_in_another_shard()) {<br>
return;<br>
}<br>
<br>
*stream << " <testcase";<br>
- OutputXmlAttribute(stream, kTestcase, "name", <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
+ OutputXmlAttribute(stream, kTestsuite, "name", <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
<br>
- if (test_info.value_param() != NULL) {<br>
- OutputXmlAttribute(stream, kTestcase, "value_param",<br>
+ if (test_info.value_param() != nullptr) {<br>
+ OutputXmlAttribute(stream, kTestsuite, "value_param",<br>
test_info.value_param());<br>
}<br>
- if (test_info.type_param() != NULL) {<br>
- OutputXmlAttribute(stream, kTestcase, "type_param", test_info.type_param());<br>
+ if (test_info.type_param() != nullptr) {<br>
+ OutputXmlAttribute(stream, kTestsuite, "type_param",<br>
+ test_info.type_param());<br>
}<br>
if (GTEST_FLAG(list_tests)) {<br>
- OutputXmlAttribute(stream, kTestcase, "file", test_info.file());<br>
- OutputXmlAttribute(stream, kTestcase, "line",<br>
+ OutputXmlAttribute(stream, kTestsuite, "file", test_info.file());<br>
+ OutputXmlAttribute(stream, kTestsuite, "line",<br>
StreamableToString(test_info.line()));<br>
*stream << " />\n";<br>
return;<br>
}<br>
<br>
- OutputXmlAttribute(stream, kTestcase, "status",<br>
+ OutputXmlAttribute(stream, kTestsuite, "status",<br>
test_info.should_run() ? "run" : "notrun");<br>
- OutputXmlAttribute(stream, kTestcase, "time",<br>
+ OutputXmlAttribute(stream, kTestsuite, "result",<br>
+ test_info.should_run()<br>
+ ? (result.Skipped() ? "skipped" : "completed")<br>
+ : "suppressed");<br>
+ OutputXmlAttribute(stream, kTestsuite, "time",<br>
FormatTimeInMillisAsSeconds(result.elapsed_time()));<br>
- OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);<br>
+ OutputXmlAttribute(<br>
+ stream, kTestsuite, "timestamp",<br>
+ FormatEpochTimeInMillisAsIso8601(result.start_timestamp()));<br>
+ OutputXmlAttribute(stream, kTestsuite, "classname", test_suite_name);<br>
<br>
int failures = 0;<br>
for (int i = 0; i < result.total_part_count(); ++i) {<br>
@@ -3751,29 +3852,32 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,<br>
}<br>
}<br>
<br>
-// Prints an XML representation of a TestCase object<br>
-void XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream,<br>
- const TestCase& test_case) {<br>
+// Prints an XML representation of a TestSuite object<br>
+void XmlUnitTestResultPrinter::PrintXmlTestSuite(std::ostream* stream,<br>
+ const TestSuite& test_suite) {<br>
const std::string kTestsuite = "testsuite";<br>
*stream << " <" << kTestsuite;<br>
- OutputXmlAttribute(stream, kTestsuite, "name", <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>());<br>
+ OutputXmlAttribute(stream, kTestsuite, "name", <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>());<br>
OutputXmlAttribute(stream, kTestsuite, "tests",<br>
- StreamableToString(test_case.reportable_test_count()));<br>
+ StreamableToString(test_suite.reportable_test_count()));<br>
if (!GTEST_FLAG(list_tests)) {<br>
OutputXmlAttribute(stream, kTestsuite, "failures",<br>
- StreamableToString(test_case.failed_test_count()));<br>
+ StreamableToString(test_suite.failed_test_count()));<br>
OutputXmlAttribute(<br>
stream, kTestsuite, "disabled",<br>
- StreamableToString(test_case.reportable_disabled_test_count()));<br>
+ StreamableToString(test_suite.reportable_disabled_test_count()));<br>
OutputXmlAttribute(stream, kTestsuite, "errors", "0");<br>
OutputXmlAttribute(stream, kTestsuite, "time",<br>
- FormatTimeInMillisAsSeconds(test_case.elapsed_time()));<br>
- *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result());<br>
+ FormatTimeInMillisAsSeconds(test_suite.elapsed_time()));<br>
+ OutputXmlAttribute(<br>
+ stream, kTestsuite, "timestamp",<br>
+ FormatEpochTimeInMillisAsIso8601(test_suite.start_timestamp()));<br>
+ *stream << TestPropertiesAsXmlAttributes(test_suite.ad_hoc_test_result());<br>
}<br>
*stream << ">\n";<br>
- for (int i = 0; i < test_case.total_test_count(); ++i) {<br>
- if (test_case.GetTestInfo(i)->is_reportable())<br>
- OutputXmlTestInfo(stream, <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>(), *test_case.GetTestInfo(i));<br>
+ for (int i = 0; i < test_suite.total_test_count(); ++i) {<br>
+ if (test_suite.GetTestInfo(i)->is_reportable())<br>
+ OutputXmlTestInfo(stream, <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>(), *test_suite.GetTestInfo(i));<br>
}<br>
*stream << " </" << kTestsuite << ">\n";<br>
}<br>
@@ -3794,11 +3898,11 @@ void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,<br>
stream, kTestsuites, "disabled",<br>
StreamableToString(unit_test.reportable_disabled_test_count()));<br>
OutputXmlAttribute(stream, kTestsuites, "errors", "0");<br>
+ OutputXmlAttribute(stream, kTestsuites, "time",<br>
+ FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));<br>
OutputXmlAttribute(<br>
stream, kTestsuites, "timestamp",<br>
FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));<br>
- OutputXmlAttribute(stream, kTestsuites, "time",<br>
- FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));<br>
<br>
if (GTEST_FLAG(shuffle)) {<br>
OutputXmlAttribute(stream, kTestsuites, "random_seed",<br>
@@ -3809,31 +3913,31 @@ void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,<br>
OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");<br>
*stream << ">\n";<br>
<br>
- for (int i = 0; i < unit_test.total_test_case_count(); ++i) {<br>
- if (unit_test.GetTestCase(i)->reportable_test_count() > 0)<br>
- PrintXmlTestCase(stream, *unit_test.GetTestCase(i));<br>
+ for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {<br>
+ if (unit_test.GetTestSuite(i)->reportable_test_count() > 0)<br>
+ PrintXmlTestSuite(stream, *unit_test.GetTestSuite(i));<br>
}<br>
*stream << "</" << kTestsuites << ">\n";<br>
}<br>
<br>
void XmlUnitTestResultPrinter::PrintXmlTestsList(<br>
- std::ostream* stream, const std::vector<TestCase*>& test_cases) {<br>
+ std::ostream* stream, const std::vector<TestSuite*>& test_suites) {<br>
const std::string kTestsuites = "testsuites";<br>
<br>
*stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";<br>
*stream << "<" << kTestsuites;<br>
<br>
int total_tests = 0;<br>
- for (size_t i = 0; i < test_cases.size(); ++i) {<br>
- total_tests += test_cases[i]->total_test_count();<br>
+ for (auto test_suite : test_suites) {<br>
+ total_tests += test_suite->total_test_count();<br>
}<br>
OutputXmlAttribute(stream, kTestsuites, "tests",<br>
StreamableToString(total_tests));<br>
OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");<br>
*stream << ">\n";<br>
<br>
- for (size_t i = 0; i < test_cases.size(); ++i) {<br>
- PrintXmlTestCase(stream, *test_cases[i]);<br>
+ for (auto test_suite : test_suites) {<br>
+ PrintXmlTestSuite(stream, *test_suite);<br>
}<br>
*stream << "</" << kTestsuites << ">\n";<br>
}<br>
@@ -3878,11 +3982,11 @@ class JsonUnitTestResultPrinter : public EmptyTestEventListener {<br>
public:<br>
explicit JsonUnitTestResultPrinter(const char* output_file);<br>
<br>
- virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);<br>
+ void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;<br>
<br>
// Prints an JSON summary of all unit tests.<br>
static void PrintJsonTestList(::std::ostream* stream,<br>
- const std::vector<TestCase*>& test_cases);<br>
+ const std::vector<TestSuite*>& test_suites);<br>
<br>
private:<br>
// Returns an JSON-escaped copy of the input string str.<br>
@@ -3905,12 +4009,12 @@ class JsonUnitTestResultPrinter : public EmptyTestEventListener {<br>
<br>
// Streams a JSON representation of a TestInfo object.<br>
static void OutputJsonTestInfo(::std::ostream* stream,<br>
- const char* test_case_name,<br>
+ const char* test_suite_name,<br>
const TestInfo& test_info);<br>
<br>
- // Prints a JSON representation of a TestCase object<br>
- static void PrintJsonTestCase(::std::ostream* stream,<br>
- const TestCase& test_case);<br>
+ // Prints a JSON representation of a TestSuite object<br>
+ static void PrintJsonTestSuite(::std::ostream* stream,<br>
+ const TestSuite& test_suite);<br>
<br>
// Prints a JSON summary of unit_test to output stream out.<br>
static void PrintJsonUnitTest(::std::ostream* stream,<br>
@@ -4009,7 +4113,7 @@ static std::string FormatEpochTimeInMillisAsRFC3339(TimeInMillis ms) {<br>
String::FormatIntWidth2(time_struct.tm_sec) + "Z";<br>
}<br>
<br>
-static inline std::string Indent(int width) {<br>
+static inline std::string Indent(size_t width) {<br>
return std::string(width, ' ');<br>
}<br>
<br>
@@ -4021,7 +4125,7 @@ void JsonUnitTestResultPrinter::OutputJsonKey(<br>
const std::string& indent,<br>
bool comma) {<br>
const std::vector<std::string>& allowed_names =<br>
- GetReservedAttributesForElement(element_name);<br>
+ GetReservedOutputAttributesForElement(element_name);<br>
<br>
GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=<br>
allowed_names.end())<br>
@@ -4041,7 +4145,7 @@ void JsonUnitTestResultPrinter::OutputJsonKey(<br>
const std::string& indent,<br>
bool comma) {<br>
const std::vector<std::string>& allowed_names =<br>
- GetReservedAttributesForElement(element_name);<br>
+ GetReservedOutputAttributesForElement(element_name);<br>
<br>
GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=<br>
allowed_names.end())<br>
@@ -4055,35 +4159,44 @@ void JsonUnitTestResultPrinter::OutputJsonKey(<br>
<br>
// Prints a JSON representation of a TestInfo object.<br>
void JsonUnitTestResultPrinter::OutputJsonTestInfo(::std::ostream* stream,<br>
- const char* test_case_name,<br>
+ const char* test_suite_name,<br>
const TestInfo& test_info) {<br>
const TestResult& result = *test_info.result();<br>
- const std::string kTestcase = "testcase";<br>
+ const std::string kTestsuite = "testcase";<br>
const std::string kIndent = Indent(10);<br>
<br>
*stream << Indent(8) << "{\n";<br>
- OutputJsonKey(stream, kTestcase, "name", <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>(), kIndent);<br>
+ OutputJsonKey(stream, kTestsuite, "name", <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>(), kIndent);<br>
<br>
- if (test_info.value_param() != NULL) {<br>
- OutputJsonKey(stream, kTestcase, "value_param",<br>
- test_info.value_param(), kIndent);<br>
+ if (test_info.value_param() != nullptr) {<br>
+ OutputJsonKey(stream, kTestsuite, "value_param", test_info.value_param(),<br>
+ kIndent);<br>
}<br>
- if (test_info.type_param() != NULL) {<br>
- OutputJsonKey(stream, kTestcase, "type_param", test_info.type_param(),<br>
+ if (test_info.type_param() != nullptr) {<br>
+ OutputJsonKey(stream, kTestsuite, "type_param", test_info.type_param(),<br>
kIndent);<br>
}<br>
if (GTEST_FLAG(list_tests)) {<br>
- OutputJsonKey(stream, kTestcase, "file", test_info.file(), kIndent);<br>
- OutputJsonKey(stream, kTestcase, "line", test_info.line(), kIndent, false);<br>
+ OutputJsonKey(stream, kTestsuite, "file", test_info.file(), kIndent);<br>
+ OutputJsonKey(stream, kTestsuite, "line", test_info.line(), kIndent, false);<br>
*stream << "\n" << Indent(8) << "}";<br>
return;<br>
}<br>
<br>
- OutputJsonKey(stream, kTestcase, "status",<br>
+ OutputJsonKey(stream, kTestsuite, "status",<br>
test_info.should_run() ? "RUN" : "NOTRUN", kIndent);<br>
- OutputJsonKey(stream, kTestcase, "time",<br>
+ OutputJsonKey(stream, kTestsuite, "result",<br>
+ test_info.should_run()<br>
+ ? (result.Skipped() ? "SKIPPED" : "COMPLETED")<br>
+ : "SUPPRESSED",<br>
+ kIndent);<br>
+ OutputJsonKey(stream, kTestsuite, "timestamp",<br>
+ FormatEpochTimeInMillisAsRFC3339(result.start_timestamp()),<br>
+ kIndent);<br>
+ OutputJsonKey(stream, kTestsuite, "time",<br>
FormatTimeInMillisAsDuration(result.elapsed_time()), kIndent);<br>
- OutputJsonKey(stream, kTestcase, "classname", test_case_name, kIndent, false);<br>
+ OutputJsonKey(stream, kTestsuite, "classname", test_suite_name, kIndent,<br>
+ false);<br>
*stream << TestPropertiesAsJson(result, kIndent);<br>
<br>
int failures = 0;<br>
@@ -4110,40 +4223,44 @@ void JsonUnitTestResultPrinter::OutputJsonTestInfo(::std::ostream* stream,<br>
*stream << "\n" << Indent(8) << "}";<br>
}<br>
<br>
-// Prints an JSON representation of a TestCase object<br>
-void JsonUnitTestResultPrinter::PrintJsonTestCase(std::ostream* stream,<br>
- const TestCase& test_case) {<br>
+// Prints an JSON representation of a TestSuite object<br>
+void JsonUnitTestResultPrinter::PrintJsonTestSuite(<br>
+ std::ostream* stream, const TestSuite& test_suite) {<br>
const std::string kTestsuite = "testsuite";<br>
const std::string kIndent = Indent(6);<br>
<br>
*stream << Indent(4) << "{\n";<br>
- OutputJsonKey(stream, kTestsuite, "name", <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>(), kIndent);<br>
- OutputJsonKey(stream, kTestsuite, "tests", test_case.reportable_test_count(),<br>
+ OutputJsonKey(stream, kTestsuite, "name", <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>(), kIndent);<br>
+ OutputJsonKey(stream, kTestsuite, "tests", test_suite.reportable_test_count(),<br>
kIndent);<br>
if (!GTEST_FLAG(list_tests)) {<br>
- OutputJsonKey(stream, kTestsuite, "failures", test_case.failed_test_count(),<br>
- kIndent);<br>
+ OutputJsonKey(stream, kTestsuite, "failures",<br>
+ test_suite.failed_test_count(), kIndent);<br>
OutputJsonKey(stream, kTestsuite, "disabled",<br>
- test_case.reportable_disabled_test_count(), kIndent);<br>
+ test_suite.reportable_disabled_test_count(), kIndent);<br>
OutputJsonKey(stream, kTestsuite, "errors", 0, kIndent);<br>
+ OutputJsonKey(<br>
+ stream, kTestsuite, "timestamp",<br>
+ FormatEpochTimeInMillisAsRFC3339(test_suite.start_timestamp()),<br>
+ kIndent);<br>
OutputJsonKey(stream, kTestsuite, "time",<br>
- FormatTimeInMillisAsDuration(test_case.elapsed_time()),<br>
+ FormatTimeInMillisAsDuration(test_suite.elapsed_time()),<br>
kIndent, false);<br>
- *stream << TestPropertiesAsJson(test_case.ad_hoc_test_result(), kIndent)<br>
+ *stream << TestPropertiesAsJson(test_suite.ad_hoc_test_result(), kIndent)<br>
<< ",\n";<br>
}<br>
<br>
*stream << kIndent << "\"" << kTestsuite << "\": [\n";<br>
<br>
bool comma = false;<br>
- for (int i = 0; i < test_case.total_test_count(); ++i) {<br>
- if (test_case.GetTestInfo(i)->is_reportable()) {<br>
+ for (int i = 0; i < test_suite.total_test_count(); ++i) {<br>
+ if (test_suite.GetTestInfo(i)->is_reportable()) {<br>
if (comma) {<br>
*stream << ",\n";<br>
} else {<br>
comma = true;<br>
}<br>
- OutputJsonTestInfo(stream, <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>(), *test_case.GetTestInfo(i));<br>
+ OutputJsonTestInfo(stream, <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>(), *test_suite.GetTestInfo(i));<br>
}<br>
}<br>
*stream << "\n" << kIndent << "]\n" << Indent(4) << "}";<br>
@@ -4181,14 +4298,14 @@ void JsonUnitTestResultPrinter::PrintJsonUnitTest(std::ostream* stream,<br>
*stream << kIndent << "\"" << kTestsuites << "\": [\n";<br>
<br>
bool comma = false;<br>
- for (int i = 0; i < unit_test.total_test_case_count(); ++i) {<br>
- if (unit_test.GetTestCase(i)->reportable_test_count() > 0) {<br>
+ for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {<br>
+ if (unit_test.GetTestSuite(i)->reportable_test_count() > 0) {<br>
if (comma) {<br>
*stream << ",\n";<br>
} else {<br>
comma = true;<br>
}<br>
- PrintJsonTestCase(stream, *unit_test.GetTestCase(i));<br>
+ PrintJsonTestSuite(stream, *unit_test.GetTestSuite(i));<br>
}<br>
}<br>
<br>
@@ -4196,24 +4313,24 @@ void JsonUnitTestResultPrinter::PrintJsonUnitTest(std::ostream* stream,<br>
}<br>
<br>
void JsonUnitTestResultPrinter::PrintJsonTestList(<br>
- std::ostream* stream, const std::vector<TestCase*>& test_cases) {<br>
+ std::ostream* stream, const std::vector<TestSuite*>& test_suites) {<br>
const std::string kTestsuites = "testsuites";<br>
const std::string kIndent = Indent(2);<br>
*stream << "{\n";<br>
int total_tests = 0;<br>
- for (size_t i = 0; i < test_cases.size(); ++i) {<br>
- total_tests += test_cases[i]->total_test_count();<br>
+ for (auto test_suite : test_suites) {<br>
+ total_tests += test_suite->total_test_count();<br>
}<br>
OutputJsonKey(stream, kTestsuites, "tests", total_tests, kIndent);<br>
<br>
OutputJsonKey(stream, kTestsuites, "name", "AllTests", kIndent);<br>
*stream << kIndent << "\"" << kTestsuites << "\": [\n";<br>
<br>
- for (size_t i = 0; i < test_cases.size(); ++i) {<br>
+ for (size_t i = 0; i < test_suites.size(); ++i) {<br>
if (i != 0) {<br>
*stream << ",\n";<br>
}<br>
- PrintJsonTestCase(stream, *test_cases[i]);<br>
+ PrintJsonTestSuite(stream, *test_suites[i]);<br>
}<br>
<br>
*stream << "\n"<br>
@@ -4269,7 +4386,7 @@ void StreamingListener::SocketWriter::MakeConnection() {<br>
memset(&hints, 0, sizeof(hints));<br>
hints.ai_family = AF_UNSPEC; // To allow both IPv4 and IPv6 addresses.<br>
hints.ai_socktype = SOCK_STREAM;<br>
- addrinfo* servinfo = NULL;<br>
+ addrinfo* servinfo = nullptr;<br>
<br>
// Use the getaddrinfo() to get a linked list of IP addresses for<br>
// the given host name.<br>
@@ -4281,7 +4398,7 @@ void StreamingListener::SocketWriter::MakeConnection() {<br>
}<br>
<br>
// Loop through all the results and connect to the first we can.<br>
- for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;<br>
+ for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != nullptr;<br>
cur_addr = cur_addr->ai_next) {<br>
sockfd_ = socket(<br>
cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);<br>
@@ -4413,9 +4530,8 @@ class ScopedPrematureExitFile {<br>
<br>
TestEventListeners::TestEventListeners()<br>
: repeater_(new internal::TestEventRepeater()),<br>
- default_result_printer_(NULL),<br>
- default_xml_generator_(NULL) {<br>
-}<br>
+ default_result_printer_(nullptr),<br>
+ default_xml_generator_(nullptr) {}<br>
<br>
TestEventListeners::~TestEventListeners() { delete repeater_; }<br>
<br>
@@ -4432,9 +4548,9 @@ void TestEventListeners::Append(TestEventListener* listener) {<br>
// NULL if the listener is not found in the list.<br>
TestEventListener* TestEventListeners::Release(TestEventListener* listener) {<br>
if (listener == default_result_printer_)<br>
- default_result_printer_ = NULL;<br>
+ default_result_printer_ = nullptr;<br>
else if (listener == default_xml_generator_)<br>
- default_xml_generator_ = NULL;<br>
+ default_xml_generator_ = nullptr;<br>
return repeater_->Release(listener);<br>
}<br>
<br>
@@ -4453,8 +4569,7 @@ void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {<br>
// list.<br>
delete Release(default_result_printer_);<br>
default_result_printer_ = listener;<br>
- if (listener != NULL)<br>
- Append(listener);<br>
+ if (listener != nullptr) Append(listener);<br>
}<br>
}<br>
<br>
@@ -4469,8 +4584,7 @@ void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {<br>
// list.<br>
delete Release(default_xml_generator_);<br>
default_xml_generator_ = listener;<br>
- if (listener != NULL)<br>
- Append(listener);<br>
+ if (listener != nullptr) Append(listener);<br>
}<br>
}<br>
<br>
@@ -4494,52 +4608,66 @@ void TestEventListeners::SuppressEventForwarding() {<br>
// call this before main() starts, from which point on the return<br>
// value will never change.<br>
UnitTest* UnitTest::GetInstance() {<br>
- // When compiled with MSVC 7.1 in optimized mode, destroying the<br>
- // UnitTest object upon exiting the program messes up the exit code,<br>
- // causing successful tests to appear failed. We have to use a<br>
- // <br>
diff erent implementation in this case to bypass the compiler bug.<br>
- // This implementation makes the compiler happy, at the cost of<br>
- // leaking the UnitTest object.<br>
-<br>
// CodeGear C++Builder insists on a public destructor for the<br>
// default implementation. Use this implementation to keep good OO<br>
// design with private destructor.<br>
<br>
-#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)<br>
+#if defined(__BORLANDC__)<br>
static UnitTest* const instance = new UnitTest;<br>
return instance;<br>
#else<br>
static UnitTest instance;<br>
return &instance;<br>
-#endif // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)<br>
+#endif // defined(__BORLANDC__)<br>
}<br>
<br>
-// Gets the number of successful test cases.<br>
-int UnitTest::successful_test_case_count() const {<br>
- return impl()->successful_test_case_count();<br>
+// Gets the number of successful test suites.<br>
+int UnitTest::successful_test_suite_count() const {<br>
+ return impl()->successful_test_suite_count();<br>
}<br>
<br>
-// Gets the number of failed test cases.<br>
-int UnitTest::failed_test_case_count() const {<br>
- return impl()->failed_test_case_count();<br>
+// Gets the number of failed test suites.<br>
+int UnitTest::failed_test_suite_count() const {<br>
+ return impl()->failed_test_suite_count();<br>
}<br>
<br>
-// Gets the number of all test cases.<br>
-int UnitTest::total_test_case_count() const {<br>
- return impl()->total_test_case_count();<br>
+// Gets the number of all test suites.<br>
+int UnitTest::total_test_suite_count() const {<br>
+ return impl()->total_test_suite_count();<br>
}<br>
<br>
-// Gets the number of all test cases that contain at least one test<br>
+// Gets the number of all test suites that contain at least one test<br>
// that should run.<br>
+int UnitTest::test_suite_to_run_count() const {<br>
+ return impl()->test_suite_to_run_count();<br>
+}<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+int UnitTest::successful_test_case_count() const {<br>
+ return impl()->successful_test_suite_count();<br>
+}<br>
+int UnitTest::failed_test_case_count() const {<br>
+ return impl()->failed_test_suite_count();<br>
+}<br>
+int UnitTest::total_test_case_count() const {<br>
+ return impl()->total_test_suite_count();<br>
+}<br>
int UnitTest::test_case_to_run_count() const {<br>
- return impl()->test_case_to_run_count();<br>
+ return impl()->test_suite_to_run_count();<br>
}<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
// Gets the number of successful tests.<br>
int UnitTest::successful_test_count() const {<br>
return impl()->successful_test_count();<br>
}<br>
<br>
+// Gets the number of skipped tests.<br>
+int UnitTest::skipped_test_count() const {<br>
+ return impl()->skipped_test_count();<br>
+}<br>
+<br>
// Gets the number of failed tests.<br>
int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }<br>
<br>
@@ -4575,29 +4703,37 @@ internal::TimeInMillis UnitTest::elapsed_time() const {<br>
return impl()->elapsed_time();<br>
}<br>
<br>
-// Returns true iff the unit test passed (i.e. all test cases passed).<br>
+// Returns true if and only if the unit test passed (i.e. all test suites<br>
+// passed).<br>
bool UnitTest::Passed() const { return impl()->Passed(); }<br>
<br>
-// Returns true iff the unit test failed (i.e. some test case failed<br>
-// or something outside of all tests failed).<br>
+// Returns true if and only if the unit test failed (i.e. some test suite<br>
+// failed or something outside of all tests failed).<br>
bool UnitTest::Failed() const { return impl()->Failed(); }<br>
<br>
-// Gets the i-th test case among all the test cases. i can range from 0 to<br>
-// total_test_case_count() - 1. If i is not in that range, returns NULL.<br>
+// Gets the i-th test suite among all the test suites. i can range from 0 to<br>
+// total_test_suite_count() - 1. If i is not in that range, returns NULL.<br>
+const TestSuite* UnitTest::GetTestSuite(int i) const {<br>
+ return impl()->GetTestSuite(i);<br>
+}<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
const TestCase* UnitTest::GetTestCase(int i) const {<br>
return impl()->GetTestCase(i);<br>
}<br>
+#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
// Returns the TestResult containing information on test failures and<br>
-// properties logged outside of individual test cases.<br>
+// properties logged outside of individual test suites.<br>
const TestResult& UnitTest::ad_hoc_test_result() const {<br>
return *impl()->ad_hoc_test_result();<br>
}<br>
<br>
-// Gets the i-th test case among all the test cases. i can range from 0 to<br>
-// total_test_case_count() - 1. If i is not in that range, returns NULL.<br>
-TestCase* UnitTest::GetMutableTestCase(int i) {<br>
- return impl()->GetMutableTestCase(i);<br>
+// Gets the i-th test suite among all the test suites. i can range from 0 to<br>
+// total_test_suite_count() - 1. If i is not in that range, returns NULL.<br>
+TestSuite* UnitTest::GetMutableTestSuite(int i) {<br>
+ return impl()->GetMutableSuiteCase(i);<br>
}<br>
<br>
// Returns the list of event listeners that can be used to track events<br>
@@ -4617,8 +4753,8 @@ TestEventListeners& UnitTest::listeners() {<br>
// We don't protect this under mutex_, as we only support calling it<br>
// from the main thread.<br>
Environment* UnitTest::AddEnvironment(Environment* env) {<br>
- if (env == NULL) {<br>
- return NULL;<br>
+ if (env == nullptr) {<br>
+ return nullptr;<br>
}<br>
<br>
impl_->environments().push_back(env);<br>
@@ -4642,25 +4778,24 @@ void UnitTest::AddTestPartResult(<br>
if (impl_->gtest_trace_stack().size() > 0) {<br>
msg << "\n" << GTEST_NAME_ << " trace:";<br>
<br>
- for (int i = static_cast<int>(impl_->gtest_trace_stack().size());<br>
- i > 0; --i) {<br>
+ for (size_t i = impl_->gtest_trace_stack().size(); i > 0; --i) {<br>
const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];<br>
msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)<br>
<< " " << trace.message;<br>
}<br>
}<br>
<br>
- if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {<br>
+ if (os_stack_trace.c_str() != nullptr && !os_stack_trace.empty()) {<br>
msg << internal::kStackTraceMarker << os_stack_trace;<br>
}<br>
<br>
- const TestPartResult result =<br>
- TestPartResult(result_type, file_name, line_number,<br>
- msg.GetString().c_str());<br>
+ const TestPartResult result = TestPartResult(<br>
+ result_type, file_name, line_number, msg.GetString().c_str());<br>
impl_->GetTestPartResultReporterForCurrentThread()-><br>
ReportTestPartResult(result);<br>
<br>
- if (result_type != TestPartResult::kSuccess) {<br>
+ if (result_type != TestPartResult::kSuccess &&<br>
+ result_type != TestPartResult::kSkip) {<br>
// gtest_break_on_failure takes precedence over<br>
// gtest_throw_on_failure. This allows a user to set the latter<br>
// in the code (perhaps in order to use Google Test assertions<br>
@@ -4678,11 +4813,10 @@ void UnitTest::AddTestPartResult(<br>
// with clang/gcc we can achieve the same effect on x86 by invoking int3<br>
asm("int3");<br>
#else<br>
- // Dereference NULL through a volatile pointer to prevent the compiler<br>
+ // Dereference nullptr through a volatile pointer to prevent the compiler<br>
// from removing. We use this rather than abort() or __builtin_trap() for<br>
- // portability: Symbian doesn't implement abort() well, and some debuggers<br>
- // don't correctly trap abort().<br>
- *static_cast<volatile int*>(NULL) = 1;<br>
+ // portability: some debuggers don't correctly trap abort().<br>
+ *static_cast<volatile int*>(nullptr) = 1;<br>
#endif // GTEST_OS_WINDOWS<br>
} else if (GTEST_FLAG(throw_on_failure)) {<br>
#if GTEST_HAS_EXCEPTIONS<br>
@@ -4697,8 +4831,8 @@ void UnitTest::AddTestPartResult(<br>
}<br>
<br>
// Adds a TestProperty to the current TestResult object when invoked from<br>
-// inside a test, to current TestCase's ad_hoc_test_result_ when invoked<br>
-// from SetUpTestCase or TearDownTestCase, or to the global property set<br>
+// inside a test, to current TestSuite's ad_hoc_test_result_ when invoked<br>
+// from SetUpTestSuite or TearDownTestSuite, or to the global property set<br>
// when invoked elsewhere. If the result already contains a property with<br>
// the same key, the value will be updated.<br>
void UnitTest::RecordProperty(const std::string& key,<br>
@@ -4737,8 +4871,9 @@ int UnitTest::Run() {<br>
// that understands the premature-exit-file protocol to report the<br>
// test as having failed.<br>
const internal::ScopedPrematureExitFile premature_exit_file(<br>
- in_death_test_child_process ?<br>
- NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));<br>
+ in_death_test_child_process<br>
+ ? nullptr<br>
+ : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));<br>
<br>
// Captures the value of GTEST_FLAG(catch_exceptions). This value will be<br>
// used for the duration of the program.<br>
@@ -4763,23 +4898,27 @@ int UnitTest::Run() {<br>
_set_error_mode(_OUT_TO_STDERR);<br>
# endif<br>
<br>
-# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE<br>
+# if defined(_MSC_VER) && !GTEST_OS_WINDOWS_MOBILE<br>
// In the debug version, Visual Studio pops up a separate dialog<br>
// offering a choice to debug the aborted program. We need to suppress<br>
// this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement<br>
// executed. Google Test will notify the user of any unexpected<br>
// failure via stderr.<br>
- //<br>
- // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.<br>
- // Users of prior VC versions shall suffer the agony and pain of<br>
- // clicking through the countless debug dialogs.<br>
- // FIXME: find a way to suppress the abort dialog() in the<br>
- // debug mode when compiled with VC 7.1 or lower.<br>
if (!GTEST_FLAG(break_on_failure))<br>
_set_abort_behavior(<br>
0x0, // Clear the following flags:<br>
_WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump.<br>
# endif<br>
+<br>
+ // In debug mode, the Windows CRT can crash with an assertion over invalid<br>
+ // input (e.g. passing an invalid file descriptor). The default handling<br>
+ // for these assertions is to pop up a dialog and wait for user input.<br>
+ // Instead ask the CRT to dump such assertions to stderr non-interactively.<br>
+ if (!IsDebuggerPresent()) {<br>
+ (void)_CrtSetReportMode(_CRT_ASSERT,<br>
+ _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);<br>
+ (void)_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);<br>
+ }<br>
}<br>
#endif // GTEST_OS_WINDOWS<br>
<br>
@@ -4795,13 +4934,22 @@ const char* UnitTest::original_working_dir() const {<br>
return impl_->original_working_dir_.c_str();<br>
}<br>
<br>
-// Returns the TestCase object for the test that's currently running,<br>
+// Returns the TestSuite object for the test that's currently running,<br>
// or NULL if no test is running.<br>
+const TestSuite* UnitTest::current_test_suite() const<br>
+ GTEST_LOCK_EXCLUDED_(mutex_) {<br>
+ internal::MutexLock lock(&mutex_);<br>
+ return impl_->current_test_suite();<br>
+}<br>
+<br>
+// Legacy API is still available but deprecated<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
const TestCase* UnitTest::current_test_case() const<br>
GTEST_LOCK_EXCLUDED_(mutex_) {<br>
internal::MutexLock lock(&mutex_);<br>
- return impl_->current_test_case();<br>
+ return impl_->current_test_suite();<br>
}<br>
+#endif<br>
<br>
// Returns the TestInfo object for the test that's currently running,<br>
// or NULL if no test is running.<br>
@@ -4814,11 +4962,10 @@ const TestInfo* UnitTest::current_test_info() const<br>
// Returns the random seed used at the start of the current test run.<br>
int UnitTest::random_seed() const { return impl_->random_seed(); }<br>
<br>
-// Returns ParameterizedTestCaseRegistry object used to keep track of<br>
+// Returns ParameterizedTestSuiteRegistry object used to keep track of<br>
// value-parameterized tests and instantiate and register them.<br>
-internal::ParameterizedTestCaseRegistry&<br>
- UnitTest::parameterized_test_registry()<br>
- GTEST_LOCK_EXCLUDED_(mutex_) {<br>
+internal::ParameterizedTestSuiteRegistry&<br>
+UnitTest::parameterized_test_registry() GTEST_LOCK_EXCLUDED_(mutex_) {<br>
return impl_->parameterized_test_registry();<br>
}<br>
<br>
@@ -4852,23 +4999,22 @@ namespace internal {<br>
UnitTestImpl::UnitTestImpl(UnitTest* parent)<br>
: parent_(parent),<br>
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4355 /* using this in initializer */)<br>
- default_global_test_part_result_reporter_(this),<br>
+ default_global_test_part_result_reporter_(this),<br>
default_per_thread_test_part_result_reporter_(this),<br>
- GTEST_DISABLE_MSC_WARNINGS_POP_()<br>
- global_test_part_result_repoter_(<br>
+ GTEST_DISABLE_MSC_WARNINGS_POP_() global_test_part_result_repoter_(<br>
&default_global_test_part_result_reporter_),<br>
per_thread_test_part_result_reporter_(<br>
&default_per_thread_test_part_result_reporter_),<br>
parameterized_test_registry_(),<br>
parameterized_tests_registered_(false),<br>
- last_death_test_case_(-1),<br>
- current_test_case_(NULL),<br>
- current_test_info_(NULL),<br>
+ last_death_test_suite_(-1),<br>
+ current_test_suite_(nullptr),<br>
+ current_test_info_(nullptr),<br>
ad_hoc_test_result_(),<br>
- os_stack_trace_getter_(NULL),<br>
+ os_stack_trace_getter_(nullptr),<br>
post_flag_parse_init_performed_(false),<br>
random_seed_(0), // Will be overridden by the flag before first use.<br>
- random_(0), // Will be reseeded before first use.<br>
+ random_(0), // Will be reseeded before first use.<br>
start_timestamp_(0),<br>
elapsed_time_(0),<br>
#if GTEST_HAS_DEATH_TEST<br>
@@ -4880,8 +5026,8 @@ UnitTestImpl::UnitTestImpl(UnitTest* parent)<br>
}<br>
<br>
UnitTestImpl::~UnitTestImpl() {<br>
- // Deletes every TestCase.<br>
- ForEach(test_cases_, internal::Delete<TestCase>);<br>
+ // Deletes every TestSuite.<br>
+ ForEach(test_suites_, internal::Delete<TestSuite>);<br>
<br>
// Deletes every Environment.<br>
ForEach(environments_, internal::Delete<Environment>);<br>
@@ -4890,20 +5036,20 @@ UnitTestImpl::~UnitTestImpl() {<br>
}<br>
<br>
// Adds a TestProperty to the current TestResult object when invoked in a<br>
-// context of a test, to current test case's ad_hoc_test_result when invoke<br>
-// from SetUpTestCase/TearDownTestCase, or to the global property set<br>
+// context of a test, to current test suite's ad_hoc_test_result when invoke<br>
+// from SetUpTestSuite/TearDownTestSuite, or to the global property set<br>
// otherwise. If the result already contains a property with the same key,<br>
// the value will be updated.<br>
void UnitTestImpl::RecordProperty(const TestProperty& test_property) {<br>
std::string xml_element;<br>
TestResult* test_result; // TestResult appropriate for property recording.<br>
<br>
- if (current_test_info_ != NULL) {<br>
+ if (current_test_info_ != nullptr) {<br>
xml_element = "testcase";<br>
test_result = &(current_test_info_->result_);<br>
- } else if (current_test_case_ != NULL) {<br>
+ } else if (current_test_suite_ != nullptr) {<br>
xml_element = "testsuite";<br>
- test_result = &(current_test_case_->ad_hoc_test_result_);<br>
+ test_result = &(current_test_suite_->ad_hoc_test_result_);<br>
} else {<br>
xml_element = "testsuites";<br>
test_result = &ad_hoc_test_result_;<br>
@@ -4915,7 +5061,7 @@ void UnitTestImpl::RecordProperty(const TestProperty& test_property) {<br>
// Disables event forwarding if the control is currently in a death test<br>
// subprocess. Must not be called before InitGoogleTest.<br>
void UnitTestImpl::SuppressTestEventsIfInSubprocess() {<br>
- if (internal_run_death_test_flag_.get() != NULL)<br>
+ if (internal_run_death_test_flag_.get() != nullptr)<br>
listeners()->SuppressEventForwarding();<br>
}<br>
#endif // GTEST_HAS_DEATH_TEST<br>
@@ -4997,74 +5143,73 @@ void UnitTestImpl::PostFlagParsingInit() {<br>
}<br>
}<br>
<br>
-// A predicate that checks the name of a TestCase against a known<br>
+// A predicate that checks the name of a TestSuite against a known<br>
// value.<br>
//<br>
// This is used for implementation of the UnitTest class only. We put<br>
// it in the anonymous namespace to prevent polluting the outer<br>
// namespace.<br>
//<br>
-// TestCaseNameIs is copyable.<br>
-class TestCaseNameIs {<br>
+// TestSuiteNameIs is copyable.<br>
+class TestSuiteNameIs {<br>
public:<br>
// Constructor.<br>
- explicit TestCaseNameIs(const std::string& name)<br>
- : name_(name) {}<br>
+ explicit TestSuiteNameIs(const std::string& name) : name_(name) {}<br>
<br>
- // Returns true iff the name of test_case matches name_.<br>
- bool operator()(const TestCase* test_case) const {<br>
- return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;<br>
+ // Returns true if and only if the name of test_suite matches name_.<br>
+ bool operator()(const TestSuite* test_suite) const {<br>
+ return test_suite != nullptr &&<br>
+ strcmp(test_suite->name(), name_.c_str()) == 0;<br>
}<br>
<br>
private:<br>
std::string name_;<br>
};<br>
<br>
-// Finds and returns a TestCase with the given name. If one doesn't<br>
+// Finds and returns a TestSuite with the given name. If one doesn't<br>
// exist, creates one and returns it. It's the CALLER'S<br>
// RESPONSIBILITY to ensure that this function is only called WHEN THE<br>
// TESTS ARE NOT SHUFFLED.<br>
//<br>
// Arguments:<br>
//<br>
-// test_case_name: name of the test case<br>
-// type_param: the name of the test case's type parameter, or NULL if<br>
-// this is not a typed or a type-parameterized test case.<br>
-// set_up_tc: pointer to the function that sets up the test case<br>
-// tear_down_tc: pointer to the function that tears down the test case<br>
-TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,<br>
- const char* type_param,<br>
- Test::SetUpTestCaseFunc set_up_tc,<br>
- Test::TearDownTestCaseFunc tear_down_tc) {<br>
- // Can we find a TestCase with the given name?<br>
- const std::vector<TestCase*>::const_reverse_iterator test_case =<br>
- std::find_if(test_cases_.rbegin(), test_cases_.rend(),<br>
- TestCaseNameIs(test_case_name));<br>
-<br>
- if (test_case != test_cases_.rend())<br>
- return *test_case;<br>
+// test_suite_name: name of the test suite<br>
+// type_param: the name of the test suite's type parameter, or NULL if<br>
+// this is not a typed or a type-parameterized test suite.<br>
+// set_up_tc: pointer to the function that sets up the test suite<br>
+// tear_down_tc: pointer to the function that tears down the test suite<br>
+TestSuite* UnitTestImpl::GetTestSuite(<br>
+ const char* test_suite_name, const char* type_param,<br>
+ internal::SetUpTestSuiteFunc set_up_tc,<br>
+ internal::TearDownTestSuiteFunc tear_down_tc) {<br>
+ // Can we find a TestSuite with the given name?<br>
+ const auto test_suite =<br>
+ std::find_if(test_suites_.rbegin(), test_suites_.rend(),<br>
+ TestSuiteNameIs(test_suite_name));<br>
+<br>
+ if (test_suite != test_suites_.rend()) return *test_suite;<br>
<br>
// No. Let's create one.<br>
- TestCase* const new_test_case =<br>
- new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);<br>
-<br>
- // Is this a death test case?<br>
- if (internal::UnitTestOptions::MatchesFilter(test_case_name,<br>
- kDeathTestCaseFilter)) {<br>
- // Yes. Inserts the test case after the last death test case<br>
- // defined so far. This only works when the test cases haven't<br>
+ auto* const new_test_suite =<br>
+ new TestSuite(test_suite_name, type_param, set_up_tc, tear_down_tc);<br>
+<br>
+ // Is this a death test suite?<br>
+ if (internal::UnitTestOptions::MatchesFilter(test_suite_name,<br>
+ kDeathTestSuiteFilter)) {<br>
+ // Yes. Inserts the test suite after the last death test suite<br>
+ // defined so far. This only works when the test suites haven't<br>
// been shuffled. Otherwise we may end up running a death test<br>
// after a non-death test.<br>
- ++last_death_test_case_;<br>
- test_cases_.insert(test_cases_.begin() + last_death_test_case_,<br>
- new_test_case);<br>
+ ++last_death_test_suite_;<br>
+ test_suites_.insert(test_suites_.begin() + last_death_test_suite_,<br>
+ new_test_suite);<br>
} else {<br>
// No. Appends to the end of the list.<br>
- test_cases_.push_back(new_test_case);<br>
+ test_suites_.push_back(new_test_suite);<br>
}<br>
<br>
- test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));<br>
- return new_test_case;<br>
+ test_suite_indices_.push_back(static_cast<int>(test_suite_indices_.size()));<br>
+ return new_test_suite;<br>
}<br>
<br>
// Helpers for setting up / tearing down the given environment. They<br>
@@ -5082,7 +5227,8 @@ static void TearDownEnvironment(Environment* env) { env->TearDown(); }<br>
// All other functions called from RunAllTests() may safely assume that<br>
// parameterized tests are ready to be counted and run.<br>
bool UnitTestImpl::RunAllTests() {<br>
- // True iff Google Test is initialized before RUN_ALL_TESTS() is called.<br>
+ // True if and only if Google Test is initialized before RUN_ALL_TESTS() is<br>
+ // called.<br>
const bool gtest_is_initialized_before_run_all_tests = GTestIsInitialized();<br>
<br>
// Do not run any test if the --help flag was specified.<br>
@@ -5098,12 +5244,13 @@ bool UnitTestImpl::RunAllTests() {<br>
// protocol.<br>
internal::WriteToShardStatusFileIfNeeded();<br>
<br>
- // True iff we are in a subprocess for running a thread-safe-style<br>
+ // True if and only if we are in a subprocess for running a thread-safe-style<br>
// death test.<br>
bool in_subprocess_for_death_test = false;<br>
<br>
#if GTEST_HAS_DEATH_TEST<br>
- in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);<br>
+ in_subprocess_for_death_test =<br>
+ (internal_run_death_test_flag_.get() != nullptr);<br>
# if defined(GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_)<br>
if (in_subprocess_for_death_test) {<br>
GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_();<br>
@@ -5130,7 +5277,7 @@ bool UnitTestImpl::RunAllTests() {<br>
random_seed_ = GTEST_FLAG(shuffle) ?<br>
GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;<br>
<br>
- // True iff at least one test has failed.<br>
+ // True if and only if at least one test has failed.<br>
bool failed = false;<br>
<br>
TestEventListener* repeater = listeners()->repeater();<br>
@@ -5142,17 +5289,17 @@ bool UnitTestImpl::RunAllTests() {<br>
// when we are inside the subprocess of a death test.<br>
const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);<br>
// Repeats forever if the repeat count is negative.<br>
- const bool forever = repeat < 0;<br>
- for (int i = 0; forever || i != repeat; i++) {<br>
+ const bool gtest_repeat_forever = repeat < 0;<br>
+ for (int i = 0; gtest_repeat_forever || i != repeat; i++) {<br>
// We want to preserve failures generated by ad-hoc test<br>
// assertions executed before RUN_ALL_TESTS().<br>
ClearNonAdHocTestResult();<br>
<br>
const TimeInMillis start = GetTimeInMillis();<br>
<br>
- // Shuffles test cases and tests if requested.<br>
+ // Shuffles test suites and tests if requested.<br>
if (has_tests_to_run && GTEST_FLAG(shuffle)) {<br>
- random()->Reseed(random_seed_);<br>
+ random()->Reseed(static_cast<UInt32>(random_seed_));<br>
// This should be done before calling OnTestIterationStart(),<br>
// such that a test event listener can see the actual test order<br>
// in the event.<br>
@@ -5162,19 +5309,33 @@ bool UnitTestImpl::RunAllTests() {<br>
// Tells the unit test event listeners that the tests are about to start.<br>
repeater->OnTestIterationStart(*parent_, i);<br>
<br>
- // Runs each test case if there is at least one test to run.<br>
+ // Runs each test suite if there is at least one test to run.<br>
if (has_tests_to_run) {<br>
// Sets up all environments beforehand.<br>
repeater->OnEnvironmentsSetUpStart(*parent_);<br>
ForEach(environments_, SetUpEnvironment);<br>
repeater->OnEnvironmentsSetUpEnd(*parent_);<br>
<br>
- // Runs the tests only if there was no fatal failure during global<br>
- // set-up.<br>
- if (!Test::HasFatalFailure()) {<br>
- for (int test_index = 0; test_index < total_test_case_count();<br>
+ // Runs the tests only if there was no fatal failure or skip triggered<br>
+ // during global set-up.<br>
+ if (Test::IsSkipped()) {<br>
+ // Emit diagnostics when global set-up calls skip, as it will not be<br>
+ // emitted by default.<br>
+ TestResult& test_result =<br>
+ *internal::GetUnitTestImpl()->current_test_result();<br>
+ for (int j = 0; j < test_result.total_part_count(); ++j) {<br>
+ const TestPartResult& test_part_result =<br>
+ test_result.GetTestPartResult(j);<br>
+ if (test_part_result.type() == TestPartResult::kSkip) {<br>
+ const std::string& result = test_part_result.message();<br>
+ printf("%s\n", result.c_str());<br>
+ }<br>
+ }<br>
+ fflush(stdout);<br>
+ } else if (!Test::HasFatalFailure()) {<br>
+ for (int test_index = 0; test_index < total_test_suite_count();<br>
test_index++) {<br>
- GetMutableTestCase(test_index)->Run();<br>
+ GetMutableSuiteCase(test_index)->Run();<br>
}<br>
}<br>
<br>
@@ -5234,9 +5395,9 @@ bool UnitTestImpl::RunAllTests() {<br>
// be created, prints an error and exits.<br>
void WriteToShardStatusFileIfNeeded() {<br>
const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);<br>
- if (test_shard_file != NULL) {<br>
+ if (test_shard_file != nullptr) {<br>
FILE* const file = posix::FOpen(test_shard_file, "w");<br>
- if (file == NULL) {<br>
+ if (file == nullptr) {<br>
ColoredPrintf(COLOR_RED,<br>
"Could not write to the test shard status file \"%s\" "<br>
"specified by the %s environment variable.\n",<br>
@@ -5271,7 +5432,7 @@ bool ShouldShard(const char* total_shards_env,<br>
<< "Invalid environment variables: you have "<br>
<< kTestShardIndex << " = " << shard_index<br>
<< ", but have left " << kTestTotalShards << " unset.\n";<br>
- ColoredPrintf(COLOR_RED, msg.GetString().c_str());<br>
+ ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str());<br>
fflush(stdout);<br>
exit(EXIT_FAILURE);<br>
} else if (total_shards != -1 && shard_index == -1) {<br>
@@ -5279,7 +5440,7 @@ bool ShouldShard(const char* total_shards_env,<br>
<< "Invalid environment variables: you have "<br>
<< kTestTotalShards << " = " << total_shards<br>
<< ", but have left " << kTestShardIndex << " unset.\n";<br>
- ColoredPrintf(COLOR_RED, msg.GetString().c_str());<br>
+ ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str());<br>
fflush(stdout);<br>
exit(EXIT_FAILURE);<br>
} else if (shard_index < 0 || shard_index >= total_shards) {<br>
@@ -5288,7 +5449,7 @@ bool ShouldShard(const char* total_shards_env,<br>
<< kTestShardIndex << " < " << kTestTotalShards<br>
<< ", but you have " << kTestShardIndex << "=" << shard_index<br>
<< ", " << kTestTotalShards << "=" << total_shards << ".\n";<br>
- ColoredPrintf(COLOR_RED, msg.GetString().c_str());<br>
+ ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str());<br>
fflush(stdout);<br>
exit(EXIT_FAILURE);<br>
}<br>
@@ -5301,7 +5462,7 @@ bool ShouldShard(const char* total_shards_env,<br>
// and aborts.<br>
Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {<br>
const char* str_val = posix::GetEnv(var);<br>
- if (str_val == NULL) {<br>
+ if (str_val == nullptr) {<br>
return default_val;<br>
}<br>
<br>
@@ -5314,8 +5475,8 @@ Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {<br>
}<br>
<br>
// Given the total number of shards, the shard index, and the test id,<br>
-// returns true iff the test should be run on this shard. The test id is<br>
-// some arbitrary but unique non-negative integer assigned to each test<br>
+// returns true if and only if the test should be run on this shard. The test id<br>
+// is some arbitrary but unique non-negative integer assigned to each test<br>
// method. Assumes that 0 <= shard_index < total_shards.<br>
bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {<br>
return (test_id % total_shards) == shard_index;<br>
@@ -5323,7 +5484,7 @@ bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {<br>
<br>
// Compares the name of each test with the user-specified filter to<br>
// decide whether the test should be run, then records the result in<br>
-// each TestCase and TestInfo object.<br>
+// each TestSuite and TestInfo object.<br>
// If shard_tests == true, further filters tests based on sharding<br>
// variables in the environment - see<br>
// <a href="https://github.com/google/googletest/blob/master/googletest/docs/advanced.md" rel="noreferrer" target="_blank">https://github.com/google/googletest/blob/master/googletest/docs/advanced.md</a><br>
@@ -5340,26 +5501,23 @@ int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {<br>
// this shard.<br>
int num_runnable_tests = 0;<br>
int num_selected_tests = 0;<br>
- for (size_t i = 0; i < test_cases_.size(); i++) {<br>
- TestCase* const test_case = test_cases_[i];<br>
- const std::string &test_case_name = test_case->name();<br>
- test_case->set_should_run(false);<br>
+ for (auto* test_suite : test_suites_) {<br>
+ const std::string& test_suite_name = test_suite->name();<br>
+ test_suite->set_should_run(false);<br>
<br>
- for (size_t j = 0; j < test_case->test_info_list().size(); j++) {<br>
- TestInfo* const test_info = test_case->test_info_list()[j];<br>
+ for (size_t j = 0; j < test_suite->test_info_list().size(); j++) {<br>
+ TestInfo* const test_info = test_suite->test_info_list()[j];<br>
const std::string test_name(test_info->name());<br>
- // A test is disabled if test case name or test name matches<br>
+ // A test is disabled if test suite name or test name matches<br>
// kDisableTestFilter.<br>
- const bool is_disabled =<br>
- internal::UnitTestOptions::MatchesFilter(test_case_name,<br>
- kDisableTestFilter) ||<br>
- internal::UnitTestOptions::MatchesFilter(test_name,<br>
- kDisableTestFilter);<br>
+ const bool is_disabled = internal::UnitTestOptions::MatchesFilter(<br>
+ test_suite_name, kDisableTestFilter) ||<br>
+ internal::UnitTestOptions::MatchesFilter(<br>
+ test_name, kDisableTestFilter);<br>
test_info->is_disabled_ = is_disabled;<br>
<br>
- const bool matches_filter =<br>
- internal::UnitTestOptions::FilterMatchesTest(test_case_name,<br>
- test_name);<br>
+ const bool matches_filter = internal::UnitTestOptions::FilterMatchesTest(<br>
+ test_suite_name, test_name);<br>
test_info->matches_filter_ = matches_filter;<br>
<br>
const bool is_runnable =<br>
@@ -5376,7 +5534,7 @@ int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {<br>
num_selected_tests += is_selected;<br>
<br>
test_info->should_run_ = is_selected;<br>
- test_case->set_should_run(test_case->should_run() || is_selected);<br>
+ test_suite->set_should_run(test_suite->should_run() || is_selected);<br>
}<br>
}<br>
return num_selected_tests;<br>
@@ -5387,7 +5545,7 @@ int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {<br>
// max_length characters, only prints the first max_length characters<br>
// and "...".<br>
static void PrintOnOneLine(const char* str, int max_length) {<br>
- if (str != NULL) {<br>
+ if (str != nullptr) {<br>
for (int i = 0; *str != '\0'; ++str) {<br>
if (i >= max_length) {<br>
printf("...");<br>
@@ -5409,27 +5567,25 @@ void UnitTestImpl::ListTestsMatchingFilter() {<br>
// Print at most this many characters for each type/value parameter.<br>
const int kMaxParamLength = 250;<br>
<br>
- for (size_t i = 0; i < test_cases_.size(); i++) {<br>
- const TestCase* const test_case = test_cases_[i];<br>
- bool printed_test_case_name = false;<br>
+ for (auto* test_suite : test_suites_) {<br>
+ bool printed_test_suite_name = false;<br>
<br>
- for (size_t j = 0; j < test_case->test_info_list().size(); j++) {<br>
- const TestInfo* const test_info =<br>
- test_case->test_info_list()[j];<br>
+ for (size_t j = 0; j < test_suite->test_info_list().size(); j++) {<br>
+ const TestInfo* const test_info = test_suite->test_info_list()[j];<br>
if (test_info->matches_filter_) {<br>
- if (!printed_test_case_name) {<br>
- printed_test_case_name = true;<br>
- printf("%s.", test_case->name());<br>
- if (test_case->type_param() != NULL) {<br>
+ if (!printed_test_suite_name) {<br>
+ printed_test_suite_name = true;<br>
+ printf("%s.", test_suite->name());<br>
+ if (test_suite->type_param() != nullptr) {<br>
printf(" # %s = ", kTypeParamLabel);<br>
// We print the type parameter on a single line to make<br>
// the output easy to parse by a program.<br>
- PrintOnOneLine(test_case->type_param(), kMaxParamLength);<br>
+ PrintOnOneLine(test_suite->type_param(), kMaxParamLength);<br>
}<br>
printf("\n");<br>
}<br>
printf(" %s", test_info->name());<br>
- if (test_info->value_param() != NULL) {<br>
+ if (test_info->value_param() != nullptr) {<br>
printf(" # %s = ", kValueParamLabel);<br>
// We print the value parameter on a single line to make the<br>
// output easy to parse by a program.<br>
@@ -5448,11 +5604,11 @@ void UnitTestImpl::ListTestsMatchingFilter() {<br>
if (output_format == "xml") {<br>
XmlUnitTestResultPrinter(<br>
UnitTestOptions::GetAbsolutePathToOutputFile().c_str())<br>
- .PrintXmlTestsList(&stream, test_cases_);<br>
+ .PrintXmlTestsList(&stream, test_suites_);<br>
} else if (output_format == "json") {<br>
JsonUnitTestResultPrinter(<br>
UnitTestOptions::GetAbsolutePathToOutputFile().c_str())<br>
- .PrintJsonTestList(&stream, test_cases_);<br>
+ .PrintJsonTestList(&stream, test_suites_);<br>
}<br>
fprintf(fileout, "%s", StringStreamToString(&stream).c_str());<br>
fclose(fileout);<br>
@@ -5476,7 +5632,7 @@ void UnitTestImpl::set_os_stack_trace_getter(<br>
// otherwise, creates an OsStackTraceGetter, makes it the current<br>
// getter, and returns it.<br>
OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {<br>
- if (os_stack_trace_getter_ == NULL) {<br>
+ if (os_stack_trace_getter_ == nullptr) {<br>
#ifdef GTEST_OS_STACK_TRACE_GETTER_<br>
os_stack_trace_getter_ = new GTEST_OS_STACK_TRACE_GETTER_;<br>
#else<br>
@@ -5489,38 +5645,38 @@ OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {<br>
<br>
// Returns the most specific TestResult currently running.<br>
TestResult* UnitTestImpl::current_test_result() {<br>
- if (current_test_info_ != NULL) {<br>
+ if (current_test_info_ != nullptr) {<br>
return ¤t_test_info_->result_;<br>
}<br>
- if (current_test_case_ != NULL) {<br>
- return ¤t_test_case_->ad_hoc_test_result_;<br>
+ if (current_test_suite_ != nullptr) {<br>
+ return ¤t_test_suite_->ad_hoc_test_result_;<br>
}<br>
return &ad_hoc_test_result_;<br>
}<br>
<br>
-// Shuffles all test cases, and the tests within each test case,<br>
+// Shuffles all test suites, and the tests within each test suite,<br>
// making sure that death tests are still run first.<br>
void UnitTestImpl::ShuffleTests() {<br>
- // Shuffles the death test cases.<br>
- ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);<br>
+ // Shuffles the death test suites.<br>
+ ShuffleRange(random(), 0, last_death_test_suite_ + 1, &test_suite_indices_);<br>
<br>
- // Shuffles the non-death test cases.<br>
- ShuffleRange(random(), last_death_test_case_ + 1,<br>
- static_cast<int>(test_cases_.size()), &test_case_indices_);<br>
+ // Shuffles the non-death test suites.<br>
+ ShuffleRange(random(), last_death_test_suite_ + 1,<br>
+ static_cast<int>(test_suites_.size()), &test_suite_indices_);<br>
<br>
- // Shuffles the tests inside each test case.<br>
- for (size_t i = 0; i < test_cases_.size(); i++) {<br>
- test_cases_[i]->ShuffleTests(random());<br>
+ // Shuffles the tests inside each test suite.<br>
+ for (auto& test_suite : test_suites_) {<br>
+ test_suite->ShuffleTests(random());<br>
}<br>
}<br>
<br>
-// Restores the test cases and tests to their order before the first shuffle.<br>
+// Restores the test suites and tests to their order before the first shuffle.<br>
void UnitTestImpl::UnshuffleTests() {<br>
- for (size_t i = 0; i < test_cases_.size(); i++) {<br>
- // Unshuffles the tests in each test case.<br>
- test_cases_[i]->UnshuffleTests();<br>
- // Resets the index of each test case.<br>
- test_case_indices_[i] = static_cast<int>(i);<br>
+ for (size_t i = 0; i < test_suites_.size(); i++) {<br>
+ // Unshuffles the tests in each test suite.<br>
+ test_suites_[i]->UnshuffleTests();<br>
+ // Resets the index of each test suite.<br>
+ test_suite_indices_[i] = static_cast<int>(i);<br>
}<br>
}<br>
<br>
@@ -5579,12 +5735,12 @@ bool SkipPrefix(const char* prefix, const char** pstr) {<br>
static const char* ParseFlagValue(const char* str, const char* flag,<br>
bool def_optional) {<br>
// str and flag must not be NULL.<br>
- if (str == NULL || flag == NULL) return NULL;<br>
+ if (str == nullptr || flag == nullptr) return nullptr;<br>
<br>
// The flag must start with "--" followed by GTEST_FLAG_PREFIX_.<br>
const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag;<br>
const size_t flag_len = flag_str.length();<br>
- if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;<br>
+ if (strncmp(str, flag_str.c_str(), flag_len) != 0) return nullptr;<br>
<br>
// Skips the flag name.<br>
const char* flag_end = str + flag_len;<br>
@@ -5597,7 +5753,7 @@ static const char* ParseFlagValue(const char* str, const char* flag,<br>
// If def_optional is true and there are more characters after the<br>
// flag name, or if def_optional is false, there must be a '=' after<br>
// the flag name.<br>
- if (flag_end[0] != '=') return NULL;<br>
+ if (flag_end[0] != '=') return nullptr;<br>
<br>
// Returns the string after "=".<br>
return flag_end + 1;<br>
@@ -5618,7 +5774,7 @@ static bool ParseBoolFlag(const char* str, const char* flag, bool* value) {<br>
const char* const value_str = ParseFlagValue(str, flag, true);<br>
<br>
// Aborts if the parsing failed.<br>
- if (value_str == NULL) return false;<br>
+ if (value_str == nullptr) return false;<br>
<br>
// Converts the string value to a bool.<br>
*value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');<br>
@@ -5635,7 +5791,7 @@ bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {<br>
const char* const value_str = ParseFlagValue(str, flag, false);<br>
<br>
// Aborts if the parsing failed.<br>
- if (value_str == NULL) return false;<br>
+ if (value_str == nullptr) return false;<br>
<br>
// Sets *value to the value of the flag.<br>
return ParseInt32(Message() << "The value of flag --" << flag,<br>
@@ -5653,7 +5809,7 @@ static bool ParseStringFlag(const char* str, const char* flag, String* value) {<br>
const char* const value_str = ParseFlagValue(str, flag, false);<br>
<br>
// Aborts if the parsing failed.<br>
- if (value_str == NULL) return false;<br>
+ if (value_str == nullptr) return false;<br>
<br>
// Sets *value to the value of the flag.<br>
*value = value_str;<br>
@@ -5684,8 +5840,6 @@ static bool HasGoogleTestFlagPrefix(const char* str) {<br>
// @Y changes the color to yellow.<br>
// @D changes to the default terminal text color.<br>
//<br>
-// FIXME: Write tests for this once we add stdout<br>
-// capturing to Google Test.<br>
static void PrintColorEncoded(const char* str) {<br>
GTestColor color = COLOR_DEFAULT; // The current color.<br>
<br>
@@ -5695,7 +5849,7 @@ static void PrintColorEncoded(const char* str) {<br>
// next segment.<br>
for (;;) {<br>
const char* p = strchr(str, '@');<br>
- if (p == NULL) {<br>
+ if (p == nullptr) {<br>
ColoredPrintf(color, "%s", str);<br>
return;<br>
}<br>
@@ -5753,7 +5907,7 @@ static const char kColorEncodedHelpMessage[] =<br>
" @G--" GTEST_FLAG_PREFIX_ "output=@Y(@Gjson@Y|@Gxml@Y)[@G:@YDIRECTORY_PATH@G"<br>
GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"<br>
" Generate a JSON or XML report in the given directory or with the given\n"<br>
-" file name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\n"<br>
+" file name. @YFILE_PATH@D defaults to @Gtest_detail.xml@D.\n"<br>
# if GTEST_CAN_STREAM_RESULTS_<br>
" @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST@G:@YPORT@D\n"<br>
" Stream test results to the given server.\n"<br>
@@ -5895,7 +6049,7 @@ void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {<br>
void ParseGoogleTestFlagsOnly(int* argc, char** argv) {<br>
ParseGoogleTestFlagsOnlyImpl(argc, argv);<br>
<br>
- // Fix the value of *_NSGetArgc() on macOS, but iff<br>
+ // Fix the value of *_NSGetArgc() on macOS, but if and only if<br>
// *_NSGetArgv() == argv<br>
// Only applicable to char** version of argv<br>
#if GTEST_OS_MAC<br>
@@ -5963,6 +6117,22 @@ void InitGoogleTest(int* argc, wchar_t** argv) {<br>
#endif // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)<br>
}<br>
<br>
+// This overloaded version can be used on Arduino/embedded platforms where<br>
+// there is no argc/argv.<br>
+void InitGoogleTest() {<br>
+ // Since Arduino doesn't have a command line, fake out the argc/argv arguments<br>
+ int argc = 1;<br>
+ const auto arg0 = "dummy";<br>
+ char* argv0 = const_cast<char*>(arg0);<br>
+ char** argv = &argv0;<br>
+<br>
+#if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)<br>
+ GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(&argc, argv);<br>
+#else // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)<br>
+ internal::InitGoogleTestImpl(&argc, argv);<br>
+#endif // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)<br>
+}<br>
+<br>
std::string TempDir() {<br>
#if defined(GTEST_CUSTOM_TEMPDIR_FUNCTION_)<br>
return GTEST_CUSTOM_TEMPDIR_FUNCTION_();<br>
@@ -5972,7 +6142,7 @@ std::string TempDir() {<br>
return "\\temp\\";<br>
#elif GTEST_OS_WINDOWS<br>
const char* temp_dir = internal::posix::GetEnv("TEMP");<br>
- if (temp_dir == NULL || temp_dir[0] == '\0')<br>
+ if (temp_dir == nullptr || temp_dir[0] == '\0')<br>
return "\\temp\\";<br>
else if (temp_dir[strlen(temp_dir) - 1] == '\\')<br>
return temp_dir;<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>