Formatted API
[platform/core/uifw/dali-core.git] / dali / public-api / math / degree.h
1 #ifndef DALI_DEGREE_H
2 #define DALI_DEGREE_H
3
4 /*
5  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // INTERNAL INCLUDES
22 #include <dali/public-api/common/constants.h>
23 #include <dali/public-api/common/dali-common.h>
24 #include <dali/public-api/math/math-utils.h>
25
26 namespace Dali
27 {
28 /**
29  * @addtogroup dali_core_math
30  * @{
31  */
32
33 struct Radian;
34
35 /**
36  * @brief An angle in degrees.
37  *
38  * This reduces ambiguity when using methods which accept angles in degrees or radians.
39  * @SINCE_1_0.0
40  */
41 struct Degree
42 {
43   /**
44    * @brief Default constructor, initialises to 0.
45    * @SINCE_1_0.0
46    */
47   Degree()
48   : degree(0.f)
49   {
50   }
51
52   /**
53    * @brief Creates an angle in degrees.
54    *
55    * @SINCE_1_0.0
56    * @param[in] value The initial value in degrees
57    */
58   explicit constexpr Degree(float value)
59   : degree(value)
60   {
61   }
62
63   /**
64    * @brief Creates an angle in degrees from a Radian.
65    *
66    * @SINCE_1_0.0
67    * @param[in] value The initial value in Radians
68    */
69   DALI_CORE_API Degree(Radian value);
70
71 public:
72   Degree(const Degree&) = default;            ///< Default copy constructor
73   Degree(Degree&&)      = default;            ///< Default move constructor
74   Degree& operator=(const Degree&) = default; ///< Default copy assignment operator
75   Degree& operator=(Degree&&) = default;      ///< Default move assignment operator
76
77 public:
78   // member data
79   float degree; ///< The value in degrees
80 };
81
82 // compiler generated destructor, copy constructor and assignment operators are ok as this class is POD
83
84 /**
85  * @brief Compares equality between two degrees.
86  *
87  * @SINCE_1_0.0
88  * @param[in] lhs Degree to compare
89  * @param[in] rhs Degree to compare to
90  * @return True if the values are identical
91  */
92 inline bool operator==(const Degree& lhs, const Degree& rhs)
93 {
94   return fabsf(lhs.degree - rhs.degree) < Math::MACHINE_EPSILON_1000; // expect degree angles to be between 0 and 1000
95 }
96
97 /**
98  * @brief Compares inequality between two degrees.
99  *
100  * @SINCE_1_0.0
101  * @param[in] lhs Degree to compare
102  * @param[in] rhs Degree to compare to
103  * @return True if the values are not identical
104  */
105 inline bool operator!=(const Degree& lhs, const Degree& rhs)
106 {
107   return !(operator==(lhs, rhs));
108 }
109
110 /**
111  * @brief Clamps a radian value.
112  * @SINCE_1_0.0
113  * @param angle to clamp
114  * @param min value
115  * @param max value
116  * @return The resulting radian
117  */
118 inline Degree Clamp(Degree angle, float min, float max)
119 {
120   return Degree(Clamp<float>(angle.degree, min, max));
121 }
122
123 /**
124  * @}
125  */
126 } // namespace Dali
127
128 #endif // DALI_DEGREE_H