// Copyright (c) 1995-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.

#include "StdFail_UndefinedDerivative.hxx"
#include "gp_XY.hxx"
#include "NCollection_Sequence.hxx"
#include "NCollection_HSequence.hxx"

inline void IntSurf_PathPoint::AddUV(const double U, const double V)
{
  sequv->Append(gp_XY(U, V));
}

inline void IntSurf_PathPoint::SetDirections(const gp_Vec& V, const gp_Dir2d& D)
{

  istgt = false;
  vectg = V;
  dirtg = D;
}

inline void IntSurf_PathPoint::SetTangency(const bool Tang)
{

  istgt = Tang;
}

inline void IntSurf_PathPoint::SetPassing(const bool Pass)
{

  ispass = Pass;
}

inline const gp_Pnt& IntSurf_PathPoint::Value() const
{
  return pt;
}

inline void IntSurf_PathPoint::Value2d(double& U, double& V) const
{
  gp_XY uv(sequv->Sequence().First());
  U = uv.X();
  V = uv.Y();
}

inline bool IntSurf_PathPoint::IsPassingPnt() const
{

  return ispass;
}

inline bool IntSurf_PathPoint::IsTangent() const
{

  return istgt;
}

inline const gp_Vec& IntSurf_PathPoint::Direction3d() const
{

  if (istgt)
  {
    throw StdFail_UndefinedDerivative();
  }
  return vectg;
}

inline const gp_Dir2d& IntSurf_PathPoint::Direction2d() const
{

  if (istgt)
  {
    throw StdFail_UndefinedDerivative();
  }
  return dirtg;
}

inline int IntSurf_PathPoint::Multiplicity() const
{

  return (sequv->Length() - 1);
}

inline void IntSurf_PathPoint::Parameters(const int Index, double& U, double& V) const
{
  gp_XY uv(sequv->Value(Index + 1));
  U = uv.X();
  V = uv.Y();
}
