-
Notifications
You must be signed in to change notification settings - Fork 0
/
atoi.h
83 lines (77 loc) · 2.32 KB
/
atoi.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Copyright © 2016 zendo (734181759@qq.com). All rights reserved.
#pragma once
#include <type_traits>
#include <stdint.h>
#if defined(_MSC_VER)
#pragma warning(disable:4244)
#endif
namespace zendo
{
template<typename Integer>
inline bool atoi(const char* str, Integer& value)
{
static_assert(std::is_integral<Integer>::value, "");
bool sign = false;
if (str[0] == '-')
{
sign = true;
++str;
}
char ch = *str;
if (!isdigit(ch))
{
return false;
}
Integer ret = ch - '0';
for(ch = *(++str); ch; ch = *(++str))
{
if (!isdigit(ch))
{
break;
}
ret = ret * 10 + (ch - '0');
}
value = sign ? -ret : ret;
return true;
}
template<typename Integer>
inline bool atoi(const char* str, size_t len, Integer& value)
{
static_assert(std::is_integral<Integer>::value, "");
bool sign = false;
if( str[0] == '-' )
{
sign = true;
++str;
--len;
}
Integer ret = 0;
switch( len )
{
case 20: ret += (str[len - 20] - '0') * 10000000000000000000UL;
case 19: ret += (str[len - 19] - '0') * 1000000000000000000UL;
case 18: ret += (str[len - 18] - '0') * 100000000000000000UL;
case 17: ret += (str[len - 17] - '0') * 10000000000000000UL;
case 16: ret += (str[len - 16] - '0') * 1000000000000000UL;
case 15: ret += (str[len - 15] - '0') * 100000000000000UL;
case 14: ret += (str[len - 14] - '0') * 10000000000000UL;
case 13: ret += (str[len - 13] - '0') * 1000000000000UL;
case 12: ret += (str[len - 12] - '0') * 100000000000UL;
case 11: ret += (str[len - 11] - '0') * 10000000000UL;
case 10: ret += (str[len - 10] - '0') * 1000000000;
case 9: ret += (str[len - 9] - '0') * 100000000;
case 8: ret += (str[len - 8] - '0') * 10000000;
case 7: ret += (str[len - 7] - '0') * 1000000;
case 6: ret += (str[len - 6] - '0') * 100000;
case 5: ret += (str[len - 5] - '0') * 10000;
case 4: ret += (str[len - 4] - '0') * 1000;
case 3: ret += (str[len - 3] - '0') * 100;
case 2: ret += (str[len - 2] - '0') * 10;
case 1: ret += (str[len - 1] - '0');
value = sign ? -ret : ret;
return true;
default:
return false;
}
}
}