123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- //
- // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
- //
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- //
- // Official repository: https://github.com/boostorg/beast
- //
- #ifndef BOOST_BEAST_DETAIL_STATIC_STRING_HPP
- #define BOOST_BEAST_DETAIL_STATIC_STRING_HPP
- #include <boost/beast/core/string.hpp>
- #include <boost/assert.hpp>
- #include <iterator>
- #include <type_traits>
- namespace boost {
- namespace beast {
- namespace detail {
- // Because k-ballo said so
- template<class T>
- using is_input_iterator =
- std::integral_constant<bool,
- ! std::is_integral<T>::value>;
- template<class CharT, class Traits>
- int
- lexicographical_compare(
- CharT const* s1, std::size_t n1,
- CharT const* s2, std::size_t n2)
- {
- if(n1 < n2)
- return Traits::compare(
- s1, s2, n1) <= 0 ? -1 : 1;
- if(n1 > n2)
- return Traits::compare(
- s1, s2, n2) >= 0 ? 1 : -1;
- return Traits::compare(s1, s2, n1);
- }
- template<class CharT, class Traits>
- int
- lexicographical_compare(
- basic_string_view<CharT, Traits> s1,
- CharT const* s2, std::size_t n2)
- {
- return detail::lexicographical_compare<
- CharT, Traits>(s1.data(), s1.size(), s2, n2);
- }
- template<class CharT, class Traits>
- int
- lexicographical_compare(
- basic_string_view<CharT, Traits> s1,
- basic_string_view<CharT, Traits> s2)
- {
- return detail::lexicographical_compare<CharT, Traits>(
- s1.data(), s1.size(), s2.data(), s2.size());
- }
- // Maximum number of characters in the decimal
- // representation of a binary number. This includes
- // the potential minus sign.
- //
- inline
- std::size_t constexpr
- max_digits(std::size_t bytes)
- {
- return static_cast<std::size_t>(
- bytes * 2.41) + 1 + 1;
- }
- template<class CharT, class Integer, class Traits>
- CharT*
- raw_to_string(
- CharT* buf, Integer x, std::true_type)
- {
- if(x == 0)
- {
- Traits::assign(*--buf, '0');
- return buf;
- }
- if(x < 0)
- {
- x = -x;
- for(;x > 0; x /= 10)
- Traits::assign(*--buf ,
- "0123456789"[x % 10]);
- Traits::assign(*--buf, '-');
- return buf;
- }
- for(;x > 0; x /= 10)
- Traits::assign(*--buf ,
- "0123456789"[x % 10]);
- return buf;
- }
- template<class CharT, class Integer, class Traits>
- CharT*
- raw_to_string(
- CharT* buf, Integer x, std::false_type)
- {
- if(x == 0)
- {
- *--buf = '0';
- return buf;
- }
- for(;x > 0; x /= 10)
- Traits::assign(*--buf ,
- "0123456789"[x % 10]);
- return buf;
- }
- template<
- class CharT,
- class Integer,
- class Traits = std::char_traits<CharT>>
- CharT*
- raw_to_string(CharT* last, std::size_t size, Integer i)
- {
- boost::ignore_unused(size);
- BOOST_ASSERT(size >= max_digits(sizeof(Integer)));
- return raw_to_string<CharT, Integer, Traits>(
- last, i, std::is_signed<Integer>{});
- }
- } // detail
- } // beast
- } // boost
- #endif
|