Line data Source code
1 : // Copyright Kevlin Henney, 2000-2005.
2 : // Copyright Alexander Nasonov, 2006-2010.
3 : // Copyright Antony Polukhin, 2011-2025.
4 : //
5 : // Distributed under the Boost Software License, Version 1.0. (See
6 : // accompanying file LICENSE_1_0.txt or copy at
7 : // http://www.boost.org/LICENSE_1_0.txt)
8 : //
9 : // what: lexical_cast custom keyword cast
10 : // who: contributed by Kevlin Henney,
11 : // enhanced with contributions from Terje Slettebo,
12 : // with additional fixes and suggestions from Gennaro Prota,
13 : // Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov,
14 : // Alexander Nasonov, Antony Polukhin, Justin Viiret, Michael Hofmann,
15 : // Cheng Yang, Matthew Bradbury, David W. Birdsall, Pavel Korzh and other Boosters
16 : // when: November 2000, March 2003, June 2005, June 2006, March 2011 - 2014
17 :
18 : #ifndef BOOST_LEXICAL_CAST_INCLUDED
19 : #define BOOST_LEXICAL_CAST_INCLUDED
20 :
21 : #include <boost/config.hpp>
22 : #ifdef BOOST_HAS_PRAGMA_ONCE
23 : # pragma once
24 : #endif
25 :
26 : #if defined(BOOST_NO_STRINGSTREAM) || defined(BOOST_NO_STD_WSTRING)
27 : #define BOOST_LCAST_NO_WCHAR_T
28 : #endif
29 :
30 : #include <boost/lexical_cast/detail/buffer_view.hpp>
31 :
32 : #include <boost/lexical_cast/bad_lexical_cast.hpp>
33 : #include <boost/lexical_cast/try_lexical_convert.hpp>
34 :
35 : namespace boost
36 : {
37 : template <typename Target, typename Source>
38 36 : inline Target lexical_cast(const Source &arg)
39 : {
40 36 : Target result = Target();
41 :
42 36 : if (!boost::conversion::detail::try_lexical_convert(arg, result)) {
43 0 : boost::conversion::detail::throw_bad_cast<Source, Target>();
44 0 : }
45 :
46 36 : return result;
47 : }
48 :
49 : template <typename Target>
50 : inline Target lexical_cast(const char* chars, std::size_t count)
51 : {
52 : return ::boost::lexical_cast<Target>(
53 : ::boost::conversion::detail::make_buffer_view(chars, chars + count)
54 : );
55 : }
56 :
57 : template <typename Target>
58 : inline Target lexical_cast(const unsigned char* chars, std::size_t count)
59 : {
60 : return ::boost::lexical_cast<Target>(
61 : ::boost::conversion::detail::make_buffer_view(chars, chars + count)
62 : );
63 : }
64 :
65 : template <typename Target>
66 : inline Target lexical_cast(const signed char* chars, std::size_t count)
67 : {
68 : return ::boost::lexical_cast<Target>(
69 : ::boost::conversion::detail::make_buffer_view(chars, chars + count)
70 : );
71 : }
72 :
73 : #ifndef BOOST_LCAST_NO_WCHAR_T
74 : template <typename Target>
75 : inline Target lexical_cast(const wchar_t* chars, std::size_t count)
76 : {
77 : return ::boost::lexical_cast<Target>(
78 : ::boost::conversion::detail::make_buffer_view(chars, chars + count)
79 : );
80 : }
81 : #endif
82 : template <typename Target>
83 : inline Target lexical_cast(const char16_t* chars, std::size_t count)
84 : {
85 : return ::boost::lexical_cast<Target>(
86 : ::boost::conversion::detail::make_buffer_view(chars, chars + count)
87 : );
88 : }
89 : template <typename Target>
90 : inline Target lexical_cast(const char32_t* chars, std::size_t count)
91 : {
92 : return ::boost::lexical_cast<Target>(
93 : ::boost::conversion::detail::make_buffer_view(chars, chars + count)
94 : );
95 : }
96 :
97 : } // namespace boost
98 :
99 : #undef BOOST_LCAST_NO_WCHAR_T
100 :
101 : #endif // BOOST_LEXICAL_CAST_INCLUDED
102 :
|