7f24ae7025701f9499fa5270cacdbca1cb9b91ef
[platform/framework/native/appfw.git] / src / base / FBaseFloat.cpp
1 //
2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Apache License, Version 2.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //     http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 /**
18  * @file                FBaseFloat.cpp
19  * @brief               This is the implementation file for Float class.
20  * @see         Number class
21  */
22 #include <cfloat>
23 #include <math.h>
24 #include <stdio.h>
25 #include <wchar.h>
26 #include <errno.h>
27 #include <limits.h>
28 #include <FBaseFloat.h>
29 #include <FBaseResult.h>
30 #include <FBaseSysLog.h>
31 #include "FBase_LocalizedNumParser.h"
32
33 namespace Tizen { namespace Base
34 {
35
36 union FloatBitRep
37 {
38         explicit
39         FloatBitRep(float f = 0.0)
40                 : value(f)
41         {
42         };
43
44         FloatBitRep(unsigned int i)
45                 : rep(i)
46         {
47         };
48
49         float value;
50         unsigned int rep;
51 };
52
53 Float::Float(float value)
54         : value(value)
55         , __pFloatImpl(null)
56 {
57 }
58
59 Float::Float(const Float& value)
60         : value(value.value)
61         , __pFloatImpl(null)
62 {
63 }
64
65 Float::~Float(void)
66 {
67 }
68
69 Float&
70 Float::operator =(const Float& rhs)
71 {
72         if (&rhs != this)
73         {
74                 value = rhs.value;
75         }
76         return *this;
77 }
78
79 int
80 Float::Compare(float f1, float f2)
81 {
82         int ret = 0;
83
84         if (f1 > f2)
85         {
86                 ret = 1;
87         }
88         else if (f1 < f2)
89         {
90                 ret = -1;
91         }
92         else
93         {
94                 ret = 0;
95         }
96
97         return ret;
98 }
99
100 int
101 Float::CompareTo(const Float& value) const
102 {
103         return(Float::Compare(this->value, value.value));
104 }
105
106 bool
107 Float::Equals(const Object& obj) const
108 {
109         const Float* pOther = dynamic_cast< const Float* >(&obj);
110
111         if (pOther == null)
112         {
113                 return false;
114         }
115
116         if (Float::Compare(this->value, (*pOther).value) == 0)
117         {
118                 return true;
119         }
120         else
121         {
122                 return false;
123         }
124 }
125
126 int
127 Float::GetHashCode(void) const
128 {
129         float* pTemp = const_cast< float* >(&value);
130         int* pValue = reinterpret_cast< int* >(pTemp);
131         return *pValue;
132 }
133
134 int
135 Float::GetHashCode(float val)
136 {
137         int* pValue = reinterpret_cast< int* >(&val);
138         return *pValue;
139 }
140
141 result
142 Float::Parse(const String& s, float& ret)
143 {
144         double tmpRet = _LocalizedNumParser::ToFloat(s, "");
145
146         if (IsNaN(tmpRet))
147         {
148                 result r = GetLastResult();
149                 SysLogException(NID_BASE, r, "[%s] Propagating.", GetErrorMessage(r));
150                 return r;
151         }
152
153         ret = tmpRet;
154         return E_SUCCESS;
155 }
156
157 char
158 Float::ToChar(void) const
159 {
160         return static_cast< char >(value);
161 }
162
163 short
164 Float::ToShort(void) const
165 {
166         return static_cast< short >(value);
167 }
168
169 int
170 Float::ToInt(void) const
171 {
172         return static_cast< int >(value);
173 }
174
175 long
176 Float::ToLong(void) const
177 {
178         return static_cast< long >(value);
179 }
180
181 long long
182 Float::ToLongLong(void) const
183 {
184         return static_cast< long long >(value);
185 }
186
187 float
188 Float::ToFloat(void) const
189 {
190         return value;
191 }
192
193 double
194 Float::ToDouble(void) const
195 {
196         return static_cast< double >(value);
197 }
198
199 String
200 Float::ToString(void) const
201 {
202         return Float::ToString(value);
203 }
204
205 String
206 Float::ToString(int precision) const
207 {
208 //Dummy implementation to resolve build break
209         return String(L"");
210 }
211
212 String
213 Float::ToString(float value)
214 {
215         return _LocalizedNumParser::ToString(value, "");
216 }
217
218 String
219 Float::ToString(float value, int precision)
220 {
221 //Dummy implementation to resolve build break
222         return String(L"");
223 }
224
225
226 int
227 Float::ToBits(float value)
228 {
229         FloatBitRep bitRep;
230         bitRep.value = value;
231         return bitRep.rep;
232 }
233
234 float
235 Float::ToFloatFromBits(int value)
236 {
237         FloatBitRep bitRep;
238         bitRep.rep = value;
239         return bitRep.value;
240 }
241
242 bool
243 Float::IsFinite(float value)
244 {
245         return isfinite(value);
246 }
247
248 bool
249 Float::IsInfinity(void) const
250 {
251         return Float::IsInfinity(value);
252 }
253
254 bool
255 Float::IsInfinity(float value)
256 {
257         return !Float::IsFinite(value);
258 }
259
260 bool
261 Float::IsNaN(void) const
262 {
263         return Float::IsNaN(value);
264 }
265
266 bool
267 Float::IsNaN(float value)
268 {
269         return isnan(value);
270 }
271
272 float
273 Float::GetMaxValue(void)
274 {
275         return FLT_MAX;
276 }
277
278 float
279 Float::GetMinValue(void)
280 {
281         return FLT_MIN;
282 }
283
284 }} // Tizen::Base