/*
 *
 *    Copyright (c) 2024 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.
 */

#pragma once

// NOTE: Functionality in this class uses HEAP and std::set. It is generally
//       intended for large systems only
#include <app/data-model/List.h>

#include <set>
#include <type_traits>

// TODO move to chip namespace
template <typename T>
struct ListMemberTypeGetter
{
};

template <typename T>
struct ListMemberTypeGetter<chip::app::DataModel::List<T>>
{
    // We use List<const ...> in data model data structures, so consumers can
    // use const data.  Just grab the type with the const stripped off.
    using Type = std::remove_const_t<T>;
};

struct ListHolderBase
{
    // Just here so we can delete an instance to trigger the subclass destructor.
    virtual ~ListHolderBase() {}
};

template <typename T>
struct ListHolder : ListHolderBase
{
    ListHolder(size_t N) { mList = new T[N]; }
    ~ListHolder() { delete[] mList; }
    T * mList;
};

struct ListFreer
{
    ~ListFreer()
    {
        for (auto listHolder : mListHolders)
        {
            delete listHolder;
        }
    }

    void add(ListHolderBase * listHolder) { mListHolders.insert(listHolder); }

    std::set<ListHolderBase *> mListHolders;
};
