string_traits.hpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /*=============================================================================
  2. Copyright (c) 2001-2014 Joel de Guzman
  3. Copyright (c) 2001-2011 Hartmut Kaiser
  4. Copyright (c) 2010 Bryce Lelbach
  5. Distributed under the Boost Software License, Version 1.0. (See accompanying
  6. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  7. ================================================_==============================*/
  8. #if !defined(BOOST_SPIRIT_X3_STRING_TRAITS_OCTOBER_2008_1252PM)
  9. #define BOOST_SPIRIT_X3_STRING_TRAITS_OCTOBER_2008_1252PM
  10. #include <string>
  11. #include <boost/mpl/bool.hpp>
  12. namespace boost { namespace spirit { namespace x3 { namespace traits
  13. {
  14. ///////////////////////////////////////////////////////////////////////////
  15. // Get the C string from a string
  16. ///////////////////////////////////////////////////////////////////////////
  17. template <typename String>
  18. struct extract_c_string;
  19. template <typename String>
  20. struct extract_c_string
  21. {
  22. template <typename T>
  23. static T const* call (T* str)
  24. {
  25. return (T const*)str;
  26. }
  27. template <typename T>
  28. static T const* call (T const* str)
  29. {
  30. return str;
  31. }
  32. };
  33. // Forwarder that strips const
  34. template <typename T>
  35. struct extract_c_string<T const>
  36. {
  37. static decltype(auto) call(T const str)
  38. {
  39. return extract_c_string<T>::call(str);
  40. }
  41. };
  42. // Forwarder that strips references
  43. template <typename T>
  44. struct extract_c_string<T&>
  45. {
  46. static decltype(auto) call(T& str)
  47. {
  48. return extract_c_string<T>::call(str);
  49. }
  50. };
  51. // Forwarder that strips const references
  52. template <typename T>
  53. struct extract_c_string<T const&>
  54. {
  55. static decltype(auto) call(T const& str)
  56. {
  57. return extract_c_string<T>::call(str);
  58. }
  59. };
  60. template <typename T, typename Traits, typename Allocator>
  61. struct extract_c_string<std::basic_string<T, Traits, Allocator> >
  62. {
  63. typedef std::basic_string<T, Traits, Allocator> string;
  64. static T const* call (string const& str)
  65. {
  66. return str.c_str();
  67. }
  68. };
  69. template <typename T>
  70. decltype(auto) get_c_string(T* str)
  71. {
  72. return extract_c_string<T*>::call(str);
  73. }
  74. template <typename T>
  75. decltype(auto) get_c_string(T const* str)
  76. {
  77. return extract_c_string<T const*>::call(str);
  78. }
  79. template <typename String>
  80. decltype(auto) get_c_string(String& str)
  81. {
  82. return extract_c_string<String>::call(str);
  83. }
  84. template <typename String>
  85. decltype(auto) get_c_string(String const& str)
  86. {
  87. return extract_c_string<String>::call(str);
  88. }
  89. ///////////////////////////////////////////////////////////////////////////
  90. // Get the begin/end iterators from a string
  91. ///////////////////////////////////////////////////////////////////////////
  92. // Implementation for C-style strings.
  93. template <typename T>
  94. inline T const* get_string_begin(T const* str) { return str; }
  95. template <typename T>
  96. inline T* get_string_begin(T* str) { return str; }
  97. template <typename T>
  98. inline T const* get_string_end(T const* str)
  99. {
  100. T const* last = str;
  101. while (*last)
  102. last++;
  103. return last;
  104. }
  105. template <typename T>
  106. inline T* get_string_end(T* str)
  107. {
  108. T* last = str;
  109. while (*last)
  110. last++;
  111. return last;
  112. }
  113. // Implementation for containers (includes basic_string).
  114. template <typename T, typename Str>
  115. inline typename Str::const_iterator get_string_begin(Str const& str)
  116. { return str.begin(); }
  117. template <typename T, typename Str>
  118. inline typename Str::iterator
  119. get_string_begin(Str& str)
  120. { return str.begin(); }
  121. template <typename T, typename Str>
  122. inline typename Str::const_iterator get_string_end(Str const& str)
  123. { return str.end(); }
  124. template <typename T, typename Str>
  125. inline typename Str::iterator
  126. get_string_end(Str& str)
  127. { return str.end(); }
  128. }}}}
  129. #endif