Line data 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_proto 8 : // 9 : 10 : #ifndef BOOST_HTTP_PROTO_DETAIL_NUMBER_STRING_HPP 11 : #define BOOST_HTTP_PROTO_DETAIL_NUMBER_STRING_HPP 12 : 13 : #include <boost/http_proto/detail/config.hpp> 14 : #include <boost/core/detail/string_view.hpp> 15 : #include <cstdint> 16 : 17 : namespace boost { 18 : namespace http_proto { 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 0 : construct_unsigned( 31 : std::uint64_t n) noexcept 32 : { 33 0 : buf_[buf_size] = '\0'; 34 0 : auto const end = 35 : &buf_[buf_size]; 36 0 : auto p = end; 37 0 : if(n == 0) 38 : { 39 0 : *--p = '0'; 40 : } 41 : else 42 : { 43 0 : while(n > 0) 44 : { 45 0 : *--p = '0' + (n%10); 46 0 : n /= 10; 47 : } 48 : } 49 0 : size_ = end - p; 50 0 : } 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 0 : number_string( 61 : std::uint64_t n) noexcept 62 0 : { 63 0 : construct_unsigned(n); 64 0 : } 65 : 66 : char const* 67 0 : data() const noexcept 68 : { 69 0 : return &buf_[ 70 0 : buf_size] - size_; 71 : } 72 : 73 : std::size_t 74 0 : size() const noexcept 75 : { 76 0 : return size_; 77 : } 78 : 79 : core::string_view 80 0 : str() const noexcept 81 : { 82 0 : return core::string_view( 83 0 : data(), size()); 84 : } 85 : 86 0 : operator 87 : core::string_view() const noexcept 88 : { 89 0 : return str(); 90 : } 91 : }; 92 : 93 : } // detail 94 : } // http_proto 95 : } // boost 96 : 97 : #endif