1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
11 #include <sal/config.h>
13 #include <basegfx/numeric/ftools.hxx>
14 #include <sal/types.h>
15 #include <o3tl/strong_int.hxx>
16 #include <o3tl/unit_conversion.hxx>
21 template <int N
> struct FractionTag
;
22 // 1/Nth fraction of a degree
23 template <typename I
, int N
> using Degree
= o3tl::strong_int
<I
, FractionTag
<N
>>;
25 template <typename I
, int N
> char (&NofDegree(Degree
<I
, N
>))[N
]; // helper
26 // Nof<DegreeN> gives compile-time constant N, needed in templates
27 template <class D
> constexpr int Nof
= sizeof(NofDegree(std::declval
<D
>()));
29 /** tenths of a Degree, normally rotation */
30 typedef Degree
<sal_Int16
, 10> Degree10
;
33 constexpr Degree10
operator""_deg10(unsigned long long n
) { return Degree10
{ n
}; }
35 /** hundredths of a Degree, normally rotation */
36 typedef Degree
<sal_Int32
, 100> Degree100
;
38 // Android has trouble calling the correct overload of std::abs
40 inline Degree100
abs(Degree100 x
) { return Degree100(std::abs(static_cast<int>(x
.get()))); }
42 inline Degree100
abs(Degree100 x
) { return Degree100(std::abs(x
.get())); }
46 constexpr Degree100
operator""_deg100(unsigned long long n
) { return Degree100
{ n
}; }
48 /** conversion functions */
50 template <class To
, typename IofFrom
, int NofFrom
> inline To
to(Degree
<IofFrom
, NofFrom
> x
)
52 constexpr sal_Int64 m
= Nof
<To
> / std::gcd(Nof
<To
>, NofFrom
);
53 constexpr sal_Int64 d
= NofFrom
/ std::gcd(Nof
<To
>, NofFrom
);
54 return To
{ o3tl::convert(x
.get(), m
, d
) };
57 template <class D
> inline double toRadians(D x
) { return basegfx::deg2rad
<Nof
<D
>>(x
.get()); }
58 template <class D
> inline double toDegrees(D x
) { return x
.get() / static_cast<double>(Nof
<D
>); }
60 /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */