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/boostorg/url
8 : //
9 :
10 : #ifndef BOOST_URL_DETAIL_PRINT_HPP
11 : #define BOOST_URL_DETAIL_PRINT_HPP
12 :
13 : #include <cstdint>
14 : #include <type_traits>
15 :
16 : namespace boost {
17 : namespace urls {
18 : namespace detail {
19 :
20 : // std::uint64_t
21 : // 18446744073709551615
22 : // 1 2
23 : template<class T>
24 : struct printed
25 : : std::false_type
26 : {
27 : };
28 :
29 : // 16-bit unsigned
30 : template<>
31 : class printed<std::uint16_t>
32 : : std::false_type
33 : {
34 : char n_;
35 : char buf_[5];
36 :
37 : public:
38 23 : printed(std::uint16_t n)
39 23 : {
40 23 : char* it =
41 23 : buf_ + sizeof(buf_);
42 23 : if(n == 0)
43 : {
44 16 : *--it = '0';
45 16 : n_ = 1;
46 : }
47 : else
48 : {
49 35 : while(n > 0)
50 : {
51 28 : *--it = '0' + (n % 10);
52 28 : n /= 10;
53 : }
54 7 : n_ = static_cast<char>(
55 7 : sizeof(buf_) - (
56 7 : it - buf_));
57 : }
58 23 : }
59 :
60 : core::string_view
61 69 : string() const noexcept
62 : {
63 138 : return core::string_view(buf_ +
64 69 : sizeof(buf_) - n_, n_);
65 : }
66 : };
67 :
68 : template<class T>
69 : printed<T>
70 23 : make_printed(T t)
71 : {
72 23 : return printed<T>(t);
73 : }
74 :
75 : } // detail
76 : } // urls
77 : } // boost
78 :
79 : #endif
|