Sacado Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
Sacado_mpl_range_c.hpp
Go to the documentation of this file.
1// @HEADER
2// ***********************************************************************
3//
4// Sacado Package
5// Copyright (2006) Sandia Corporation
6//
7// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8// the U.S. Government retains certain rights in this software.
9//
10// This library is free software; you can redistribute it and/or modify
11// it under the terms of the GNU Lesser General Public License as
12// published by the Free Software Foundation; either version 2.1 of the
13// License, or (at your option) any later version.
14//
15// This library is distributed in the hope that it will be useful, but
16// WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18// Lesser General Public License for more details.
19//
20// You should have received a copy of the GNU Lesser General Public
21// License along with this library; if not, write to the Free Software
22// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
23// USA
24// Questions? Contact David M. Gay (dmgay@sandia.gov) or Eric T. Phipps
25// (etphipp@sandia.gov).
26//
27// ***********************************************************************
28// @HEADER
29
30#ifndef SACADO_MPL_RANGE_C_HPP
31#define SACADO_MPL_RANGE_C_HPP
32
33#include "Sacado_mpl_none.hpp"
34#include "Sacado_mpl_size.hpp"
35#include "Sacado_mpl_begin.hpp"
36#include "Sacado_mpl_end.hpp"
37#include "Sacado_mpl_next.hpp"
38#include "Sacado_mpl_at.hpp"
39#include "Sacado_mpl_deref.hpp"
41
42namespace Sacado {
43
44 namespace mpl {
45
46 // range_c tag for mpl operations
47 struct range_c_tag {};
48
49 // range_c
50 template <class T, T N, T M, T Delta = 1>
51 struct range_c {
53 typedef range_c type;
54 static const int sz = (M-N+Delta-1)/Delta;
56 static const int start_value = N;
57 static const int end_value = M;
58 static const int step_value = Delta;
59 };
60
61 // iterator
62 template <class Range, int Pos>
64 static const int value = Pos;
65 };
66
67 // size
68 template <>
70 template <class Range>
71 struct apply {
72 static const int value = Range::sz;
73 };
74 };
75
76 // begin
77 template <>
79 template <class Range>
80 struct apply {
82 };
83 };
84
85 // end
86 template <>
88 template <class Range>
89 struct apply {
91 };
92 };
93
94 // next
95 template <class Range, int Pos>
96 struct next< range_c_iterator<Range,Pos> > {
98 };
99
100
101
102 // at
103 template <int Pos>
104 struct at_impl<range_c_tag, Pos> {
105 template <class Range>
106 struct apply {
107 typedef integral_c<typename Range::integral_type,
108 Range::start_value + Range::step_value*Pos> type;
109 };
110 };
111
112 // deref
113 template <class Range, int Pos>
114 struct deref< range_c_iterator<Range,Pos> > : mpl::at<Range,Pos> {};
115
116 }
117}
118
119#endif
#define T
Definition: Sacado_rad.hpp:573
const int N
int value
integral_c< typename Range::integral_type, Range::start_value+Range::step_value *Pos > type
range_c_iterator< Range, Range::sz > type
static const int end_value
static const int step_value
static const int start_value