lexical_cast.hpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // Copyright Kevlin Henney, 2000-2005.
  2. // Copyright Alexander Nasonov, 2006-2010.
  3. // Copyright Antony Polukhin, 2011-2024.
  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. #ifndef BOOST_LEXICAL_CAST_INCLUDED
  18. #define BOOST_LEXICAL_CAST_INCLUDED
  19. #include <boost/config.hpp>
  20. #ifdef BOOST_HAS_PRAGMA_ONCE
  21. # pragma once
  22. #endif
  23. #if defined(BOOST_NO_STRINGSTREAM) || defined(BOOST_NO_STD_WSTRING)
  24. #define BOOST_LCAST_NO_WCHAR_T
  25. #endif
  26. #include <boost/lexical_cast/detail/buffer_view.hpp>
  27. #include <boost/lexical_cast/bad_lexical_cast.hpp>
  28. #include <boost/lexical_cast/try_lexical_convert.hpp>
  29. namespace boost
  30. {
  31. template <typename Target, typename Source>
  32. inline Target lexical_cast(const Source &arg)
  33. {
  34. Target result = Target();
  35. if (!boost::conversion::detail::try_lexical_convert(arg, result)) {
  36. boost::conversion::detail::throw_bad_cast<Source, Target>();
  37. }
  38. return result;
  39. }
  40. template <typename Target>
  41. inline Target lexical_cast(const char* chars, std::size_t count)
  42. {
  43. return ::boost::lexical_cast<Target>(
  44. ::boost::conversion::detail::make_buffer_view(chars, chars + count)
  45. );
  46. }
  47. template <typename Target>
  48. inline Target lexical_cast(const unsigned char* chars, std::size_t count)
  49. {
  50. return ::boost::lexical_cast<Target>(
  51. ::boost::conversion::detail::make_buffer_view(chars, chars + count)
  52. );
  53. }
  54. template <typename Target>
  55. inline Target lexical_cast(const signed char* chars, std::size_t count)
  56. {
  57. return ::boost::lexical_cast<Target>(
  58. ::boost::conversion::detail::make_buffer_view(chars, chars + count)
  59. );
  60. }
  61. #ifndef BOOST_LCAST_NO_WCHAR_T
  62. template <typename Target>
  63. inline Target lexical_cast(const wchar_t* chars, std::size_t count)
  64. {
  65. return ::boost::lexical_cast<Target>(
  66. ::boost::conversion::detail::make_buffer_view(chars, chars + count)
  67. );
  68. }
  69. #endif
  70. template <typename Target>
  71. inline Target lexical_cast(const char16_t* chars, std::size_t count)
  72. {
  73. return ::boost::lexical_cast<Target>(
  74. ::boost::conversion::detail::make_buffer_view(chars, chars + count)
  75. );
  76. }
  77. template <typename Target>
  78. inline Target lexical_cast(const char32_t* chars, std::size_t count)
  79. {
  80. return ::boost::lexical_cast<Target>(
  81. ::boost::conversion::detail::make_buffer_view(chars, chars + count)
  82. );
  83. }
  84. } // namespace boost
  85. #undef BOOST_LCAST_NO_WCHAR_T
  86. #endif // BOOST_LEXICAL_CAST_INCLUDED