Skip to content

Commit 5055cbe

Browse files
Try to reduce the codesize needed by EncodeListItem. (#37076)
We shouldn't need separate specializations of EncodeListItem for T, T&, const T, and const T&. Try to collapse those all down to "const T&".
1 parent 92c88e4 commit 5055cbe

File tree

2 files changed

+29
-20
lines changed

2 files changed

+29
-20
lines changed

src/app/AttributeReportBuilder.h

+7-8
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,18 @@ class AttributeReportBuilder
5858
/**
5959
* EncodeValue encodes the value field of the report, it should be called exactly once.
6060
*/
61-
template <typename T, std::enable_if_t<!DataModel::IsFabricScoped<T>::value, bool> = true, typename... Ts>
62-
CHIP_ERROR EncodeValue(AttributeReportIBs::Builder & aAttributeReportIBs, TLV::Tag tag, T && item, Ts &&... aArgs)
61+
template <typename T, std::enable_if_t<!DataModel::IsFabricScoped<T>::value, bool> = true>
62+
CHIP_ERROR EncodeValue(AttributeReportIBs::Builder & aAttributeReportIBs, TLV::Tag tag, const T & item)
6363
{
64-
return DataModel::Encode(*(aAttributeReportIBs.GetAttributeReport().GetAttributeData().GetWriter()), tag, item,
65-
std::forward<Ts>(aArgs)...);
64+
return DataModel::Encode(*(aAttributeReportIBs.GetAttributeReport().GetAttributeData().GetWriter()), tag, item);
6665
}
6766

68-
template <typename T, std::enable_if_t<DataModel::IsFabricScoped<T>::value, bool> = true, typename... Ts>
69-
CHIP_ERROR EncodeValue(AttributeReportIBs::Builder & aAttributeReportIBs, TLV::Tag tag, FabricIndex accessingFabricIndex,
70-
T && item, Ts &&... aArgs)
67+
template <typename T, std::enable_if_t<DataModel::IsFabricScoped<T>::value, bool> = true>
68+
CHIP_ERROR EncodeValue(AttributeReportIBs::Builder & aAttributeReportIBs, TLV::Tag tag, const T & item,
69+
FabricIndex accessingFabricIndex)
7170
{
7271
return DataModel::EncodeForRead(*(aAttributeReportIBs.GetAttributeReport().GetAttributeData().GetWriter()), tag,
73-
accessingFabricIndex, item, std::forward<Ts>(aArgs)...);
72+
accessingFabricIndex, item);
7473
}
7574
};
7675

src/app/AttributeValueEncoder.h

+22-12
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class AttributeValueEncoder
4646
ListEncodeHelper(AttributeValueEncoder & encoder) : mAttributeValueEncoder(encoder) {}
4747

4848
template <typename T, std::enable_if_t<DataModel::IsFabricScoped<T>::value, bool> = true>
49-
CHIP_ERROR Encode(T && aArg) const
49+
CHIP_ERROR Encode(const T & aArg) const
5050
{
5151
VerifyOrReturnError(aArg.GetFabricIndex() != kUndefinedFabricIndex, CHIP_ERROR_INVALID_FABRIC_INDEX);
5252

@@ -55,13 +55,13 @@ class AttributeValueEncoder
5555
VerifyOrReturnError(!mAttributeValueEncoder.mIsFabricFiltered ||
5656
aArg.GetFabricIndex() == mAttributeValueEncoder.AccessingFabricIndex(),
5757
CHIP_NO_ERROR);
58-
return mAttributeValueEncoder.EncodeListItem(mAttributeValueEncoder.AccessingFabricIndex(), std::forward<T>(aArg));
58+
return mAttributeValueEncoder.EncodeListItem(aArg, mAttributeValueEncoder.AccessingFabricIndex());
5959
}
6060

