1// Copyright Kevlin Henney, 2000-2005.
2// Copyright Alexander Nasonov, 2006-2010.
3// Copyright Antony Polukhin, 2011-2023.
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#include <boost/config/pragma_message.hpp>
27#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \
28 defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) || \
29 defined(BOOST_NO_CXX11_CONSTEXPR) || \
30 defined(BOOST_NO_CXX11_NULLPTR) || \
31 defined(BOOST_NO_CXX11_NOEXCEPT) || \
32 defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) || \
33 defined(BOOST_NO_CXX11_FINAL) || \
34 defined(BOOST_NO_CXX11_ALIGNOF) || \
35 defined(BOOST_NO_CXX11_STATIC_ASSERT) || \
36 defined(BOOST_NO_CXX11_SMART_PTR) || \
37 defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) || \
38 defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
39
40BOOST_PRAGMA_MESSAGE("C++03 support is deprecated in Boost.LexicalCast 1.82 and will be removed in Boost.LexicalCast 1.84.")
41
42#endif
43
44#if defined(BOOST_NO_STRINGSTREAM) || defined(BOOST_NO_STD_WSTRING)
45#define BOOST_LCAST_NO_WCHAR_T
46#endif
47
48#include <boost/range/iterator_range_core.hpp>
49#include <boost/lexical_cast/bad_lexical_cast.hpp>
50#include <boost/lexical_cast/try_lexical_convert.hpp>
51
52namespace boost
53{
54 template <typename Target, typename Source>
55 inline Target lexical_cast(const Source &arg)
56 {
57 Target result = Target();
58
59 if (!boost::conversion::detail::try_lexical_convert(arg, result)) {
60 boost::conversion::detail::throw_bad_cast<Source, Target>();
61 }
62
63 return result;
64 }
65
66 template <typename Target>
67 inline Target lexical_cast(const char* chars, std::size_t count)
68 {
69 return ::boost::lexical_cast<Target>(
70 ::boost::iterator_range<const char*>(chars, chars + count)
71 );
72 }
73
74 template <typename Target>
75 inline Target lexical_cast(const unsigned char* chars, std::size_t count)
76 {
77 return ::boost::lexical_cast<Target>(
78 ::boost::iterator_range<const unsigned char*>(chars, chars + count)
79 );
80 }
81
82 template <typename Target>
83 inline Target lexical_cast(const signed char* chars, std::size_t count)
84 {
85 return ::boost::lexical_cast<Target>(
86 ::boost::iterator_range<const signed char*>(chars, chars + count)
87 );
88 }
89
90#ifndef BOOST_LCAST_NO_WCHAR_T
91 template <typename Target>
92 inline Target lexical_cast(const wchar_t* chars, std::size_t count)
93 {
94 return ::boost::lexical_cast<Target>(
95 ::boost::iterator_range<const wchar_t*>(chars, chars + count)
96 );
97 }
98#endif
99#ifndef BOOST_NO_CXX11_CHAR16_T
100 template <typename Target>
101 inline Target lexical_cast(const char16_t* chars, std::size_t count)
102 {
103 return ::boost::lexical_cast<Target>(
104 ::boost::iterator_range<const char16_t*>(chars, chars + count)
105 );
106 }
107#endif
108#ifndef BOOST_NO_CXX11_CHAR32_T
109 template <typename Target>
110 inline Target lexical_cast(const char32_t* chars, std::size_t count)
111 {
112 return ::boost::lexical_cast<Target>(
113 ::boost::iterator_range<const char32_t*>(chars, chars + count)
114 );
115 }
116#endif
117
118} // namespace boost
119
120#undef BOOST_LCAST_NO_WCHAR_T
121
122#endif // BOOST_LEXICAL_CAST_INCLUDED
123
124