/* * * Copyright (c) 2021 Project CHIP Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file * General faults could be detected by the Node. */ #pragma once #include #include namespace chip { namespace DeviceLayer { static constexpr size_t kMaxHardwareFaults = 11; static constexpr size_t kMaxRadioFaults = 7; static constexpr size_t kMaxNetworkFaults = 4; template class GeneralFaults { public: /* The iterator */ class Iterator { public: Iterator(const GeneralFaults * GeneralFaults, int index); uint8_t operator*() const; Iterator & operator++(); bool operator!=(const Iterator & other) const; private: const GeneralFaults * mGeneralFaultsPtr; int mIndex = -1; }; GeneralFaults() = default; ~GeneralFaults() { mSize = 0; } CHIP_ERROR add(const uint8_t value); const uint8_t * data() const { return mData; } size_t size() const; uint8_t operator[](int index) const; Iterator begin() const; Iterator end() const; private: uint8_t mData[N]; int mSize = 0; }; /* * GeneralFaults methods **/ template inline CHIP_ERROR GeneralFaults::add(const uint8_t value) { if (mSize == N) { return CHIP_ERROR_NO_MEMORY; } // add the new element mData[mSize] = value; ++mSize; return CHIP_NO_ERROR; } template inline size_t GeneralFaults::size() const { return static_cast(mSize); } template inline uint8_t GeneralFaults::operator[](int index) const { VerifyOrDie(index < mSize); return mData[index]; } template inline typename GeneralFaults::Iterator GeneralFaults::begin() const { return GeneralFaults::Iterator{ this, 0 }; } template inline typename GeneralFaults::Iterator GeneralFaults::end() const { return GeneralFaults::Iterator{ this, mSize }; } /* * Iterator methods **/ template inline GeneralFaults::Iterator::Iterator(const GeneralFaults * pGeneralFaults, int index) : mGeneralFaultsPtr(pGeneralFaults), mIndex(index) {} template inline uint8_t GeneralFaults::Iterator::operator*() const { return mGeneralFaultsPtr->operator[](mIndex); } template inline typename GeneralFaults::Iterator & GeneralFaults::Iterator::operator++() { ++mIndex; return *this; } template inline bool GeneralFaults::Iterator::operator!=(const GeneralFaults::Iterator & other) const { return mIndex != other.mIndex; } } // namespace DeviceLayer } // namespace chip