sync with tizen_2.0
[platform/framework/native/appfw.git] / src / base / FBaseInt8.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 /**
19  * @file                FBaseInt8.cpp
20  * @brief               This is the implementation file for Int8 class.
21  * @see                 Number class
22  */
23
24 #include <wchar.h>
25 #include <errno.h>
26 #include <limits.h>
27 #include <FBaseInt8.h>
28 #include <FBaseResult.h>
29 #include <FBaseCharacter.h>
30 #include <FBaseSysLog.h>
31
32
33
34 namespace Tizen { namespace Base
35 {
36
37 Int8::Int8(char value)
38         : value((signed char)value)
39         , __pInt8Impl(null)
40 {
41 }
42
43 Int8::Int8(const Int8& value)
44         : value(value.value)
45         , __pInt8Impl(null)
46 {
47 }
48
49 Int8::~Int8(void)
50 {
51 }
52
53 Int8&
54 Int8::operator =(const Int8& rhs)
55 {
56         if (&rhs != this)
57         {
58                 value = rhs.value;
59         }
60         return (*this);
61 }
62
63 int
64 Int8::Compare(char ch1, char ch2)
65 {
66         return ((signed char) ch1 < (signed char) ch2 ? -1 : (ch1 == ch2 ? 0 : 1));
67 }
68
69 int
70 Int8::CompareTo(const Int8& value) const
71 {
72         return (Int8::Compare(this->value, value.value));
73 }
74
75 bool
76 Int8::Equals(const Object& obj) const
77 {
78         const Int8* pOther = dynamic_cast <const Int8*>(&obj);
79         if (pOther == null)
80         {
81                 return (false);
82         }
83
84         return (value == (*pOther).value);
85 }
86
87 int
88 Int8::GetHashCode(void) const
89 {
90         return static_cast<int> (value);
91 }
92
93 int
94 Int8::GetHashCode(char val)
95 {
96         return static_cast<int> (val);
97 }
98
99 result
100 Int8::Decode(const String& s, char& ret)
101 {
102         SysTryReturn(NID_BASE, s.GetLength() >= 1, E_NUM_FORMAT, E_NUM_FORMAT,
103                 "[%s] The length of string s MUST be greater than 0.", GetErrorMessage(E_NUM_FORMAT));
104
105         long value = 0;
106         int radix = 0;
107         wchar_t* pEnd = null;
108         String str(s);
109
110         // Find radix
111         if (s[0] == L'#')
112         {
113                 radix = Character::RADIX_HEXADECIMAL;
114
115                 // Remove '#'
116                 str.Remove(0, 1);
117         }
118         else if (s[0] == L'0' && (s.GetLength() >= 2))
119         {
120                 if (s[1] == L'x' || s[1] == L'X')
121                 {
122                         radix = Character::RADIX_HEXADECIMAL;
123                 }
124                 else
125                 {
126                         radix = Character::RADIX_OCTAL;
127                 }
128         }
129         else
130         {
131                 radix = Character::RADIX_DECIMAL;
132         }
133
134         result r = E_SUCCESS;
135
136         errno = 0;
137         value = wcstol(str.GetPointer(), &pEnd, radix);
138         SysTryCatch(NID_BASE, (pEnd[0] == 0), r = E_NUM_FORMAT, E_NUM_FORMAT,
139                 "[%s] Int8 decode failed. Scan stopped at (%ls).", GetErrorMessage(E_NUM_FORMAT), pEnd);
140         SysTryCatch(NID_BASE, !((value == LONG_MAX || value == LONG_MIN) && (errno != 0)), r = E_NUM_FORMAT, E_NUM_FORMAT,
141                 "[%s] Decoded value cannot fit into an Int8.", GetErrorMessage(E_NUM_FORMAT));
142
143 CATCH:
144         if (value > Int8::VALUE_MAX)
145         {
146                 ret = Int8::VALUE_MAX;
147         }
148         else if (value < (signed char) Int8::VALUE_MIN)
149         {
150                 ret = (signed char) Int8::VALUE_MIN;
151         }
152         else
153         {
154                 ret = (char) value;
155         }
156
157         return r;
158 }
159
160 result
161 Int8::Parse(const String& s, char& ret)
162 {
163         int len = s.GetLength();
164         SysTryReturn(NID_BASE, (len > 0 && len < 5), E_NUM_FORMAT, E_NUM_FORMAT,
165                                 "[%s] The length of s(%ls) MUST be greater than 0 and less than 5.", GetErrorMessage(E_NUM_FORMAT), s.GetPointer());
166
167         return Parse(s, Character::RADIX_DECIMAL, ret);
168 }
169
170 result
171 Int8::Parse(const String& s, int radix, char& ret)
172 {
173         SysTryReturn(NID_BASE, ((radix == Character::RADIX_BINARY) || (radix == Character::RADIX_OCTAL) ||
174                 (radix == Character::RADIX_DECIMAL) || (radix == Character::RADIX_HEXADECIMAL)), E_OUT_OF_RANGE, E_OUT_OF_RANGE,
175                 "[%s] The radix(%d) MUST be one of 2, 8, 10 and 16.", GetErrorMessage(E_OUT_OF_RANGE), radix);
176
177         wchar_t* pEnd = null;
178         long value = 0;
179
180         int len = s.GetLength();
181         SysTryReturn(NID_BASE, (len > 0), E_NUM_FORMAT, E_NUM_FORMAT, "[%s] The length of s MUST be greater than 0.",
182                 GetErrorMessage(E_NUM_FORMAT));
183
184         result r = E_SUCCESS;
185
186         errno = 0;
187         value = wcstol(s.GetPointer(), &pEnd, radix);
188         SysTryCatch(NID_BASE, (pEnd[0] == 0), r = E_NUM_FORMAT, E_NUM_FORMAT, "[%s] Int8 parse failed. Scan stopped at (%ls).",
189                 GetErrorMessage(E_NUM_FORMAT), pEnd);
190         SysTryCatch(NID_BASE, !((value == LONG_MAX || value == LONG_MIN) && (errno != 0)), r = E_NUM_FORMAT, E_NUM_FORMAT,
191                 "[%s] Parsed value cannot fit into an Int8.", GetErrorMessage(E_NUM_FORMAT));
192
193 CATCH:
194         if (value > Int8::VALUE_MAX)
195         {
196                 ret = Int8::VALUE_MAX;
197         }
198         else if (value < (signed char) Int8::VALUE_MIN)
199         {
200                 ret = (signed char) Int8::VALUE_MIN;
201         }
202         else
203         {
204                 ret = (char) value;
205         }
206
207         return r;
208 }
209
210 char
211 Int8::ToChar(void) const
212 {
213         return static_cast<char> (value);
214 }
215
216 short
217 Int8::ToShort(void) const
218 {
219         return static_cast<short> (value);
220 }
221
222 int
223 Int8::ToInt(void) const
224 {
225         return static_cast<int> (value);
226 }
227
228 long
229 Int8::ToLong(void) const
230 {
231         return static_cast<long> (value);
232 }
233
234 long long
235 Int8::ToLongLong(void) const
236 {
237         return static_cast<long long> (value);
238 }
239
240 float
241 Int8::ToFloat(void) const
242 {
243         return static_cast<float> (value);
244 }
245
246 double
247 Int8::ToDouble(void) const
248 {
249         return static_cast<double> (value);
250 }
251
252 String
253 Int8::ToString(void) const
254 {
255         return (Int8::ToString(value));
256 }
257
258 String
259 Int8::ToString(char value)
260 {
261         const static unsigned int INT8_LENGTH_MAX = 4;
262
263         wchar_t sValue[INT8_LENGTH_MAX + 1] = {0, };
264         swprintf(sValue, (sizeof(sValue) / sizeof(sValue[0])), L"%d", value);
265
266         return String(sValue);
267 }
268
269 }} //Tizen::Base