@@ -46,7 +46,7 @@ class AttributeValueEncoder
46
46
ListEncodeHelper (AttributeValueEncoder & encoder) : mAttributeValueEncoder (encoder) {}
47
47
48
48
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
50
50
{
51
51
VerifyOrReturnError (aArg.GetFabricIndex () != kUndefinedFabricIndex , CHIP_ERROR_INVALID_FABRIC_INDEX);
52
52
@@ -55,13 +55,13 @@ class AttributeValueEncoder
55
55
VerifyOrReturnError (!mAttributeValueEncoder .mIsFabricFiltered ||
56
56
aArg.GetFabricIndex () == mAttributeValueEncoder .AccessingFabricIndex (),
57
57
CHIP_NO_ERROR);
58
- return mAttributeValueEncoder .EncodeListItem (mAttributeValueEncoder .AccessingFabricIndex (), std::forward<T>(aArg ));
58
+ return mAttributeValueEncoder .EncodeListItem (aArg, mAttributeValueEncoder .AccessingFabricIndex ());
59
59
}
60
60
61
61
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
63
63
{
64
- return mAttributeValueEncoder .EncodeListItem (std::forward<T>( aArg) );
64
+ return mAttributeValueEncoder .EncodeListItem (aArg);
65
65
}
66
66
67
67
private:
@@ -163,8 +163,12 @@ class AttributeValueEncoder
163
163
friend class ListEncodeHelper ;
164
164
friend class TestOnlyAttributeValueEncoderAccessor ;
165
165
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)
168
172
{
169
173
// EncodeListItem must be called after EnsureListStarted(), thus mCurrentEncodingListIndex and
170
174
// mEncodeState.mCurrentEncodingListIndex are not invalid values.
@@ -183,11 +187,12 @@ class AttributeValueEncoder
183
187
{
184
188
// Just encode a single item, with an anonymous tag.
185
189
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)...);
187
192
}
188
193
else
189
194
{
190
- err = EncodeAttributeReportIB (std::forward<Ts>(aArgs )...);
195
+ err = EncodeAttributeReportIB (aItem, std::forward<ExtraArgTypes>(aExtraArgs )...);
191
196
}
192
197
if (err != CHIP_NO_ERROR)
193
198
{
@@ -211,14 +216,19 @@ class AttributeValueEncoder
211
216
* In particular, when we are encoding a single element in the list, mPath
212
217
* must indicate a null list index to represent an "append" operation.
213
218
* 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.
214
224
*/
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 )
217
227
{
218
228
AttributeReportBuilder builder;
219
229
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 )...));
222
232
223
233
return builder.FinishAttribute (mAttributeReportIBsBuilder );
224
234
}
0 commit comments