LCOV - code coverage report
Current view: top level - lib/support - CommonPersistentData.h (source / functions) Hit Total Coverage
Test: lcov_final.info Lines: 21 21 100.0 %
Date: 2024-02-15 08:20:41 Functions: 6 6 100.0 %

          Line data    Source code
       1             : /*
       2             :  *
       3             :  *    Copyright (c) 2022 Project CHIP Authors
       4             :  *
       5             :  *    Licensed under the Apache License, Version 2.0 (the "License");
       6             :  *    you may not use this file except in compliance with the License.
       7             :  *    You may obtain a copy of the License at
       8             :  *
       9             :  *        http://www.apache.org/licenses/LICENSE-2.0
      10             :  *
      11             :  *    Unless required by applicable law or agreed to in writing, software
      12             :  *    distributed under the License is distributed on an "AS IS" BASIS,
      13             :  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      14             :  *    See the License for the specific language governing permissions and
      15             :  *    limitations under the License.
      16             :  */
      17             : 
      18             : /**
      19             :  *    @file
      20             :  *          Contains a class handling creation of linked list of stored persistent data.
      21             :  */
      22             : #pragma once
      23             : 
      24             : #include <lib/core/DataModelTypes.h>
      25             : #include <lib/support/PersistentData.h>
      26             : 
      27             : namespace chip {
      28             : namespace CommonPersistentData {
      29             : 
      30             : inline constexpr uint8_t kdefaultUndefinedEntry = 0;
      31             : 
      32             : /// @brief Generic class to implement storage of a list persistently
      33             : /// @tparam EntryType : Type of entry depends on the stored data
      34             : /// @tparam kMaxSerializedSize : inherited from PersistentData class
      35             : template <typename EntryType, size_t kMaxSerializedSize>
      36             : struct StoredDataList : public PersistentData<kMaxSerializedSize>
      37             : {
      38         357 :     static constexpr TLV::Tag TagFirstEntry() { return TLV::ContextTag(1); }
      39         357 :     static constexpr TLV::Tag TagEntryCount() { return TLV::ContextTag(2); }
      40             : 
      41             :     EntryType first_entry = kdefaultUndefinedEntry;
      42             :     uint16_t entry_count  = 0;
      43             : 
      44         320 :     StoredDataList() = default;
      45             :     StoredDataList(EntryType first) : first_entry(first), entry_count(1) {}
      46             : 
      47          56 :     CHIP_ERROR Serialize(TLV::TLVWriter & writer) const override
      48             :     {
      49             :         TLV::TLVType container;
      50          56 :         ReturnErrorOnFailure(writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, container));
      51             : 
      52          56 :         ReturnErrorOnFailure(writer.Put(TagFirstEntry(), static_cast<uint16_t>(first_entry)));
      53          56 :         ReturnErrorOnFailure(writer.Put(TagEntryCount(), static_cast<uint16_t>(entry_count)));
      54             : 
      55          56 :         return writer.EndContainer(container);
      56             :     }
      57             : 
      58         301 :     CHIP_ERROR Deserialize(TLV::TLVReader & reader) override
      59             :     {
      60         301 :         ReturnErrorOnFailure(reader.Next(TLV::AnonymousTag()));
      61         301 :         VerifyOrReturnError(TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_INTERNAL);
      62             : 
      63             :         TLV::TLVType container;
      64         301 :         ReturnErrorOnFailure(reader.EnterContainer(container));
      65             : 
      66             :         // first_entry
      67         301 :         ReturnErrorOnFailure(reader.Next(TagFirstEntry()));
      68         301 :         ReturnErrorOnFailure(reader.Get(first_entry));
      69             :         // entry_count
      70         301 :         ReturnErrorOnFailure(reader.Next(TagEntryCount()));
      71         301 :         ReturnErrorOnFailure(reader.Get(entry_count));
      72             : 
      73         301 :         return reader.ExitContainer(container);
      74             :     }
      75             : };
      76             : 
      77             : inline constexpr size_t kPersistentFabricBufferMax = 32;
      78             : struct FabricList : StoredDataList<FabricIndex, kPersistentFabricBufferMax>
      79             : {
      80             :     // Subclasses need to define UpdateKey to be whatever fabric list key they
      81             :     // care about.
      82             : 
      83         320 :     void Clear() override
      84             :     {
      85         320 :         first_entry = kUndefinedFabricIndex;
      86         320 :         entry_count = 0;
      87         320 :     }
      88             : };
      89             : } // namespace CommonPersistentData
      90             : } // namespace chip

Generated by: LCOV version 1.14