// Description: Volume of a sphere
// Detail: Some different norms are included to define a sphere
// Documentation: volume.txt
#ifndef PASTELGEOMETRY_SPHERE_VOLUME_H
#define PASTELGEOMETRY_SPHERE_VOLUME_H
#include "pastel/geometry/shape/sphere.h"
#include "pastel/sys/math/gamma.h"
#include "pastel/sys/math/constants.h"
namespace Pastel
{
    //! Returns the natural logarithm of the volume of Manhattan unit sphere.
    /*!
   Preconditions:
   n > 0
   */
    template <typename Real>
    Real lnVolumeUnitSphereManhattan(integer n);
    //! Returns the natural logarithm of the volume of Euclidean unit sphere.
    /*!
   Preconditions:
   n > 0
   */
    template <typename Real>
    Real lnVolumeUnitSphere(integer n);
    //! Returns the volume of the Euclidean unit sphere.
    /*!
   Preconditions:
   n > 0
   */
    template <typename Real>
    Real volumeUnitSphere(integer n);
    //! Returns the natural logarithm of the volume of Minkowski unit sphere.
    /*!
   Preconditions:
   n > 0
   power > 0
   */
    template <typename Real>
    Real lnVolumeUnitSphereMinkowski(
        integer n, 
        const NoDeduction<Real>& power);
    //! Returns the natural logarithm of the volume of Infinity unit sphere.
    /*!
   Preconditions:
   n >= 0
   */
    template <typename Real>
    Real lnVolumeUnitSphereInfinity(integer n);
}
#include "pastel/geometry/volume/sphere_volume.hpp"
#endif