// 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.1511)


#ifndef _GEN_DATA_PARENT_SUPPORT_H_
#define _GEN_DATA_PARENT_SUPPORT_H_

#include "genData.h"
#include "genDElement.h"

template<class E> class DataParentSupport : public genData
{
protected :
//   std::vector<DElementBase<E>*> parentSupport;   // parent components (0D,1D,2D,3D) >= dim
  DElementBase<E>* parentSupport;   // parent component (0D,1D,2D,3D) >= dim
public :
  typedef E ElementType;
  typedef typename ElementTraits<ElementType>::VertexType VertexType;
  typedef typename ElementTraits<ElementType>::EdgeType EdgeType;
  typedef typename ElementTraits<ElementType>::FaceType FaceType;

protected :
  virtual void buildVertexSupports(DElementBase<E>* de, DElementBase<E>* parent);
  virtual void buildEdgeSupports(DElementBase<E>* de, DElementBase<E>* parent);
  virtual void buildFaceSupports(DElementBase<E>* de, DElementBase<E>* parent);
  virtual void buildVolumeSupports(DElementBase<E>* de, DElementBase<E>* parent);
  virtual void buildSupports(DElementBase<E>* de, DElementBase<E>* parent)
  {
    buildVertexSupports(de, parent);
    buildEdgeSupports(de, parent);
    buildFaceSupports(de, parent);
    buildVolumeSupports(de, parent);
  }
public :
  DataParentSupport(const char* s, DElementBase<E>* de) : genData(s,de), parentSupport(0)
  {
    E* e = de->get();
    if(e)
    {
      E* ep = e->getParent();
      if(ep)
      {
        DElementBase<E>* parent = KeyManager<E>::findDElement(ep);
        assert(parent);
        buildSupports(de,parent);
      }
    }
  }
  virtual ~DataParentSupport() {}
  virtual DElementBase<E>* getParentSupport() const {return parentSupport;}
  virtual void print(std::ostream &os) const;
};

template<class E> void DataParentSupport<E>::print(std::ostream &os) const
{
  std::streamsize width = os.width();
  os.width(width); os <<"";
  DElementBase<E>* parent;
  parent = getParentSupport();
  os << "[" << parent->getDim() << "D," << parent->getNum() << "] ";
  Key key;
  parent->getKey(key);
  os << key;
}

#include "genDataParentSupport.hpp"

#endif // _GEN_DATA_PARENT_SUPPORT_H_