src/detail/number_string.hpp

100.0% Lines (25/25) 100.0% Functions (6/6)
src/detail/number_string.hpp
Line TLA Hits Source Code
1 //
2 // Copyright (c) 2019 Vinnie Falco ([email protected])
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 37 construct_unsigned(
31 std::uint64_t n) noexcept
32 {
33 37 buf_[buf_size] = '\0';
34 37 auto const end =
35 &buf_[buf_size];
36 37 auto p = end;
37 37 if(n == 0)
38 {
39 6 *--p = '0';
40 }
41 else
42 {
43 74 while(n > 0)
44 {
45 43 *--p = '0' + (n%10);
46 43 n /= 10;
47 }
48 }
49 37 size_ = end - p;
50 37 }
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 37 number_string(
61 std::uint64_t n) noexcept
62 37 {
63 37 construct_unsigned(n);
64 37 }
65
66 char const*
67 37 data() const noexcept
68 {
69 37 return &buf_[
70 37 buf_size] - size_;
71 }
72
73 std::size_t
74 37 size() const noexcept
75 {
76 37 return size_;
77 }
78
79 core::string_view
80 37 str() const noexcept
81 {
82 37 return core::string_view(
83 37 data(), size());
84 }
85
86 37 operator
87 core::string_view() const noexcept
88 {
89 37 return str();
90 }
91 };
92
93 } // detail
94 } // http
95 } // boost
96
97 #endif
98