// genDElement - An abstract data element library
// Copyright (C) 2013-2026 Eric Bechet, Frederic Duboeuf
//
// See the LICENSE file for license information.
// Please report all bugs and problems to <bechet@cadxfem.org> or <duboeuf@outlook.com>.
//
// Initial design: Frederic Duboeuf (rev.1501)


#ifndef _GEN_DATA_MANAGER_H_
#define _GEN_DATA_MANAGER_H_

#include <map>
#include <vector>
#include <iostream>

#include "genSingleton.h"

class genData;

class DataList
{
  std::string s;
protected :
  std::vector<genData*> dataContainer;

public :
  DataList(const std::string &s_) : s(s_) {}
  ~DataList();
  int size() const {return dataContainer.size();}
  std::string getIndex() const {return s;}
  genData* getData(int i) const {return dataContainer[i];}
  void addData(genData* d) {dataContainer.push_back(d);}
  friend std::ostream & operator<<(std::ostream &os, const DataList &list);
};



class DataIdManager : public Singleton<DataIdManager>
{
public :
  typedef typename std::map<std::string,DataList* > DataListContainer;
protected :
  DataListContainer dataListContainer;

private :
  friend class Singleton<DataIdManager>;
  DataIdManager() {}
  ~DataIdManager();
public :
  DataList* addToList(const std::string &s, genData* d);
  void clearList(const std::string &s);
  void clear();
  int size() const {return dataListContainer.size();}
  typename DataListContainer::const_iterator begin() const {return dataListContainer.begin();}
  typename DataListContainer::const_iterator end() const {return dataListContainer.end();}
  typename DataListContainer::const_iterator find(const std::string &s) const {return dataListContainer.find(s);}
  typename DataListContainer::iterator begin() {return dataListContainer.begin();}
  typename DataListContainer::iterator end() {return dataListContainer.end();}
  typename DataListContainer::iterator find(const std::string &s) {return dataListContainer.find(s);}
  friend std::ostream & operator<<(std::ostream &os, const DataIdManager &dataIdManager);
};



// interface

template<class E> struct DataManager
{
  static void clearList(const std::string &s)
  {
    DataIdManager* dataIdManager;
    dataIdManager = DataIdManager::getInstance();
    dataIdManager->clearList(s);
  }

  static void clear()
  {
    DataIdManager* dataIdManager;
    dataIdManager = DataIdManager::getInstance();
    dataIdManager->clear();
  }

  static void printf()
  {
    DataIdManager* dataIdManager;
    dataIdManager = DataIdManager::getInstance();
    std::cout << *dataIdManager;
  }
};


#endif // _GEN_DATA_MANAGER_H_