Sacado Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Sacado_mpl_vector.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Sacado Package
4 //
5 // Copyright 2006 NTESS and the Sacado contributors.
6 // SPDX-License-Identifier: LGPL-2.1-or-later
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef SACADO_MPL_VECTOR_HPP
11 #define SACADO_MPL_VECTOR_HPP
12 
13 #include "Sacado_ConfigDefs.h"
14 
15 #include "Sacado_mpl_none.hpp"
16 #include "Sacado_mpl_size.hpp"
17 #include "Sacado_mpl_begin.hpp"
18 #include "Sacado_mpl_end.hpp"
19 #include "Sacado_mpl_next.hpp"
20 #include "Sacado_mpl_push_back.hpp"
21 #include "Sacado_mpl_at.hpp"
22 #include "Sacado_mpl_deref.hpp"
23 
24 // Specializations needed for various mpl operations
26 
27 namespace Sacado {
28 
29  namespace mpl {
30 
31  // vector tag for mpl operations
32  struct vector_tag {};
33 
34  // vector
35  template <typename... Args>
36  struct vector :
37  vector_size<Args...> {
38  typedef vector_tag tag;
39  typedef vector type;
40  };
41 
42  // iterator
43  template <class Vector, int Pos>
44  struct vector_iterator {
45  static const int value = Pos;
46  };
47 
48  // size
49  template <>
51  template <class Vector>
52  struct apply {
53  static const int value = Vector::sz;
54  };
55  };
56 
57  // begin
58  template <>
60  template <class Vector>
61  struct apply {
63  };
64  };
65 
66  // end
67  template <>
68  struct end_impl<vector_tag> {
69  template <class Vector>
70  struct apply {
72  };
73  };
74 
75  // next
76  template <class Vector, int Pos>
77  struct next< vector_iterator<Vector,Pos> > {
79  };
80 
81  // deref
82  template <class Vector, int Pos>
83  struct deref< vector_iterator<Vector,Pos> > : mpl::at<Vector,Pos> {};
84 
85  }
86 
87 }
88 
91 
92 namespace Sacado {
93  namespace mpl {
94 
95  // at
96  template <int Pos>
97  struct at_impl<vector_tag, Pos> {
98  template <class Vector>
99  struct apply : vector_at<Vector,Pos> {};
100  };
101 
102  // push_back
103  template <>
105  template <class Vector, class T>
106  struct apply : vector_push_back<Vector, T> {};
107  };
108 
109  }
110 }
111 
112 #endif
int value
vector_iterator< Vector, Vector::sz > type