55#include < algorithm>
66#include " fast_float/fast_float.h"
77
8- char * uint8_to_chars_manual (char * ptr, uint8_t value) {
9- if (value == 0 ) {
10- *ptr++ = ' 0' ;
11- return ptr;
12- }
13- char * start = ptr;
14- while (value > 0 ) {
15- *ptr++ = ' 0' + (value % 10 );
16- value /= 10 ;
17- }
18- // Reverse the digits written so far
19- std::reverse (start, ptr);
8+ char *uint8_to_chars_manual (char *ptr, uint8_t value) {
9+ if (value == 0 ) {
10+ *ptr++ = ' 0' ;
2011 return ptr;
12+ }
13+ char *start = ptr;
14+ while (value > 0 ) {
15+ *ptr++ = ' 0' + (value % 10 );
16+ value /= 10 ;
17+ }
18+ // Reverse the digits written so far
19+ std::reverse (start, ptr);
20+ return ptr;
2121}
2222
23- void uint32_to_ipv4_string (uint32_t ip, char * buffer) {
24- uint8_t octets[4 ] = {
25- static_cast <uint8_t >(ip >> 24 ),
26- static_cast <uint8_t >(ip >> 16 ),
27- static_cast <uint8_t >(ip >> 8 ),
28- static_cast <uint8_t >(ip)
29- };
23+ void uint32_to_ipv4_string (uint32_t ip, char *buffer) {
24+ uint8_t octets[4 ] = {static_cast <uint8_t >(ip >> 24 ),
25+ static_cast <uint8_t >(ip >> 16 ),
26+ static_cast <uint8_t >(ip >> 8 ), static_cast <uint8_t >(ip)};
3027
31- char * ptr = buffer;
28+ char * ptr = buffer;
3229
33- for (int i = 0 ; i < 4 ; ++i) {
34- ptr = uint8_to_chars_manual (ptr, octets[i]);
30+ for (int i = 0 ; i < 4 ; ++i) {
31+ ptr = uint8_to_chars_manual (ptr, octets[i]);
3532
36- if (i < 3 ) {
37- *ptr++ = ' .' ;
38- }
33+ if (i < 3 ) {
34+ *ptr++ = ' .' ;
3935 }
40- *ptr = ' \0 ' ;
36+ }
37+ *ptr = ' \0 ' ;
4138}
4239
43- fastfloat_really_inline uint32_t ipv4_string_to_uint32 (const char * str, const char * end) {
40+ fastfloat_really_inline uint32_t ipv4_string_to_uint32 (const char *str,
41+ const char *end) {
4442 uint32_t ip = 0 ;
45- const char * current = str;
43+ const char * current = str;
4644
4745 for (int i = 0 ; i < 4 ; ++i) {
4846 uint8_t value;
@@ -63,30 +61,33 @@ fastfloat_really_inline uint32_t ipv4_string_to_uint32(const char* str, const ch
6361}
6462
6563bool test_all_ipv4_conversions () {
66- std::cout << " Testing all IPv4 conversions... 0, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, ..." << std::endl;
67- char buffer[16 ];
68- for (uint64_t ip = 0 ; ip <= 0xFFFFFFFF ; ip+=1000 ) {
69- if (ip % 10000000 == 0 ) {
70- std::cout << " ." << std::flush;
71- }
72- uint32_to_ipv4_string (static_cast <uint32_t >(ip), buffer);
73- const char * end = buffer + strlen (buffer);
74- uint32_t parsed_ip = ipv4_string_to_uint32 (buffer, end);
75- if (parsed_ip != ip) {
76- std::cerr << " Mismatch: original " << ip << " , parsed " << parsed_ip << std::endl;
77- return false ;
78- }
64+ std::cout << " Testing all IPv4 conversions... 0, 1000, 2000, 3000, 4000, "
65+ " 5000, 6000, 7000, 8000, 9000, ..."
66+ << std::endl;
67+ char buffer[16 ];
68+ for (uint64_t ip = 0 ; ip <= 0xFFFFFFFF ; ip += 1000 ) {
69+ if (ip % 10000000 == 0 ) {
70+ std::cout << " ." << std::flush;
71+ }
72+ uint32_to_ipv4_string (static_cast <uint32_t >(ip), buffer);
73+ const char *end = buffer + strlen (buffer);
74+ uint32_t parsed_ip = ipv4_string_to_uint32 (buffer, end);
75+ if (parsed_ip != ip) {
76+ std::cerr << " Mismatch: original " << ip << " , parsed " << parsed_ip
77+ << std::endl;
78+ return false ;
7979 }
80- std::cout << std::endl;
81- return true ;
80+ }
81+ std::cout << std::endl;
82+ return true ;
8283}
8384
8485int main () {
85- if (test_all_ipv4_conversions ()) {
86- std::cout << " All IPv4 conversions passed!" << std::endl;
87- return EXIT_SUCCESS;
88- } else {
89- std::cerr << " IPv4 conversion test failed!" << std::endl;
90- return EXIT_FAILURE;
91- }
86+ if (test_all_ipv4_conversions ()) {
87+ std::cout << " All IPv4 conversions passed!" << std::endl;
88+ return EXIT_SUCCESS;
89+ } else {
90+ std::cerr << " IPv4 conversion test failed!" << std::endl;
91+ return EXIT_FAILURE;
92+ }
9293}
0 commit comments