Blame view

3rdparty/boost_1_81_0/boost/compute/functional/field.hpp 2.05 KB
63e88f80   Hu Chunming   提交三方库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
  //---------------------------------------------------------------------------//
  // Copyright (c) 2013 Kyle Lutz <kyle.r.lutz@gmail.com>
  //
  // Distributed under the Boost Software License, Version 1.0
  // See accompanying file LICENSE_1_0.txt or copy at
  // http://www.boost.org/LICENSE_1_0.txt
  //
  // See http://boostorg.github.com/compute for more information.
  //---------------------------------------------------------------------------//
  
  #ifndef BOOST_COMPUTE_FUNCTIONAL_FIELD_HPP
  #define BOOST_COMPUTE_FUNCTIONAL_FIELD_HPP
  
  #include <string>
  
  namespace boost {
  namespace compute {
  namespace detail {
  
  template<class T, class Arg>
  struct invoked_field
  {
      typedef T result_type;
  
      invoked_field(const Arg &arg, const std::string &field)
          : m_arg(arg),
            m_field(field)
      {
      }
  
      Arg m_arg;
      std::string m_field;
  };
  
  } // end detail namespace
  
  /// Returns the named field from a value.
  ///
  /// The template-type \c T specifies the field's value type. Note
  /// that the value type must match the actual type of the field
  /// otherwise runtime compilation or logic errors may occur.
  ///
  /// For example, to access the \c second field in a
  /// \c std::pair<int, float> object:
  /// \code
  /// field<float>("second");
  /// \endcode
  ///
  /// This can also be used with vector types to access individual
  /// components as well as perform swizzle operations.
  ///
  /// For example, to access the first and third components of an
  /// \c int vector type (e.g. \c int4):
  /// \code
  /// field<int2_>("xz");
  /// \endcode
  ///
  /// \see \ref get "get<N>"
  template<class T>
  class field
  {
  public:
      /// Result type.
      typedef T result_type;
  
      /// Creates a new field functor with \p field.
      field(const std::string &field)
          : m_field(field)
      {
      }
  
      /// \internal_
      template<class Arg>
      detail::invoked_field<T, Arg> operator()(const Arg &arg) const
      {
          return detail::invoked_field<T, Arg>(arg, m_field);
      }
  
  private:
      std::string m_field;
  };
  
  } // end compute namespace
  } // end boost namespace
  
  #endif // BOOST_COMPUTE_FUNCTIONAL_FIELD_HPP