permute_function.hpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*=============================================================================
  2. Copyright (c) 2001-2011 Joel de Guzman
  3. Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. =============================================================================*/
  6. #if !defined(SPIRIT_PERMUTE_FUNCTION_MARCH_13_2007_1129AM)
  7. #define SPIRIT_PERMUTE_FUNCTION_MARCH_13_2007_1129AM
  8. #if defined(_MSC_VER)
  9. #pragma once
  10. #endif
  11. #include <boost/spirit/home/support/unused.hpp>
  12. #include <boost/optional.hpp>
  13. namespace boost { namespace spirit { namespace qi { namespace detail
  14. {
  15. template <typename Iterator, typename Context, typename Skipper>
  16. struct permute_function
  17. {
  18. permute_function(
  19. Iterator& first_, Iterator const& last_
  20. , Context& context_, Skipper const& skipper_)
  21. : first(first_)
  22. , last(last_)
  23. , context(context_)
  24. , skipper(skipper_)
  25. {
  26. }
  27. template <typename Component, typename Attribute>
  28. bool operator()(Component const& component, Attribute& attr)
  29. {
  30. // return true if the parser succeeds and the slot is not yet taken
  31. if (!*taken && component.parse(first, last, context, skipper, attr))
  32. {
  33. *taken = true;
  34. ++taken;
  35. return true;
  36. }
  37. ++taken;
  38. return false;
  39. }
  40. template <typename Component>
  41. bool operator()(Component const& component)
  42. {
  43. // return true if the parser succeeds and the slot is not yet taken
  44. if (!*taken && component.parse(first, last, context, skipper, unused))
  45. {
  46. *taken = true;
  47. ++taken;
  48. return true;
  49. }
  50. ++taken;
  51. return false;
  52. }
  53. Iterator& first;
  54. Iterator const& last;
  55. Context& context;
  56. Skipper const& skipper;
  57. bool* taken;
  58. // silence MSVC warning C4512: assignment operator could not be generated
  59. BOOST_DELETED_FUNCTION(permute_function& operator= (permute_function const&))
  60. };
  61. }}}}
  62. #endif