xref: /llvm-project/libcxx/test/support/parse_integer.h (revision 953af0e7f1bcb42136be1a0ea9cdd5aa1fb74852)
1cfa1376aSLouis Dionne //===----------------------------------------------------------------------===//
2cfa1376aSLouis Dionne //
3cfa1376aSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4cfa1376aSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5cfa1376aSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6cfa1376aSLouis Dionne //
7cfa1376aSLouis Dionne //===----------------------------------------------------------------------===//
8cfa1376aSLouis Dionne 
9cfa1376aSLouis Dionne #ifndef LIBCPP_TEST_SUPPORT_PARSE_INTEGER_H
10cfa1376aSLouis Dionne #define LIBCPP_TEST_SUPPORT_PARSE_INTEGER_H
11cfa1376aSLouis Dionne 
12cfa1376aSLouis Dionne #include <string>
13cfa1376aSLouis Dionne 
14cfa1376aSLouis Dionne namespace detail {
15cfa1376aSLouis Dionne template <class T>
16cfa1376aSLouis Dionne struct parse_integer_impl;
17cfa1376aSLouis Dionne 
18cfa1376aSLouis Dionne template <>
19cfa1376aSLouis Dionne struct parse_integer_impl<int> {
20cfa1376aSLouis Dionne     template <class CharT>
21cfa1376aSLouis Dionne     int operator()(std::basic_string<CharT> const& str) const {
22cfa1376aSLouis Dionne         return std::stoi(str);
23cfa1376aSLouis Dionne     }
24cfa1376aSLouis Dionne };
25cfa1376aSLouis Dionne 
26cfa1376aSLouis Dionne template <>
27cfa1376aSLouis Dionne struct parse_integer_impl<long> {
28cfa1376aSLouis Dionne     template <class CharT>
29cfa1376aSLouis Dionne     long operator()(std::basic_string<CharT> const& str) const {
30cfa1376aSLouis Dionne         return std::stol(str);
31cfa1376aSLouis Dionne     }
32cfa1376aSLouis Dionne };
33cfa1376aSLouis Dionne 
34cfa1376aSLouis Dionne template <>
35cfa1376aSLouis Dionne struct parse_integer_impl<long long> {
36cfa1376aSLouis Dionne     template <class CharT>
37cfa1376aSLouis Dionne     long long operator()(std::basic_string<CharT> const& str) const {
38cfa1376aSLouis Dionne         return std::stoll(str);
39cfa1376aSLouis Dionne     }
40cfa1376aSLouis Dionne };
41cfa1376aSLouis Dionne 
42cfa1376aSLouis Dionne template <>
43cfa1376aSLouis Dionne struct parse_integer_impl<unsigned int> {
44cfa1376aSLouis Dionne     template <class CharT>
45cfa1376aSLouis Dionne     unsigned int operator()(std::basic_string<CharT> const& str) const {
46cfa1376aSLouis Dionne         return std::stoul(str);
47cfa1376aSLouis Dionne     }
48cfa1376aSLouis Dionne };
49cfa1376aSLouis Dionne 
50cfa1376aSLouis Dionne template <>
51cfa1376aSLouis Dionne struct parse_integer_impl<unsigned long> {
52cfa1376aSLouis Dionne     template <class CharT>
53cfa1376aSLouis Dionne     unsigned long operator()(std::basic_string<CharT> const& str) const {
54cfa1376aSLouis Dionne         return std::stoul(str);
55cfa1376aSLouis Dionne     }
56cfa1376aSLouis Dionne };
57cfa1376aSLouis Dionne 
58cfa1376aSLouis Dionne template <>
59cfa1376aSLouis Dionne struct parse_integer_impl<unsigned long long> {
60cfa1376aSLouis Dionne     template <class CharT>
61cfa1376aSLouis Dionne     unsigned long long operator()(std::basic_string<CharT> const& str) const {
62cfa1376aSLouis Dionne         return std::stoull(str);
63cfa1376aSLouis Dionne     }
64cfa1376aSLouis Dionne };
65*953af0e7SLouis Dionne } // namespace detail
66cfa1376aSLouis Dionne 
67cfa1376aSLouis Dionne template <class T, class CharT>
68cfa1376aSLouis Dionne T parse_integer(std::basic_string<CharT> const& str) {
69cfa1376aSLouis Dionne     return detail::parse_integer_impl<T>()(str);
70cfa1376aSLouis Dionne }
71cfa1376aSLouis Dionne 
72cfa1376aSLouis Dionne #endif // LIBCPP_TEST_SUPPORT_PARSE_INTEGER_H
73