#pragma once
#include "QuatFwd.h"
#include "AxisAngle.h"
#include <string>
//This is a implementation file used by the templated AxisAngle class. The primary purpose of this 
//class is to form a compilation firewall for the Ve
namespace Aftr
{
   namespace QuatImpl
   {
      //template< typename T >
      //Aftr::VectorT<T> make_VectorT( std::string const& str );

      template< typename T >
      std::string toString( QuatT<T> const& v, size_t length );

      template< typename T >
      Aftr::AxisAngleT<T> toAxisAngle( QuatT<T> const& q );

      template< typename T >
      Aftr::QuatT<T> fromAxisAngle( AxisAngleT<T> const& q );

      /// Returns a unit rotation quaternion given a SO(3)
      /// Rotation Matrix (DCM / Display matrix).
      template< typename T >
      Aftr::QuatT<T> fromDCM( Mat4T<T> const& m );

      template< typename T >
      Aftr::Mat4T<T> toRotationMatrix( QuatT<T> const& m );

      template< typename T >
      bool isEqual( QuatT<T> const& a, QuatT<T> const& b, T epsilon = 0.00001 );

      //template< typename T >
      //std::string toStringWithMag( VectorT<T> const& v, size_t length );

      template< typename T >
      std::optional< QuatT<T> > fromString_opt( std::string const& str );
   
   }

}
