/* * * 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 * This is a list of attribute. Each entry is an attribute of type T. */ #pragma once #include #include namespace chip { namespace DeviceLayer { template class AttributeList { public: /* The iterator */ class Iterator { public: Iterator(const AttributeList * AttributeList, int index); const T & operator*() const; Iterator & operator++(); bool operator!=(const Iterator & other) const; private: const AttributeList * mAttributeListPtr; int mIndex = -1; }; AttributeList() = default; ~AttributeList() { mSize = 0; } CHIP_ERROR add(const T & label); size_t size() const; const T & operator[](int index) const; Iterator begin() const; Iterator end() const; private: T mList[N]; int mSize = 0; }; /* * AttributeList methods **/ template inline CHIP_ERROR AttributeList::add(const T & label) { if (mSize == N) { return CHIP_ERROR_NO_MEMORY; } // add the new element mList[mSize] = label; ++mSize; return CHIP_NO_ERROR; } template inline size_t AttributeList::size() const { return static_cast(mSize); } template inline const T & AttributeList::operator[](int index) const { VerifyOrDie(index < mSize); return mList[index]; } template inline typename AttributeList::Iterator AttributeList::begin() const { return AttributeList::Iterator{ this, 0 }; } template inline typename AttributeList::Iterator AttributeList::end() const { return AttributeList::Iterator{ this, mSize }; } /* * Iterator methods **/ template inline AttributeList::Iterator::Iterator(const AttributeList * pAttributeList, int index) : mAttributeListPtr(pAttributeList), mIndex(index) {} template inline const T & AttributeList::Iterator::operator*() const { return mAttributeListPtr->operator[](mIndex); } template inline typename AttributeList::Iterator & AttributeList::Iterator::operator++() { ++mIndex; return *this; } template inline bool AttributeList::Iterator::operator!=(const AttributeList::Iterator & other) const { return mIndex != other.mIndex; } } // namespace DeviceLayer } // namespace chip