6161
template <typename T, std::enable_if_t<!DataModel::IsFabricScoped<T>::value, bool> = true>
62-
CHIP_ERROR Encode(T && aArg) const
62+
CHIP_ERROR Encode(const T & aArg) const
6363
{
64-
return mAttributeValueEncoder.EncodeListItem(std::forward<T>(aArg));
64+
return mAttributeValueEncoder.EncodeListItem(aArg);
6565
}
6666

6767
private:
@@ -163,8 +163,12 @@ class AttributeValueEncoder
163163
friend class ListEncodeHelper;
164164
friend class TestOnlyAttributeValueEncoderAccessor;
165165

166-
template <typename... Ts>
167-
CHIP_ERROR EncodeListItem(Ts &&... aArgs)
166+
// EncodeListItem may be given an extra FabricIndex argument as a second
167+
// arg, or not. Represent that via a parameter pack (which might be
168+
// empty). In practice, for any given ItemType the extra arg is either there
169+
// or not, so we don't get more template explosion due to aExtraArgs.
170+
template <typename ItemType, typename... ExtraArgTypes>
171+
CHIP_ERROR EncodeListItem(const ItemType & aItem, ExtraArgTypes &&... aExtraArgs)
168172
{
169173
// EncodeListItem must be called after EnsureListStarted(), thus mCurrentEncodingListIndex and
170174
// mEncodeState.mCurrentEncodingListIndex are not invalid values.
@@ -183,11 +187,12 @@ class AttributeValueEncoder
183187
{
184188
// Just encode a single item, with an anonymous tag.
185189
AttributeReportBuilder builder;
186-
err = builder.EncodeValue(mAttributeReportIBsBuilder, TLV::AnonymousTag(), std::forward<Ts>(aArgs)...);
190+
err = builder.EncodeValue(mAttributeReportIBsBuilder, TLV::AnonymousTag(), aItem,
191+
std::forward<ExtraArgTypes>(aExtraArgs)...);
187192
}
188193
else
189194
{
190-
err = EncodeAttributeReportIB(std::forward<Ts>(aArgs)...);
195+
err = EncodeAttributeReportIB(aItem, std::forward<ExtraArgTypes>(aExtraArgs)...);
191196
}
192197
if (err != CHIP_NO_ERROR)
193198
{
@@ -211,14 +216,19 @@ class AttributeValueEncoder
211216
* In particular, when we are encoding a single element in the list, mPath
212217
* must indicate a null list index to represent an "append" operation.
213218
* operation.
219+
*
220+
* EncodeAttributeReportIB may be given an extra FabricIndex argument as a second
221+
* arg, or not. Represent that via a parameter pack (which might be
222+
* empty). In practice, for any given ItemType the extra arg is either
223+
* there or not, so we don't get more template explosion due to aExtraArgs.
214224
*/
215-
template <typename... Ts>
216-
CHIP_ERROR EncodeAttributeReportIB(Ts &&... aArgs)
225+
template <typename ItemType, typename... ExtraArgTypes>
226+
CHIP_ERROR EncodeAttributeReportIB(const ItemType & aItem, ExtraArgTypes &&... aExtraArgs)
217227
{
218228
AttributeReportBuilder builder;
219229
ReturnErrorOnFailure(builder.PrepareAttribute(mAttributeReportIBsBuilder, mPath, mDataVersion));
220-
ReturnErrorOnFailure(builder.EncodeValue(mAttributeReportIBsBuilder, TLV::ContextTag(AttributeDataIB::Tag::kData),
221-
std::forward<Ts>(aArgs)...));
230+
ReturnErrorOnFailure(builder.EncodeValue(mAttributeReportIBsBuilder, TLV::ContextTag(AttributeDataIB::Tag::kData), aItem,
231+
std::forward<ExtraArgTypes>(aExtraArgs)...));
222232

223233
return builder.FinishAttribute(mAttributeReportIBsBuilder);
224234
}

0 commit comments

Comments
 (0)