diff options
author | Zhihao Yuan <zy@miator.net> | 2018-08-01 02:38:30 +0000 |
---|---|---|
committer | Zhihao Yuan <zy@miator.net> | 2018-08-01 02:38:30 +0000 |
commit | d27489645bb8829a952f79e3b211202844238391 (patch) | |
tree | 870d3b745b4a01ddf8b2e569f3f17b81e92ce725 /libcxx/test/std/utilities/charconv/charconv.to.chars/integral.pass.cpp | |
parent | 1dd9501b3a455be649bc5af484f62433753e75cf (diff) | |
download | bcm5719-llvm-d27489645bb8829a952f79e3b211202844238391.tar.gz bcm5719-llvm-d27489645bb8829a952f79e3b211202844238391.zip |
[libc++][C++17] Elementary string conversions for integral types
Summary:
Major QoI considerations:
- The facility is backported to C++14, same as libstdc++.
- Efforts have been made to minimize the header dependencies.
- The design is friendly to the uses of MSVC intrinsics (`__emulu`, `_umul128`, `_BitScanForward`, `_BitScanForward64`) but not implemented; future contributions are welcome.
Thanks to Milo Yip for contributing the implementation of `__u64toa` and `__u32toa`.
References:
https://wg21.link/p0067r5
https://wg21.link/p0682r1
Reviewers: mclow.lists, EricWF
Reviewed By: mclow.lists
Subscribers: ldionne, Quuxplusone, christof, mgorny, cfe-commits
Differential Revision: https://reviews.llvm.org/D41458
llvm-svn: 338479
Diffstat (limited to 'libcxx/test/std/utilities/charconv/charconv.to.chars/integral.pass.cpp')
-rw-r--r-- | libcxx/test/std/utilities/charconv/charconv.to.chars/integral.pass.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/libcxx/test/std/utilities/charconv/charconv.to.chars/integral.pass.cpp b/libcxx/test/std/utilities/charconv/charconv.to.chars/integral.pass.cpp new file mode 100644 index 00000000000..50ca5b1906e --- /dev/null +++ b/libcxx/test/std/utilities/charconv/charconv.to.chars/integral.pass.cpp @@ -0,0 +1,80 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11 +// <charconv> + +// to_chars_result to_chars(char* first, char* last, Integral value, +// int base = 10) + +#include "charconv_test_helpers.h" + +template <typename T> +struct test_basics : to_chars_test_base<T> +{ + using to_chars_test_base<T>::test; + using to_chars_test_base<T>::test_value; + + void operator()() + { + test(0, "0"); + test(42, "42"); + test(32768, "32768"); + test(0, "0", 10); + test(42, "42", 10); + test(32768, "32768", 10); + test(0xf, "f", 16); + test(0xdeadbeaf, "deadbeaf", 16); + test(0755, "755", 8); + + for (int b = 2; b < 37; ++b) + { + using xl = std::numeric_limits<T>; + + test_value(1, b); + test_value(xl::lowest(), b); + test_value((xl::max)(), b); + test_value((xl::max)() / 2, b); + } + } +}; + +template <typename T> +struct test_signed : to_chars_test_base<T> +{ + using to_chars_test_base<T>::test; + using to_chars_test_base<T>::test_value; + + void operator()() + { + test(-1, "-1"); + test(-12, "-12"); + test(-1, "-1", 10); + test(-12, "-12", 10); + test(-21734634, "-21734634", 10); + test(-2647, "-101001010111", 2); + test(-0xcc1, "-cc1", 16); + + for (int b = 2; b < 37; ++b) + { + using xl = std::numeric_limits<T>; + + test_value(0, b); + test_value(xl::lowest(), b); + test_value((xl::max)(), b); + } + } +}; + +int +main() +{ + run<test_basics>(integrals); + run<test_signed>(all_signed); +} |