diff --git a/src/credentials/FabricTable.h b/src/credentials/FabricTable.h index fa458c504caee7..0f3a3b9730bd7c 100644 --- a/src/credentials/FabricTable.h +++ b/src/credentials/FabricTable.h @@ -21,6 +21,8 @@ #pragma once +#include + #include #include #include diff --git a/src/credentials/GroupDataProvider.h b/src/credentials/GroupDataProvider.h index eccc7d50d2271b..a6497a94f7b2ba 100644 --- a/src/credentials/GroupDataProvider.h +++ b/src/credentials/GroupDataProvider.h @@ -16,12 +16,14 @@ */ #pragma once +#include +#include +#include + #include #include #include #include -#include -#include #include namespace chip { diff --git a/src/darwin/Framework/CHIP/CHIPOperationalCredentialsDelegate.h b/src/darwin/Framework/CHIP/CHIPOperationalCredentialsDelegate.h index 1edb35a9076b10..d8b3f0606a65df 100644 --- a/src/darwin/Framework/CHIP/CHIPOperationalCredentialsDelegate.h +++ b/src/darwin/Framework/CHIP/CHIPOperationalCredentialsDelegate.h @@ -15,6 +15,8 @@ * limitations under the License. */ +#include + #import #import diff --git a/src/darwin/Framework/CHIP/CHIPOperationalCredentialsDelegate.mm b/src/darwin/Framework/CHIP/CHIPOperationalCredentialsDelegate.mm index 6f9d5d0811b989..ae0d51da9c3de0 100644 --- a/src/darwin/Framework/CHIP/CHIPOperationalCredentialsDelegate.mm +++ b/src/darwin/Framework/CHIP/CHIPOperationalCredentialsDelegate.mm @@ -15,6 +15,8 @@ * limitations under the License. */ +#include + #import "CHIPOperationalCredentialsDelegate.h" #import diff --git a/src/lib/core/InPlace.h b/src/lib/core/InPlace.h index 647fc51c6e87d1..6ac2cb0c9b2c62 100644 --- a/src/lib/core/InPlace.h +++ b/src/lib/core/InPlace.h @@ -33,4 +33,12 @@ struct InPlaceType }; constexpr InPlaceType InPlace{}; +template +struct InPlaceTemplateType +{ + explicit InPlaceTemplateType() = default; +}; +template +constexpr InPlaceTemplateType InPlaceTemplate{}; + } // namespace chip diff --git a/src/lib/core/Optional.h b/src/lib/core/Optional.h index cd1fa9cf2a2cf2..d5c9f499fb02ed 100644 --- a/src/lib/core/Optional.h +++ b/src/lib/core/Optional.h @@ -23,9 +23,10 @@ */ #pragma once +#include + #include #include -#include namespace chip { diff --git a/src/lib/support/Variant.h b/src/lib/support/Variant.h index 80929f2750a36a..1eb2c574038608 100644 --- a/src/lib/support/Variant.h +++ b/src/lib/support/Variant.h @@ -27,6 +27,8 @@ #include #include +#include + namespace chip { namespace VariantInternal { @@ -148,6 +150,13 @@ struct Variant public: Variant() : mTypeId(kInvalidType) {} + template + constexpr explicit Variant(InPlaceTemplateType, Args &&... args) : + mTypeId(VariantInternal::TupleIndexOfType>::value) + { + new (&mData) T(std::forward(args)...); + } + Variant(const Variant & that) : mTypeId(that.mTypeId) { Curry::Copy(that.mTypeId, &that.mData, &mData); } Variant(Variant && that) : mTypeId(that.mTypeId) @@ -193,9 +202,7 @@ struct Variant template static Variant Create(Args &&... args) { - Variant instance; - instance.template Set(std::forward(args)...); - return instance; + return Variant(InPlaceTemplate, std::forward(args)...); } template diff --git a/src/lib/support/tests/TestVariant.cpp b/src/lib/support/tests/TestVariant.cpp index 24e3e4c055e00f..ad0c00c9ddcb00 100644 --- a/src/lib/support/tests/TestVariant.cpp +++ b/src/lib/support/tests/TestVariant.cpp @@ -16,6 +16,8 @@ * limitations under the License. */ +#include + #include #include @@ -208,6 +210,21 @@ void TestVariantMoveAssign(nlTestSuite * inSuite, void * inContext) NL_TEST_ASSERT(inSuite, v2.Get().m2 == 10); } +void TestVariantInPlace(nlTestSuite * inSuite, void * inContext) +{ + int i = 0; + + Variant> v1 = Variant>(InPlaceTemplate>, i); + NL_TEST_ASSERT(inSuite, v1.Valid()); + NL_TEST_ASSERT(inSuite, v1.Is>()); + NL_TEST_ASSERT(inSuite, &v1.Get>().get() == &i); + + Variant> v2 = Variant>::Create>(i); + NL_TEST_ASSERT(inSuite, v2.Valid()); + NL_TEST_ASSERT(inSuite, v2.Is>()); + NL_TEST_ASSERT(inSuite, &v2.Get>().get() == &i); +} + void TestVariantCompare(nlTestSuite * inSuite, void * inContext) { Variant v0; @@ -268,11 +285,11 @@ int Teardown(void * inContext) /** * Test Suite. It lists all the test functions. */ -static const nlTest sTests[] = { - NL_TEST_DEF_FN(TestVariantSimple), NL_TEST_DEF_FN(TestVariantMovable), NL_TEST_DEF_FN(TestVariantCtorDtor), - NL_TEST_DEF_FN(TestVariantCopy), NL_TEST_DEF_FN(TestVariantMove), NL_TEST_DEF_FN(TestVariantCopyAssign), - NL_TEST_DEF_FN(TestVariantMoveAssign), NL_TEST_DEF_FN(TestVariantCompare), NL_TEST_SENTINEL() -}; +static const nlTest sTests[] = { NL_TEST_DEF_FN(TestVariantSimple), NL_TEST_DEF_FN(TestVariantMovable), + NL_TEST_DEF_FN(TestVariantCtorDtor), NL_TEST_DEF_FN(TestVariantCopy), + NL_TEST_DEF_FN(TestVariantMove), NL_TEST_DEF_FN(TestVariantCopyAssign), + NL_TEST_DEF_FN(TestVariantMoveAssign), NL_TEST_DEF_FN(TestVariantInPlace), + NL_TEST_DEF_FN(TestVariantCompare), NL_TEST_SENTINEL() }; int TestVariant() {