#![doc = document_features::document_features!()]
use ordered_float::OrderedFloat;
use std::fmt::{Debug, Display};
use std::hash::Hash;
pub trait Angle:
Clone
+ Copy
+ Debug
+ Default
+ Display
+ PartialEq
+ Eq
+ PartialOrd
+ Ord
+ Hash
+ TryFrom<f64, Error = Error>
+ TryFrom<OrderedFloat<f64>, Error = Error>
+ Into<OrderedFloat<f64>>
+ Into<f64>
{
const MIN: Self;
const MAX: Self;
fn new(degrees: i32, minutes: u32, seconds: f32) -> Result<Self, Error>
where
Self: Sized;
fn as_float(&self) -> OrderedFloat<f64> {
(*self).into()
}
fn to_radians(&self) -> f64 {
self.as_float().0.to_radians()
}
fn from_radians(radians: f64) -> Result<Self, Error>
where
Self: Sized,
{
Self::try_from(OrderedFloat(radians.to_degrees()))
}
fn is_zero(&self) -> bool {
self.as_float() == inner::ZERO
}
fn is_nonzero_positive(&self) -> bool {
!self.is_zero() && self.as_float() > inner::ZERO
}
fn is_nonzero_negative(&self) -> bool {
!self.is_zero() && self.as_float() < inner::ZERO
}
fn degrees(&self) -> i32 {
inner::to_degrees_minutes_seconds(self.as_float()).0
}
fn minutes(&self) -> u32 {
inner::to_degrees_minutes_seconds(self.as_float()).1
}
fn seconds(&self) -> f32 {
inner::to_degrees_minutes_seconds(self.as_float()).2
}
fn abs(self) -> Self
where
Self: Sized,
{
Self::try_from(OrderedFloat(self.as_float().0.abs())).unwrap()
}
fn modulo_max(self) -> Self
where
Self: Sized,
{
Self::try_from(self.as_float() % Self::MAX.as_float()).unwrap()
}
fn checked_abs(self) -> Option<Self>
where
Self: Sized,
{
if self == Self::MIN {
None
} else {
Some(Self::try_from(OrderedFloat(self.as_float().0.abs())).unwrap())
}
}
fn overflowing_abs(self) -> (Self, bool)
where
Self: Sized,
{
if self == Self::MIN {
(self, true)
} else {
(
Self::try_from(OrderedFloat(self.as_float().0.abs())).unwrap(),
false,
)
}
}
fn saturating_abs(self) -> Self
where
Self: Sized,
{
if self == Self::MIN {
Self::MAX
} else {
Self::try_from(OrderedFloat(self.as_float().abs())).unwrap()
}
}
fn strict_abs(self) -> Self
where
Self: Sized,
{
if self == Self::MIN {
panic!("attempt to take absolute value of the minimum value")
} else {
Self::try_from(OrderedFloat(self.as_float().0.abs())).unwrap()
}
}
fn unchecked_abs(self) -> Self
where
Self: Sized,
{
Self::try_from(OrderedFloat(self.as_float().0.abs())).unwrap()
}
fn wrapping_abs(self) -> Self
where
Self: Sized,
{
if self == Self::MIN {
Self::MIN
} else {
Self::try_from(OrderedFloat(self.as_float().0.abs())).unwrap()
}
}
}
mod inner;
pub mod parse;
#[cfg(feature = "elevation")]
pub mod elevation;
#[cfg(feature = "elevation")]
pub use elevation::{CoordinateWithElevation, Elevation};
pub mod coord;
pub use coord::Coordinate;
pub mod error;
pub use error::Error;
pub mod fmt;
pub mod latitude;
pub use latitude::Latitude;
pub mod longitude;
pub use longitude::Longitude;