lexical_cast.hpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // Copyright Kevlin Henney, 2000-2005.
  2. // Copyright Alexander Nasonov, 2006-2010.
  3. // Copyright Antony Polukhin, 2011-2019.
  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/range/iterator_range_core.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::iterator_range<const char*>(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::iterator_range<const unsigned char*>(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::iterator_range<const signed char*>(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::iterator_range<const wchar_t*>(chars, chars + count)
  67. );
  68. }
  69. #endif
  70. #ifndef BOOST_NO_CXX11_CHAR16_T
  71. template <typename Target>
  72. inline Target lexical_cast(const char16_t* chars, std::size_t count)
  73. {
  74. return ::boost::lexical_cast<Target>(
  75. ::boost::iterator_range<const char16_t*>(chars, chars + count)
  76. );
  77. }
  78. #endif
  79. #ifndef BOOST_NO_CXX11_CHAR32_T
  80. template <typename Target>
  81. inline Target lexical_cast(const char32_t* chars, std::size_t count)
  82. {
  83. return ::boost::lexical_cast<Target>(
  84. ::boost::iterator_range<const char32_t*>(chars, chars + count)
  85. );
  86. }
  87. #endif
  88. } // namespace boost
  89. #undef BOOST_LCAST_NO_WCHAR_T
  90. #endif // BOOST_LEXICAL_CAST_INCLUDED