/// This file is part of the X3DToolKit library
/// Copyright (C) 2002-2004  Yannick Le Goc (legoc@imag.fr)

/// http://artis.imag.fr/Members/Yannick.Legoc/X3D/

/// This library is free software; you can redistribute it and/or
/// modify it under the terms of the GNU Lesser General Public
/// License as published by the Free Software Foundation; either
/// version 2.1 of the License, or (at your option) any later version.

/// This library is distributed in the hope that it will be useful,
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
/// Lesser General Public License for more details.

/// You should have received a copy of the GNU Lesser General Public
/// License along with this library; if not, write to the Free Software
/// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#ifndef X3DTK_MESH_SFINDIRECTEDGE_H
#define X3DTK_MESH_SFINDIRECTEDGE_H

#include "MESH_SFEdge.h"

namespace X3DTK {
namespace MESH {

/*! \brief Template class declared in <b><X3DTK/MESH/scenegraph.h></b> 
 *  providing an indirect oriented-edge structure for the Mesh class.
 *
 * \ingroup MeshSceneGraph
 */
 
template<class MData, class VData, class EData, class FData, bool RW>
class SFTemplateIndirectEdge : public SFTemplateEdge<MData, VData, EData, FData, RW>
{
  friend class TemplateMesh<MData, VData, EData, FData, RW>;
  friend class TemplateVertex<MData, VData, EData, FData, RW>;
public:
  typedef EntityMFTemplateFace<MData, VData, EData, FData, RW> MFFace;
  
  /// Returns the Vertex from.
  SFTemplateVertex<MData, VData, EData, FData, RW> *getFromVertex() const;
  /// Gets the Vertex to.
  SFTemplateVertex<MData, VData, EData, FData, RW> *getToVertex() const;
  /// Gets the left faces.
  const MFFace &getLeftFaces() const;
  /// Gets the right faces.
  const MFFace &getRightFaces() const;
  
private:  
  /// Constructor.
  SFTemplateIndirectEdge(SFTemplateEdgeContent<MData, VData, EData, FData, RW> *const edgeContent);
  /// Destructor.
  ~SFTemplateIndirectEdge();

  /// Adds a left face.
  void addLeftFace(SFTemplateFace<MData, VData, EData, FData, RW> *face);
  /// Adds a right face.
  void addRightFace(SFTemplateFace<MData, VData, EData, FData, RW> *face);

  /// Removes a left face.
  void removeLeftFace(SFTemplateFace<MData, VData, EData, FData, RW> *face);
  /// Removes a right face.
  void removeRightFace(SFTemplateFace<MData, VData, EData, FData, RW> *face);
};

}
}

#include "MESH_SFIndirectEdge.inl"

#endif
