libs/http/src/detail/number_string.hpp

100.0% Lines (25/25) 100.0% Functions (6/6) 100.0% Branches (4/4)
libs/http/src/detail/number_string.hpp
Line Branch Hits Source Code
1 //
2 // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // Official repository: https://github.com/CPPAlliance/http
8 //
9
10 #ifndef BOOST_HTTP_DETAIL_NUMBER_STRING_HPP
11 #define BOOST_HTTP_DETAIL_NUMBER_STRING_HPP
12
13 #include <boost/http/detail/config.hpp>
14 #include <boost/core/detail/string_view.hpp>
15 #include <cstdint>
16
17 namespace boost {
18 namespace http {
19 namespace detail {
20
21 // Convert integer to decimal
22 // string using in-place storage
23 class number_string
24 {
25 static constexpr unsigned buf_size = 18;
26 char buf_[buf_size + 1];
27 std::size_t size_ = 0;
28
29 void
30 36 construct_unsigned(
31 std::uint64_t n) noexcept
32 {
33 36 buf_[buf_size] = '\0';
34 36 auto const end =
35 &buf_[buf_size];
36 36 auto p = end;
37
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 30 times.
36 if(n == 0)
38 {
39 6 *--p = '0';
40 }
41 else
42 {
43
2/2
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 30 times.
72 while(n > 0)
44 {
45 42 *--p = '0' + (n%10);
46 42 n /= 10;
47 }
48 }
49 36 size_ = end - p;
50 36 }
51
52 public:
53 number_string() = default;
54 number_string(
55 number_string const&) = default;
56 number_string& operator=
57 (number_string const&) = default;
58
59 explicit
60 36 number_string(
61 std::uint64_t n) noexcept
62 36 {
63 36 construct_unsigned(n);
64 36 }
65
66 char const*
67 36 data() const noexcept
68 {
69 36 return &buf_[
70 36 buf_size] - size_;
71 }
72
73 std::size_t
74 36 size() const noexcept
75 {
76 36 return size_;
77 }
78
79 core::string_view
80 36 str() const noexcept
81 {
82 36 return core::string_view(
83 36 data(), size());
84 }
85
86 36 operator
87 core::string_view() const noexcept
88 {
89 36 return str();
90 }
91 };
92
93 } // detail
94 } // http
95 } // boost
96
97 #endif
98