// GenFem - A high-level finite element library
// Copyright (C) 2010-2026 Eric Bechet
//
// See the LICENSE file for license information and contributions.
// Please report all bugs and problems to <bechet@cadxfem.org>.
//
// Initial design: Eric Bechet (rev.873)


#include "genFilters.h"
#include "MElement.h"
#include "dofManager.h"

//--------------------------------------------------------------------------
// Element filters
//--------------------------------------------------------------------------

bool genFilterElementGroupVertex::operator()(MElement* e) const
{
  MElement* ep = e->getParent();
  if (!ep) ep = e;

  for (int i=0; i<ep->getNumVertices(); ++i)
  {
    MVertex* v = ep->getVertex(i);
    if (!g->vcontains(v))
      return false;
  }
  return true;
}

bool genFilterElementParent::operator()(MElement* e) const
{
  if (e->getParent()==NULL)
    return true;
  return false;
}


bool  genFilterElementChild::operator()(MElement* e) const
{
  if (e->getParent()!=NULL)
    return true;
  return false;
}

bool genFilterElementType::operator()(MElement* e) const
{
  if (e->getType()==type)
    return true;
  return false;
}

bool genFilterElementTypeMSH::operator()(MElement* e) const
{
  if (e->getTypeForMSH()==type)
    return true;
  return false;
}

bool genFilterElementOperatorOnParent::operator()(MElement* e) const
{
  if (e->getParent())
    if ((*filter)(e->getParent()))
      return true;
  return false;
}


//--------------------------------------------------------------------------
// Dof filters
//--------------------------------------------------------------------------

bool genFilterDofComponent::operator()(const Dof &key) const
{
  int type = key.getType();
  int icomp, iphys;
  Dof::getTwoIntsFromType(type, icomp, iphys);
  if (icomp == comp) return true;
  return false;
}

bool genFilterDofMultiComponents::operator()(const Dof &key) const
{
  int type = key.getType();
  int icomp, iphys;
  Dof::getTwoIntsFromType(type, icomp, iphys);
  std::set<int>::iterator it = comps.find(icomp);
  if(it != comps.end()) return true;
  return false;
}

bool genFilterDofEntity::operator()(const Dof &key) const
{
  if (key.getEntity() == entity) return true;
  return false;
}

bool genFilterDofMultiEntities::operator()(const Dof &key) const
{
  std::set<long int>::iterator it;
  it = entities->find(key.getEntity());
  if (it != entities->end())
    return true;
  return false;
}



/*
bool genFilterNodeEnriched::operator()(const Dof &key) const
{
  std::set<int>::iterator it1;
  std::set<int>::iterator it2;
  int i1, i2;
  Dof::getTwoIntsFromType(key.getType(), i1, i2);
  it2 = EnrichComp->find(i1);
  it1 = TagEnrichedVertex->find(key.getEntity());
  if ((it1 != TagEnrichedVertex->end()) && (it2 != EnrichComp->end()))
    return true;
  else return false;
}

genFilterElementsCutByLevelSet::genFilterElementsCutByLevelSet(std::pair<int,int> LevelSetEntity , std::set<int>* EnrichComp_)
{
  EnrichComp = EnrichComp_;
  _LevelSetEntity = LevelSetEntity;
  // genGroupOfElements to get all the elements associate with the level set -- (work with *current GModel)
  genGroupOfElements* LevelSetElements = new genGroupOfElements (_LevelSetEntity.first, _LevelSetEntity.second);
  // tag enriched vertex determination
  std::set<MElement*>::const_iterator it = LevelSetElements->begin();
  for (; it != LevelSetElements->end(); it++)
  {
    MElement* e = *it;
    MElement* ep = e->getParent();
    if (ep)
    { // if element got parents
      for (int k = 0; k < ep->getNumVertices(); ++k)
      {  // for all vertices in the element parent
        TagEnrichedVertex.insert(ep->getVertex(k)->getNum());
      }
    }
  }
}

bool genFilterElementsCutByLevelSet::operator()(const Dof &key) const
{
  std::set<int>::const_iterator it1;
  std::set<int>::const_iterator it2;
  int i1, i2;
  Dof::getTwoIntsFromType(key.getType(), i1, i2);
  it2 = EnrichComp->find(i1);
  it1 = TagEnrichedVertex.find(key.getEntity());
  if ((it1!=TagEnrichedVertex.end()) && (it2 != EnrichComp->end())){
    return true;
  }
  else return false;
}
*/